我的规则与其他文件依赖关系一起出现问题。
请参阅以下最小示例:
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'
所以我的问题:当我有额外的支出时,是否有可能放弃明显的基于规则的依赖?
答案 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