ファイルを更新したら、転送したい。
php のプロジェクトってちまちま転送してると、面倒くさいんですよね。ファイル監視してrsync するのに、grunt とか持ち出すのも馬鹿馬鹿しい。
かといって、サーバーにログインしてvim で編集するとIDE使えないし、コーディング規約を守るに自動整形が使えない。かといって、SFTPアクセスでエディタで開いて編集するのもかったるい。
考えられる選択肢
- unison
- lsyncd
- rsync+fsevent ←今回もコレ
- sshfs(FUSE)
- drdb
- SFTP mirroring
- NFS ( 他に smb cifs afp WebDAV )
- dropbox ( 他に icloud google drive )
- git
他になんか有る?
選択肢 | 面倒なところ |
---|---|
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 は片方向で使うのには、面倒だと思う、特に設定ファイルとサーバー側導入が面倒くさい。