在我看来,有人添加了这个,以便您可以在 Rake 中构建一些 order_only 命令,但没有将对此的支持添加到内置文件命令中。它确实将 order_only 先决条件存储在任务中的单独成员变量中,因此您可以制作自己的 FileTask 版本,该版本将像 GNU Make 的仅订单先决条件一样工作。这是一个示例 Rakefile:
class OrderOnlyFileTask < Rake::FileTask
def out_of_date?(stamp)
all_regular_prerequisite_tasks.any? { |prereq|
prereq_task = application[prereq, @scope]
if prereq_task.instance_of?(Rake::FileTask)
prereq_task.timestamp > stamp || @application.options.build_all
else
prereq_task.timestamp > stamp
end
}
end
def all_regular_prerequisite_tasks
seen = {}
collect_regular_prerequisites(seen)
seen.values
end
def collect_regular_prerequisites(seen)
regular_prerequisite_tasks.each do |pre|
next if seen[pre.name]
seen[pre.name] = pre
pre.collect_prerequisites(seen)
end
end
def regular_prerequisite_tasks
prerequisites.map { |pre| lookup_prerequisite(pre) }
end
end
file 'foo/created.txt' do
mkdir 'foo'
touch 'foo/created.txt'
end
file 'source.txt' do
touch 'source.txt'
end
OrderOnlyFileTask.define_task('foo/built.txt' => ['source.txt'], order_only: ['foo/created.txt']) do
touch 'foo/built.txt'
end
task :build => 'foo/built.txt' do
puts 'build'
end
如果我从头开始运行rake build,我会得到以下输出:
% rake build
touch source.txt
mkdir foo
touch foo/created.txt
touch foo/built.txt
build
如果我再次运行它:
% rake build
build
如果我更新 foo/created.txt 上的 mtime:
% touch foo/created.txt
% rake build
build
如果我修改源文件:
% touch source.txt
% rake build
touch foo/built.txt
build
如果我删除 foo 目录:
% rm -rf foo
% rake build
mkdir foo
touch foo/created.txt
touch foo/built.txt
build
如果您将 OrderOnlyFileTask 更改为 foo/created.txt 的常规先决条件,如下所示:
OrderOnlyFileTask.define_task('foo/built.txt' => ['source.txt', 'foo/created.txt']) do
touch 'foo/built.txt'
end
然后当 foo/created.txt 被触摸时你会得到不同的行为:
% touch foo/created.txt
% rake build
touch foo/built.txt
build
我在这里将依赖项设为文件 (foo/created.txt) 而不是 GNU Make 示例中的目录,因为 Rake 中的目录任务不会像 make 中的目录依赖项那样检查目录的 mtime。
因此,使用任务的 order_only 选项,您可以构建自己的 Rake 任务,在决定是否执行时以不同的方式处理 order_only 先决条件。你只需要在你的任务中定义needed? 来处理你想要的先决条件。我在 OrderOnlyFileTask 中放置的所有这些方法都是更改 FileTask 中的 needed? 方法以忽略 order_only 先决条件。