2012-04-26 27 views
2

所以我有一個耙文件類似如下:耙 - 僅複製更改的文件

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 

我想,如果合理可行,只有紅寶石/耙做到這一點。這也有點照顧第二個問題,因爲rsync不會做任何事情,如果沒有文件已經改變,但我希望耙子任務,如果可能的話,根本不執行。

回答

3

爲了避免執行任務,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在本地文件系統上速度非常快,每次運行它都沒什麼大不了的。

+0

似乎rubyrake.org不再有耙文件;我相信正確的鏈接是:http://www.virtuouscode.com/2014/04/23/rake-part-3-rules/(來自https://ruby.github.io/rake/)。 – 2017-10-03 15:52:24

0

這裏的解決方案是獨立的OS和純Ruby

class File 
    def self.update(src, dst) 
    if File.exist? dst 
     # skip if src file modification or creation time is same or earlier than target 
     return if [File.ctime(src), File.mtime(src)].max <= [File.ctime(dst), File.mtime(dst)].max 
    else 
     # create target folder if not present 
     FileUtils.mkdir_p(File.dirname(dst)) unless File.exist? File.dirname(dst) 
    end 
    FileUtils.cp(src, dst) 
    puts src 
    rescue => e 
    puts "#{e}\n#{e.backtrace}" 
    end 
end 

File.update source_file, target_file