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

问题描述 投票:1回答:1

我有一个规则与其他文件依赖项结合的问题。

请参阅以下最小示例:

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'

所以我的问题是:当我有其他依赖项时,是否有可能避免明显的基于规则的依赖?

rake rule
1个回答
0
投票

来自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
© www.soinside.com 2019 - 2024. All rights reserved.