Rake合成任务和文件日期检查

时间:2011-01-28 11:32:58

标签: ruby rake rakefile

我有一个Rakefile,我用它来从markdown生成HTML(并做一些与问题无关的其他东西。

我正在将源文件,.feature文件(在FileList DOCUMENTS中)生成的文件作为HTML生成到我的输出目录OUTPUT。我有一个htmlfile方法来汇编和编写我的HTML文件。

我正在尝试两种替代方案:

文件任务:

DOCUMENTS.each do |doc|
  file doc.pathmap("#{OUTPUT}/%X.html") => doc do |t|
    htmlfile t.name, RDiscount.new(F.read doc).to_html, t.name.pathmap('%n')
  end
end

带有规则的合成文件任务:

rule '.html' => proc {|html| html.pathmap("%{#{OUTPUT}/,}X.feature")} do |t|
  htmlfile t.name, RDiscount.new(F.read t.source).to_html, t.name.pathmap('%n')
end

我的理解是后一个选项将合成文件任务,并具有相同的净效果。但是我发现,如果我选择它,它不能应对增量构建,而第一个选项可以。

如果我构建,然后修改一个文件,然后运行rake --trace我得到以下内容:

使用合成任务:

** Invoke output/Module/Feature.html (first_time, not_needed)
** Invoke output/Module (not_needed)

使用显式文件任务:

** Invoke output/Module/Feature.html (first_time)
** Invoke output/Module (not_needed)
** Invoke Module/Feature.feature (first_time, not_needed)
** Execute output/Module/Feature.html

此选项显然正在检查源文件。我认为链接输出和源正是规则

1 个答案:

答案 0 :(得分:4)

(我认为将答案作为实际答案而不是评论是最有帮助的。见https://meta.stackexchange.com/questions/68507/what-to-do-if-you-find-the-answer-to-your-own-question

事实证明,如果你的Rakefile中有file outdoc => something,那么它将会破坏合成任务。如果您有这些输出文档的文件任务,它会添加到先决条件并且工作正常。这种做法很有意义;合成任务并不存在。

我还发现规则只适用于一个推理级别(http://onestepback.org/articles/buildingwithrake/rulelimitations.html),尽管这并不是答案。

修复:重新排列任务的先决条件,或使用显式文件任务。