Flutter開発のためのWindowsとmacの同期設定

普段使いはWindowsが慣れているからWindowsで開発したい。
でもiOSで困るからmacも使いたいって方にはこちらのやり方がオススメです。

コーディングは Windows、ビルドは mac

通常はWindowsかmacのどちらかで作業を行っていると思いますが、弊社では、コーディングは作業しやすいWindowsマシンにて行い、シミュレータ、実機確認、ビルドなどは mac にて行うようにしています。

iOS 対応の観点からも mac は必要なんですが、mac で開発はしたくない・・・みたいな、ね。

問題は、Windowsで書いたプログラムをmacに持っていくの?
gitでやりとりすんの?めんどくさそーって感じだと思いますので、ファイル保存を検出して自動的に同期する仕組みにしています。

mac との同期システムの設定

一般的には不要ですが、Windwosでコーディングしてmacで実行している関係で、同期する仕組みを用意します。

前提として rsync が使える必要があります。
詳しくは「Windows10でrsyncを使うためにCygwinをインストール」をご覧ください。

プロジェクトディレクトリの直下に次のように 「_scripts」 を作成します。

それぞれのファイルの中身を見ていきます。

_auto_sync.stop

「auto_sync.stop」が存在すると自動同期が終了します。
自動同期中 _auto_sync.stop を auto_sync.stop にリネームすることで自動同期を終了させます。

ファイルの中身は空っぽでOKです。

auto_sync.bat

このファイルをダブルクリックで実行することで自動同期が開始されます。

そのままコピペでOKです。特に変えるところはありません。

@echo off
echo "auto_syncを実行しています・・・"
powershell -NoProfile -ExecutionPolicy Unrestricted .\auto_sync.ps1
echo "終了しました"
pause > nul
exit

auto_sync.ps1

プロジェクトディレクトリ配下での変更を検出して、変更があれば auto_sync_to_mac.cmd を実行します。

そのままコピペでOKです。特に変えるところはありません。

# パス
$script_path = $MyInvocation.MyCommand.Path
$current_dir = Split-Path -Parent $script_path
$monitored_dir = Split-Path -Parent $current_dir
$stop_file = $current_dir + "\auto_sync.stop"
$stop_file_rename = $current_dir + "\_auto_sync.stop"

# ファイル監視
$w = New-Object System.IO.FileSystemWatcher
$w.Path = $monitored_dir
$w.Filter = "*.*"
$w.IncludeSubdirectories = 1
$w.NotifyFilter = [System.IO.NotifyFilters]::LastWrite

echo "終了するには auto_sync.stop を作成してください"
echo $monitored_dir

while(1){

    # 変更監視
    $result = $w.WaitForChanged([System.IO.WatcherChangeTypes]::All)

    # rsyncを実行する。
    .\auto_sync_to_mac.cmd

    # ストップファイルがあれば自動同期終了
    if (Test-Path $stop_file) {
        Rename-Item $stop_file -NewName $stop_file_rename
        break
    }
}

auto_sync_to_mac.cmd

同期処理を記述します。

PATH_SOURCE_MAIN
SET PATH_DIST

こちらの2つは変更が必要です。そのほかの部分は状況に応じて調整します。
考え方としては、実行時に自動生成される系のファイルは同期不要です。

@ECHO OFF
SETLOCAL
SET PATH=C:\cygwin64\bin;%PATH%

SET PATH_SOURCE_MAIN=/cygdrive/d/projects/aulta/my_app
SET PATH_DIST=takashi@192.168.11.1:/Users/takashi/app/aulta/my_app

echo "-------- windows to mac --------"
rsync -vrtD ^
  --update ^
  --delete ^
  --include=/lib/ ^
  --include=/lib/** ^
  --include=/android/ ^
  --include=/android/app/ ^
  --include=/android/app/build.gradle ^
  --include=/android/app/src/ ^
  --include=/android/app/src/main/ ^
  --include=/android/app/src/main/AndroidManifest.xml ^
  --include=/assets/ ^
  --include=/assets/** ^
  --include=/ios/ ^
  --include=/ios/Runner/ ^
  --include=/ios/Runner/Info.plist ^
  --include=/pubspec.yaml ^
  --include=/README.md ^
  --exclude=* ^
  %PATH_SOURCE_MAIN%/ %PATH_DIST%/

echo "-------- mac to windows --------"
rsync -vrtD ^
  --update ^
  --delete ^
  --include=/pubspec.yaml ^
  --exclude=* ^
  %PATH_DIST%/ %PATH_SOURCE_MAIN%/