littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

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
  1. _external/SUB_REPO1/ に 別のProjectをgit submoduleとして登録している
  2. _external/SUB_REPO1/Assets/Scripts/フォルダを メインの root/Assets 内でシンボリックリンクで利用したい
  3. シンボリックリンク作成用の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 -s ${SUBMODULE_DIR}Scripts ${MAIN_DIR}Scripts
ln -s ${SUBMODULE_DIR}Scripts.meta ${MAIN_DIR}Scripts.meta

3. Unity Cloud Buildの設定

一般的な設定内容に加えて、Pre-Build Script を設定することで、ビルド開始前にシンボリックリンクを作成します。

  1. Unity Cloud Build の該当プロジェクトのConfigメニューを開く
  2. 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

おしまい。