Unity Cloud Build でsubmodule + symbolic linkを使う
Unity Cloud Build で シンボリックリンクを使うための方法を調べたのでメモ。
マルチデバイス向けのUnity開発プロジェクトや、メインプロジェクト内で、他のリポジトリの特定のフォルダ/ライブラリのみを利用したい場合、submodule と symbolic linkをよく利用します。
ローカル環境ではClone時に symbolic link 生成用のバッチ/shellを手動で実行すれば良いですが、Unity Cloud Build で利用する場合、そこも自動化する必要があります。
1. リポジトリ構成例
[Repository root] ├───Assets ├───Packages ├───ProjectSettings ├───_external │ └───SUB_REPO1 │ ├───Assets │ │ │ Scripts.meta │ │ │ │ │ └───Scripts │ ├───Packages │ └───ProjectSettings └───_tools ProjectGenerate.sh ProjectGenerate.bat
- _external/SUB_REPO1/ に 別のProjectをgit submoduleとして登録している
- _external/SUB_REPO1/Assets/Scripts/フォルダを メインの root/Assets 内でシンボリックリンクで利用したい
- シンボリックリンク作成用のShellは _tools/ProjectGenerate.shとして作成している
2. シンボリックリンク作成用のシェルスクリプトを作成
シンボリックリンク作成用のShellは以下のように作成します。 これは手元のShell環境(Macなど)でもそのまま動作するものです。 普段Windows環境では .bat のバッチファイルで書いています。
# _tools/ProjectGenerate.sh # CWDにshell scriptのカレントディレクトリを代入する CWD=$(cd $(dirname $0); pwd) echo ${CWD} # 対象のサブモジュールディレクトリ SUBMODULE_DIR="${CWD}/../_external/SUB_REPO1/Assets/" # メインのUnity Project MAIN_DIR="${CWD}/../Assets/" # Assets/Scripts/フォルダのシンボリックリンクを作成 ln -sfn ${SUBMODULE_DIR}Scripts ${MAIN_DIR}Scripts ln -sfn ${SUBMODULE_DIR}Scripts.meta ${MAIN_DIR}Scripts.meta
3. Unity Cloud Buildの設定
一般的な設定内容に加えて、Pre-Build Script を設定することで、ビルド開始前にシンボリックリンクを作成します。
- Unity Cloud Build の該当プロジェクトのConfigメニューを開く
- advanced options > Pre-Build Script Path に shellを設定
_tools/ProjectGenerate.sh
これで、おしまいです。
また、この状態の時に、ビルドログに
[Unity] Error (Not a directory) occured whilst enumerating Assets/Scripts.meta
のエラーが表示されますが、ビルド自体は成功(Success)しているので、問題は無さそうです。
Subfolderを指定している場合の注意事項
ただし、Basic Info の Project Subfolder を設定している場合は、そのフォルダを起点としてパスを指定する必要があります。
Subfolder を指定しているにもかかわらず、リポジトリルートからのパスでスクリプトを指定すると
! Pre-Build Script configured, but not found at {Pre-Build Script Path} Skipping.
のメッセージが表示され実行されません。
余談: Windows .bat の場合
シンボリックリンク作成用のShellはWIndowsの場合バッチファイルで作成しますが、上記と同じ内容をWindowsで作成する場合は以下のように書いています。 mklink と ln で シンボリックリンクの書き順が逆なので、よく間違える
- _tools/ProjectGenerate.bat
@echo off rem _tools/ProjectGenerate.bat set CWD=%~dp0 set SUBMODULE_DIR=%~dp0..\_external\SUBMODULE_REPO1\Assets\ set MAIN_DIR=%~dp0..\Assets\ cd %CWD% echo %CWD% mklink /d %MAIN_DIR%Scripts %SUBMODULE_DIR%Scripts mklink %MAIN_DIR%Scripts.meta %SUBMODULE_DIR%Scripts.meta
おしまい。