文件不存在时Rake clean raise错误

时间:2011-12-22 05:22:21

标签: ruby rake

我有一个像这样的Rakefile

task :clean do
  sh 'rm ./foo'
end

我希望防止它在文件'foo'不存在时报告错误。怎么做?

我认为我想要的是:有没有办法首先检查文件,然后决定下一步该做什么。

例如:

file 'aaa' => 'bbb' do
  sh 'cp bbb aaa'
end

此任务取决于文件'bbb'的存在,所以我想知道can I tell Rake that my task depends on the 不存在 of file 'foo'

3 个答案:

答案 0 :(得分:4)

你可以通过扩展rake来做到这一点:

Rake文件:

require File.join(File.dirname(__FILE__), 'unfile_rake_ext')

unfile 'target.txt' do
  File.delete('target.txt')
end

unfile_rake_ext.rb:

class UnFileTask < Rake::FileTask
  def needed?
    File.exist?(name)
  end
end

def unfile(*args, &block)
  UnFileTask.define_task(*args, &block)
end

我的控制台输出:

D:\Projects\ZPersonal\tmp>ls
Rakefile  unfile_rake_ext.rb

D:\Projects\ZPersonal\tmp>touch target.txt && ls
Rakefile  target.txt  unfile_rake_ext.rb

D:\Projects\ZPersonal\tmp>rake target.txt --trace
** Invoke target.txt (first_time)
** Execute target.txt

D:\Projects\ZPersonal\tmp>ls
Rakefile  unfile_rake_ext.rb

D:\Projects\ZPersonal\tmp>rake target.txt --trace
** Invoke target.txt (first_time, not_needed)

D:\Projects\ZPersonal\tmp>ls
Rakefile  unfile_rake_ext.rb

希望这有帮助。

答案 1 :(得分:2)

在你的rakefile中:

task :clean do
  rm 'foo' if File.exists? 'foo'
end

file 'aaa' => ['bbb', :clean] do |t|
  cp t.prerequisites[0], t.name
end

现在在命令行:

echo 'test' > bbb
rake aaa
    => cp bbb aaa

touch foo
rake aaa
    => rm foo
    => cp bbb aaa

答案 2 :(得分:1)

这个怎么样?

if File.exists? './foo/'
  sh 'rm -f ./foo'
end