目前我正在尝试拆分我的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
操作未加载。
答案 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是否已成功加载您的任务。