2

だから私は次のような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

可能であれば、ルビー/レーキだけでこれを行いたいと思います。ファイルが変更されていない場合は何も実行されないため、これも2番目の質問をある程度rsync処理しますが、可能であればrakeタスクをまったく実行しないようにします。

4

2 に答える 2

3

タスクの実行を回避するには、Rakeはターゲットとソースの両方、およびソースからターゲットを作成するためにタスクを実行するかどうかを決定するためのルールを知っている必要があります。

通常、これはルールが「時間変更」されます。つまり、ソースがターゲットよりも新しい場合、Rakeがタスクを実行します。これを変更するには、ソースの依存関係としてProcを指定します。http://docs.rubyrake.org/user_guide/chapter03.htmlの「AdvancedRules」を参照してください(ただし、何が起こっているのかを理解するには、ある程度の実験が必要です)。

したがって、タスクはターゲットに依存する必要があります。ターゲットが存在しないことがわかっている場合は、簡単なはずです。

task :copy => 'target/' do
  sh 'rsync -ru src/ target'  # trailing slash is significant; target will be created
done

ターゲットがすでに存在する場合、それははるかに複雑になります。すべてのファイルにルールを定義することもできますが、率直に言って、rsyncを実行してそれで完了します。Rsyncはローカルファイルシステムで非常に高速であり、毎回実行することは大したことではありません。

于 2012-05-21T10:40:24.453 に答える
1

ここに、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
于 2016-04-19T15:00:53.113 に答える