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

Ruby Rake合成任务和文件日期检查,ruby,rake,rakefile,Ruby,Rake,Rakefile,我有一个Rakefile,我用它从降价生成HTML,然后做一些与问题无关的事情 我正在从文件列表文档中的源文件、.feature文件生成文件,并将其作为HTML输出到输出目录中。我有一个htmlfile方法来组装和编写我的HTML文件 我在这里尝试两种选择: 文件任务: DOCUMENTS.each do |doc| file doc.pathmap("#{OUTPUT}/%X.html") => doc do |t| htmlfile t.name, RDiscount.ne

我有一个Rakefile,我用它从降价生成HTML,然后做一些与问题无关的事情

我正在从文件列表文档中的源文件、.feature文件生成文件,并将其作为HTML输出到输出目录中。我有一个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
** 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
使用规则合成文件任务:

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)
使用显式文件任务:

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
** 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

此选项显然是在检查源文件。我认为将输出和源链接起来正是规则我认为将答案作为实际答案而不是评论最有帮助。看

事实证明,如果您在Rakefile的其他地方有文件outdoc=>之类的东西,那么它会干扰合成任务。然而,如果您有这些输出文档的文件任务,它会添加到先决条件中,并且工作正常。这是有道理的;合成任务实际上并不存在

我还发现规则只适用于一个推理层次,尽管这并不是答案


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

我认为将答案作为实际答案而不是注释最有帮助。看

事实证明,如果您在Rakefile的其他地方有文件outdoc=>之类的东西,那么它会干扰合成任务。然而,如果您有这些输出文档的文件任务,它会添加到先决条件中,并且工作正常。这是有道理的;合成任务实际上并不存在

我还发现规则只适用于一个推理层次,尽管这并不是答案

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