加载rake文件并从其他文件运行任务

时间:2012-12-07 11:26:50

标签: rake rakefile

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

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

Rake :: Task ...中的已注释app: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操作未加载。

3 个答案:

答案 0 :(得分:47)

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

Rake.add_rakelib 'lib/tasks'

答案 1 :(得分:37)

如果您的目标是从外部文件加载rake任务,那么您可以按照以下方式执行此操作。首先,假设您在名为<project>/lib/tasks/hello.rake的文件中有一个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或您喜欢的任何内容,但即使在非Rails项目中我也更喜欢lib/tasks。我还倾向于根据命名空间分离我的任务文件。

答案 2 :(得分:4)

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

示例文件:

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