当文件已存在时,rake执行文件任务

时间:2016-06-28 02:49:09

标签: rake

我有一个rakefile,即使已经构建了感兴趣的文件,也会执行一些(但不是全部)文件任务。令人沮丧的是,将我的rake文件削减到MWE可以解决问题 - 即使我没有改变任何文件任务定义,文件的选择方式,依赖关系或其他任何内容。似乎只是从rakefile中删除其他(文件)任务可以解决问题。

我意识到这是一个非常糟糕的问题,但是有没有人对这里可能发生的事情有所了解?我发布了示例代码,但我的MWE按预期工作,我对完整rake文件中导致问题的原因没有任何意义。我能想到的就是证明我的MWE实际上是完整的Rakefile的摘录,没有改变......

➜  solutionmaps cat mwe/Rakefile|sed '/^$/d'|tee a
require 'rake'
require 'rake/clean'
require 'pathname'
HOME = ENV['HOME']
SHARED_ATLAS = "#{HOME}/MRI/Manchester/data/CommonBrains/MNI_EPI_funcRes.nii"
TXT = Rake::FileList["txt/nodestrength/??.mni"]
AFNI_RAW = TXT.pathmap("afni/nodestrength/%n_raw+tlrc.HEAD")
AFNI_RAW.zip(TXT).each do |target,source|
  file target => [source] do
    sh("3dUndump -master #{SHARED_ATLAS} -xyz -datum float -prefix #{target.sub("+tlrc.HEAD","")} #{source}")
  end
  CLOBBER.push(target)
  CLOBBER.push(target.sub(".HEAD",".BRIK"))
  CLOBBER.push(target.sub(".HEAD",".BRIK.gz"))
end

➜  solutionmaps perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/'  Rakefile mwe/Rakefile|sed '/^$/d'|tee b
require 'rake'
require 'rake/clean'
require 'pathname'
HOME = ENV['HOME']
SHARED_ATLAS = "#{HOME}/MRI/Manchester/data/CommonBrains/MNI_EPI_funcRes.nii"
TXT = Rake::FileList["txt/nodestrength/??.mni"]
AFNI_RAW = TXT.pathmap("afni/nodestrength/%n_raw+tlrc.HEAD")
AFNI_RAW.zip(TXT).each do |target,source|
  file target => [source] do
    sh("3dUndump -master #{SHARED_ATLAS} -xyz -datum float -prefix #{target.sub("+tlrc.HEAD","")} #{source}")
  end
  CLOBBER.push(target)
  CLOBBER.push(target.sub(".HEAD",".BRIK"))
  CLOBBER.push(target.sub(".HEAD",".BRIK.gz"))
end

➜  solutionmaps diff a b
➜  solutionmaps 

我的mwe按预期工作(也就是说,它不执行文件任务)。

➜  mwe rake --trace --dry-run afni/nodestrength/02_raw+tlrc.HEAD
** Invoke afni/nodestrength/02_raw+tlrc.HEAD (first_time, not_needed)
** Invoke txt/nodestrength/02.mni (first_time, not_needed)

但是完整的rakefile没有。

rake --trace --dry-run afni/nodestrength/02_raw+tlrc.HEAD
** Invoke afni/nodestrength/02_raw+tlrc.HEAD (first_time)
** Invoke txt/nodestrength/02.mni (first_time, not_needed)
** Execute (dry run) afni/nodestrength/02_raw+tlrc.HEAD

➜  solutionmaps ls afni/nodestrength/02_raw+tlrc.HEAD
afni/nodestrength/02_raw+tlrc.HEAD

1 个答案:

答案 0 :(得分:0)

最后发生了一个可能的答案:

  

如果文件不存在或者任何先决条件文件任务是较新的,Rake确定需要运行文件任务。

引自:http://madewithenvy.com/ecosystem/articles/2013/rake-file-tasks/

由于我的Rakefiles正在大量开发,而且我的Filetasks都非常相互关联,这可能就是为什么我的Rakefile总是想要重建所有东西。