ruby - Rake - 仅复制更改的文件

标签 ruby file copy rake

所以我有一个如下所示的 rake 文件:

require 'fileutils'

task :copy do
  FileUtils.cp_r 'src', 'target'
end

我怎样才能:

  1. 仅复制已更改的文件?
  2. 使 :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/

相关文章:

ruby-on-rails - 使用 RackDAV 在 Rails 应用程序中公开 webdav 目录,我如何映射该目录以提供服务?

使用 gulp 将文件复制到多个目录

ruby-on-rails - Rails Controller 中是否有等同于 jQuery $(this) 的东西?

ruby - 在 Ruby 中概念化枚举器和惰性枚举器

javascript - JSON.parse 无法从字符串创建对象

c++ - 如何在 Qt 中将 TreeView 保存为 .csv 文件?

java - Camel 删除文件异常

bash - 删除bash中所有子目录中的所有临时文件(以〜结尾)

python - 如何在 Python 中制作二维数组的副本?

bash - 如何在目标路径中使用带有通配符 (*) 的 scp 进行复制?