読者です 読者をやめる 読者になる 読者になる

シアトルコンサルティング サービス開発ブログ

シアトルコンサルティング株式会社プロダクトソリューション事業部の開発ブログです

gruntからrsyncする(syncDestIgnoreExclの話)

grunt

satkakuです。

gruntからrsyncしたいなーと思ってたら、案の定既にあったので、grunt-rsyncを試してみました。


  • 使い方

とりあえずインストールします。

% npm install grunt-rsync

Gruntfile.jsを以下のように書きます。

module.exports = function(grunt){
  grunt.initConfig({
    rsync: {
      dist: {
        src: "./",
        dest: "~/hoge",
        host: "remote",
        recursive: true,
        syncDest: true,
        exclude:[ "test/*" ]
      }
    }
  });

  grunt.loadNpmTasks('grunt-rsync');
  grunt.registerTask('deploy', ['rsync']);
};

excludeには、同期に含めたくないファイルのパターンを記述します。
これで、後は以下のコマンドを実行すれば終了です。

% grunt deploy

簡単!




とはいえ、いきなりリモートにぶん投げるのは怖いので、dry-runで一覧だけ見たいところです。

module.exports = function(grunt){
  grunt.initConfig({
    rsync: {
      dist: {
        src: "./",
        dest: "~/hoge",
        host: "remote",
        recursive: true,
        syncDest: true,
        dryRun: true,
        exclude:[ "test/*" ]
      }
    }
  });

  grunt.loadNpmTasks('grunt-rsync');
  grunt.registerTask('deploy', ['rsync']);
};


dryRunを指定してあげれば、リモートとの差分を一覧で出してくれます。簡単!


……ですが、実際に吐き出されたrsyncのコマンドは以下となっています。

rsync ./ remote:~/hoge --rsh=ssh --recursive --delete --delete-excluded --dry-run --verbose --exclude=test/*

delete-excludedがついちゃっています。delete-excludedが指定されていると、excludeで指定しているものについても、リモート上にあれば削除してしまいます。
例えば、ログファイルなど、リモートに同期したくないファイルをexcludeで指定していても、delete-excludedがついていることによりリモート上のファイルが消えてしまう結果になってしまいます。これは困る。

どうしようと思ってREADMEを見てみると、細かいオプションはrsyncwrapper使ってるから、そっちのドキュメント見てね、と書いてあります。

ということでrsyncwrapperを見てみると、syncDestIgnoreExclというオプションを使えばそんな感じのことが出来そうです。

これだ! と早速試してみますが、うまく行きません。何故? と思って、grunt-rsyncの中にあるnode_modulesを見てみると、中にあるrsyncwrapperのバージョンが0.0.12となっています。GitHubのコミットログを見ると、syncDestIgnoreExclが追加されたのはその後……!



##################################



ということで、grunt-rsyncのところで、npm installをして、rsyncwrapperを最新の0.0.13にします。
これで行けるはず!

module.exports = function(grunt){
  grunt.initConfig({
    rsync: {
      dist: {
        src: "./",
        dest: "~/hoge",
        host: "remote",
        recursive: true,
        syncDestIgnoreExcl: true,
        dryRun: true,
        exclude:[ "test/*" ]
      }
    }
  });

  grunt.loadNpmTasks('grunt-rsync');
  grunt.registerTask('deploy', ['rsync']);
};
rsync ./ remote:~/hoge --rsh=ssh --recursive --delete --dry-run --verbose --exclude=test/*

消えた! これで、ログファイルなどに関しても同期に含めないようにしつつ、リモートのファイルも削除しないように出来ました。

めでたし。