我希望我的项目顶级Rakefile使用树中更深的rakefiles来构建东西;即顶级rakefile说明如何构建项目(大图),而较低级别的rakefile构建一个特定模块(本地图片)。
当然,只要可以在任务之间共享,就可以使用共享的一组配置来完成这些操作:因此,主要是关于保持对需要构建的描述,尽可能接近正在构建的源。例如。应使用/ Source / Module / Rakefile中的指令构建/Source/Module/code.foo和cie;和/ Rakefile理解模块之间的依赖关系。
我不关心它是否使用多个rake进程(ala recursive make),或者只是创建单独的构建环境。无论哪种方式,它都应该是可自包含的,以便由队列处理:这样可以同时构建非依赖模块。
问题是,你是如何用Rake实际做那样的事情的?我无法在互联网上找到任何有意义的东西,也没有在文档中找到。我尝试创建一个新的Rake :: Application对象并进行设置,但无论我尝试调用什么methods,只会抛出异常或“不知道如何构建任务':default'”错误。 (是的,所有rakefiles都有:default)。显然,人们可以在子目录中为:modulename任务执行'rake',但这会丢弃给予顶级的选项;例如想到$(MAKE)和$(MAKEFLAGS)。
任何人都知道如何正确地执行像recursive
rake这样的事情吗?
答案 0 :(得分:3)
您可以require
从其他rake文件中搜索文件并从所需文件中运行任务。
把它放在rakefile.rb中:
require 'foo/rakefile.rb'
task :default => [:bar]
把它放在foo / rakefile.rb中:
task :bar do
puts "baz"
end
运行根级别rakefile,它会将“baz”打印到屏幕上。你应该能够组织你的rake文件和公共代码,但是你想要使用这个想法
答案 1 :(得分:2)
正如我在之前的帖子中所提到的,这里的代码片段几乎支持递归rake行为,包括选项传递,干运行,跟踪,顶级任务。
耙:
#!/usr/bin/env ruby
begin
require 'rubygems'
gem 'rake'
rescue LoadError
end
$sub_directories = []
$top_level_task_provided__skip_subdir = 0
module Rake
REDUCE_COMPAT = true if ARGV.include?("--reduce-compat")
RAKE_OPTS = ARGV.clone.join(" ")
module DSL
def subdirs dirs
puts "DIRS: #{dirs}"
$sub_directories = dirs
end
end
end
require 'rake'
Rake.application.standard_exception_handling do
Rake.application.init
$top_level_task_provided__skip_subdir = 1 if Rake.application.top_level_tasks.size >= 1 and Rake.application.top_level_tasks[0] != "default"
Rake.application.load_rakefile
if Rake.application.tasks.size == 0 and $sub_directories.size != 0 then
desc "Default task when only subdirs is present in a rakefile"
task :default do
puts "Default subdir task"
end
end
Rake.application.top_level
end
if $top_level_task_provided__skip_subdir == 0 then
$sub_directories.each do |d|
unless rake_system("cd #{d} && pwd && ruby #{File.expand_path $0} #{Rake::RAKE_OPTS}") then
exit(1)
end
end
end
答案 2 :(得分:0)
如果我理解你的问题是你需要从另一个RakeFile中的另一个Rake任务中调用Rake任务。
您可以按照需要的方式在/ Source / Module / Rakefile中构建所需的任务,并在/ Rakefile中创建另一个Rakefile并以此方式运行任务。
desc 'Description'
task :foo do
%x[rake -f /Source/Module/RakeFile foo:bar]
end
-f 让您定义Rakefile的位置
您还可以使用-R。
指定rakelib文件夹的位置rake -f /path/to/Rakefile -R /path/to/rakelib foo:bar
我希望这会对你有所帮助。
答案 3 :(得分:0)
我也有类似的要求,并创建了以下功能
rakeutils.rb:
def subdirs dirs
dirs.each do |d|
task d do |t|
sh("cd #{t.name} && pwd && rake")
end
end
task :default => dirs
end
在Rakefiles中,无论我想拥有此功能,我只需要包含它...例如
Rake文件:
require 'rakeutils'
task :test1 do
puts "Hi"
end
task :default => :test1
subdirs ["ab", "cd"]
关于选项,我没有找到任何自动传递方式...除了编辑“rake”并在rake的选项处理消耗之前捕获选项