我有一个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
此选项显然正在检查源文件。我认为链接输出和源正是规则
答案 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),尽管这并不是答案。
修复:重新排列任务的先决条件,或使用显式文件任务。