2008-09-18 77 views
4

我最近开始使用Rake构建一些我的(非红宝石)包。 Rake很好,但我发现缺少的是一种分层构建(在子目录中聚集Rakefiles)的方法。由于这是大多数其他构建工具的常见功能,所以我想知道是否有人更熟悉Rake有一个好的解决方案。如何用rake做分层构建?

回答

2

我会为非Ruby构建任务推荐Buildr。它基于Rake(位于它的顶部,允许您使用Rake的所有功能),但更符合编译语言的语义。它也支持分层构建。

1

我也想不出办法做到这一点。我结束了:

SUBDIR = "subdir" 
task :subtask => SRC_FILES do |t| 
    chdir(SUBDIR) do 
     system("rake") 
    end 
end 

task :subtaskclean do |t| 
    chdir(SUBDIR) do 
     system("rake clean") 
    end 
end 

task :subtaskclean do |t| 
    chdir(SUBDIR) do 
     system("rake clobber") 
    end 
end 

task :default => [:maintask, :subtask] 
task :clean => :subtaskclean 
task :clobber => :subtaskclobber 

有点烂。其实,真的很糟糕。我走遍了文档,但没有找到的<antcall>

我敢肯定,因为这一切都Ruby和我勉强了解Ruby还有的require荷兰国际集团,或一些东西超明显的方式等同。

+0

红宝石需求不起作用,因为它不会改变工作目录。我一直没能找到任何支持这种递归行为的ruby原语。 – 2015-05-01 22:37:49

1

Buildr使用范围的概念,再加上项目的名称。

Rake.application.current_scope应该是发现如何使用它们的入口点。我希望这有帮助。

0

我用来解决这个问题的解决方法是:

Dir.chdir(File.dirname(Rake.application.rakefile)) 

此语句在除了根层级层层运行,在每个Rake文件的开始。这是如何缩短的例子工程实践:

/Rake文件:

task :default do 
    sh "rake -f component/rakefile" 
end 

/组件/ Rake文件

Dir.chdir(File.dirname(Rake.application.rakefile)) 

task :binary => OBJECTS do 
    sh "gcC#{SOURCES} -Iinclude -o #{TARGET}" 
end 

由于我是新来耙,我不相信这是最干净的解决它的方法,但它是我最终如何运作的。