rake:定义另一个依赖项时丢失了规则依赖性

时间:2018-03-19 17:51:05

标签: rake rule

我的规则与其他文件依赖关系一起出现问题。

请参阅以下最小示例:

require 'rake'

rule '.tex' do |tsk|
  puts "Create %s" % tsk.name
end
rule '.pdf' => '.tex' do |tsk|
  puts 'Create %s' % tsk.name
end

#~ file 'test.pdf' => 'include.tex'

task :default => 'test.pdf'

如果我检查一下动作,一切正常:

rake -n
** Invoke default (first_time)
** Invoke test.pdf (first_time)
** Invoke test.tex (first_time)
** Execute (dry run) test.tex
** Execute (dry run) test.pdf
** Execute (dry run) default

test.pdf取决于test.tex,一切都正常(而不是puts - 我将定义'真实'动作的语句。

但如果我取消注释file 'test.pdf' => 'include.tex',那么我会得到以下结果:

rake -n
** Invoke default (first_time)
** Invoke test.pdf (first_time)
** Invoke include.tex (first_time)
** Execute (dry run) include.tex
** Execute (dry run) test.pdf
** Execute (dry run) default

test.pdf取决于include.tex(正确),但规则的依赖性将丢失。

要运行我的示例,我必须定义一个依赖项file 'test.pdf' => 'test.tex' - 但该规则应该已经由规则定义:

require 'rake'

file 'test.tex' do |tsk|
  puts "Create %s" % tsk.name
end
file 'include.tex' do |tsk|
  puts "Create %s" % tsk.name
end

rule '.pdf' => '.tex' do |tsk|
  puts 'Create %s' % tsk.name
end

file 'test.pdf' => 'test.tex'
file 'test.pdf' => 'include.tex'

task :default => 'test.pdf'

所以我的问题:当我有额外的支出时,是否有可能放弃明显的基于规则的依赖?

1 个答案:

答案 0 :(得分:0)

来自documentation(重点是我):

  

规则

     

将文件命名为先决条件时,但没有为其定义文件任务,Rake会通过查看Rakefile中提供的规则列表来尝试合成任务。 / p>

因此,看来DSL不支持这种情况。

但是,有一种方法Rake::Application#enhance_with_matching_rule可以将前提条件和动作从规则添加到任务中。您可以在实例上调用该方法并提供文件名:

require 'rake'

rule '.tex' do |tsk|
  puts "Create %s" % tsk.name
end
rule '.pdf' => '.tex' do |tsk|
  puts 'Create %s' % tsk.name
end

file 'test.pdf' => 'include.tex'
Rake.application.enhance_with_matching_rule('test.pdf')

task :default => 'test.pdf'

我不确定这是否有所改善,但似乎可以奏效:

$ rake -n
** Invoke default (first_time)
** Invoke test.pdf (first_time)
** Invoke include.tex (first_time)
** Execute (dry run) include.tex
** Invoke test.tex (first_time)
** Execute (dry run) test.tex
** Execute (dry run) test.pdf
** Execute (dry run) default