それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ファイルを更新したら同期したい。

ファイルを更新したら、転送したい。

php のプロジェクトってちまちま転送してると、面倒くさいんですよね。ファイル監視してrsync するのに、grunt とか持ち出すのも馬鹿馬鹿しい。

かといって、サーバーにログインしてvim で編集するとIDE使えないし、コーディング規約を守るに自動整形が使えない。かといって、SFTPアクセスでエディタで開いて編集するのもかったるい。

考えられる選択肢

他になんか有る?

選択肢 面倒なところ
unison バージョンを揃える }
lsyncd 設定ファイルとサーバ側への導入
sshfs 遅い, FUSE導入面倒くさい、オフラインで困る
NFS 認証と導入設定とメンテが面倒、ポートも面倒
dropbox アカウントと課金、同期遅い
git commit/push/push をfsevent でやると本末転倒

ファイル更新イベントでrsync起動

選択肢としてやっぱりこれしかないのかな。ファイル更新のイベント通知をOSから受け取って、更新されたファイルだけを転送したい。 すると、 ファイル更新イベント + rsync の組合せが楽チンで無難な選択肢になるわけです。

作った

python でファイル更新イベントを監視して、ファイル更新がきたら転送する

ruby で書いたけど、ruby ダメだ。python のwatchdog で書き直した。

IntelliJがファイル保存同時に .idea/ を更新するので IDEがファイル更新イベントを作りまくるのでイベント検出後数秒スリープしてその間のイベントを無視するようにした。これで ファイル更新されたあとの プリプロセッサでイベント拾いまくる事が簡単に防げると思う。

#!/usr/bin/env python3

import sys
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
from subprocess import Popen
import shlex
import time


class SyncUpload( PatternMatchingEventHandler ) :

    def __init__(self,*args, **kwargs):
        super(SyncUpload,self).__init__(*args,**kwargs)
        self.prcs = None

    def start(self, path ):
        self.watch_path  = path
        observer = Observer()
        observer.schedule( self, path, recursive=True )
        observer.start()

        try:
            observer.join()
        except KeyboardInterrupt:
            observer.stop()
        except:
            observer.stop()

    def on_any_event( self, evt ):
        if self.prcs and  self.prcs.poll() == None : # 実行中ならキャンセルする
            pass
        else:
            time.sleep(1)
            # cmd = "bash -c 'for  i in {1..3} ; do echo 1 ; sleep 1 ; done; ' "
            cmd = "rsync -avz  '%s'   server:path/to/dir/ " % self.watch_path
            self.prcs = Popen( shlex.split(cmd) )




if __name__ == '__main__':
    path = sys.argv[1] if len( sys.argv ) > 1 else './'

    obj = SyncUpload( ['*.php'] )
    obj.start( path )

過去に試した似たようなもの

.net + python

オレオレDropBoxをrsyncで作る。 - それマグで!

lsyncd

lsyncd を使ってWinSCP的なリアルタイム同期を実現する.使い方 - それマグで!

FUSE ssh

http://takuya-1st.hatenablog.jp/entry/20111118/1321594453

他にも unison があるけど、unison はバージョンを併せないと動作しないのでめっちゃ面倒くさい。

lsyncd は片方向で使うのには、面倒だと思う、特に設定ファイルとサーバー側導入が面倒くさい。