我有一个像这样的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'
?
答案 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