所以我有一个如下所示的 rake 文件:
require 'fileutils'
task :copy do
FileUtils.cp_r 'src', 'target'
end
我怎样才能:
- 仅复制已更改的文件?
- 使
:copy
任务依赖于src
目录,以便仅在需要时启动?:copy => 'src'
和:copy => FileList['src/*'].to_a
似乎不起作用。
我可以这样解决第一个问题:
task :copy do
sh 'rsync -ru src/* target'
end
如果可能的话,我想仅使用 ruby/rake 来完成此操作。这也在某种程度上解决了第二个问题,因为如果没有文件发生更改,rsync
将不会执行任何操作,但我希望 rake 任务根本不执行,如果有可能。
最佳答案
为了避免执行任务,Rake需要知道目标和源以及确定是否执行任务的规则,以便从源创建目标。
通常该规则是“时间修改的”,即如果源比目标新,则 Rake 将运行该任务。您可以通过提供 Proc 作为源依赖项来修改它。请参阅http://docs.rubyrake.org/user_guide/chapter03.html在“高级规则”下(但确实需要一些实验才能了解正在发生的事情!)。
所以你的任务必须取决于目标。如果您知道目标不存在,那么应该很容易:
task :copy => 'target/' do
sh 'rsync -ru src/ target' # trailing slash is significant; target will be created
done
如果目标已经存在,事情就会变得更加复杂。您可以为每个文件定义一个规则,但坦率地说,我只是运行 rsync 并完成它。 Rsync 在本地文件系统上非常快,每次运行它没什么大不了的。
关于ruby - Rake - 仅复制更改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341160/