我有一个规则与其他文件依赖项结合的问题。
请参阅以下最小示例:
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'
所以我的问题是:当我有其他依赖项时,是否有可能避免明显的基于规则的依赖?
来自documentation(强调我的):
规则
当文件被命名为先决条件但没有为其定义文件任务时,Rake将尝试通过查看Rakefile中提供的规则列表来合成任务。
因此,似乎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