37

目前我正在尝试拆分我的 rake 文件以更好地组织它们。为此,我在rake我的目录中添加了一个文件夹assets,该文件夹为每组任务保存一个 rake 文件。

由于我来自 PHP,我只有非常基本的 Ruby/Rake 知识,并且无法在加载文件后运行我的命名空间默认操作。

内部注释掉的Rake :: Task ...-stringapp:init在我的 CL 处引发错误:

rake aborted! 
uninitialized constant TASK

这是命名空间/类(如果这是正确的词)。

task :default => [ 'app:init' ]
namespace :app do

    rake_dir   = "#{Dir.pwd}/assets/rake/"
    rake_files = FileList.new( "#{rake_dir}*" )

    desc "Loads rake modules (Default action)"
    task :init do
        puts "\t Importing rake files for processing"

        puts "\t loading..."
        rake_files.each() { |rake|
            puts "\t #{rake}"
            require rake
            # @link rubular.com
            name = rake.split( rake_dir ).last.gsub( /.rb\z/, '' )
            puts "\t #{name}"
            #Rake :: Task[ "#{name}:default" ].invoke
        }
    end
end

提前致谢。

编辑:至少,我可以确定文件已加载,因为puts "file loaded"这些文件开头的纯文本得到了回显。问题似乎只是加载的 rake 文件中命名空间的:default操作未加载。

4

3 回答 3

64

您可以将任务放入默认加载的文件rakelib/rake中,也可以通过以下方式添加特定文件夹Rakefile

Rake.add_rakelib 'lib/tasks'
于 2015-02-06T09:05:58.293 回答
40

如果您的目标是从外部文件加载 rake 任务,那么您可以执行以下操作。首先,假设您在一个名为的文件中有一个 rake 任务,<project>/lib/tasks/hello.rake如下所示:

desc "Say hello"
task :hello do 
  puts "Hello World!"
end

Rakefile然后你可以在你的目录中创建一个简单的<project>来加载它,如下所示:

Dir.glob('lib/tasks/*.rake').each { |r| load r}

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end

当然,这将加载所有以rake扩展名结尾的文件。您可以像这样简单地加载hello.rake

load './lib/tasks/hello.rake'

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end

要查看所有已加载的任务,请使用rake -T. 请注意,我使用lib/tasks的是 Rails 应用程序采用的标准方法。你可以使用assets或任何你喜欢的东西,尽管我更喜欢lib/tasks在非 Rails 项目中。我也倾向于根据它们的命名空间来分离我的任务文件。

于 2013-05-27T22:35:37.293 回答
5

Rake.add_rakelib 'tasks'正如@splattael 所说,您可以随时使用。你需要知道的一件事,'tasks'目录中的文件需要有'.rake'而不是'.rb'的扩展名,否则,rake不会为你加载它。

示例文件:

完成上述所有操作后,使用rake -T来检查您的作业,以查看 rake 是否已成功加载您的任务。

于 2016-01-04T10:15:36.517 回答