MSBuild のコマンドにカンマ付き文字列を渡す方法

Xamarin.iOS アプリを msbuild でビルドする時、.csproj ファイルにプロビジョニング関連の設定値を含めたくないので、msbuild でのビルド時に指定したいと考えた。

Windows と macOS 両方でビルドできるように、前後処理のスクリプトは PowerShell(7.0〜) になっているという前提。

次のようなコマンドで、署名(CodesignKey)とプロビジョニングプロファイル名(CodesignProvision)を指定してビルドできることが分かった。

msbuild .\MyApp.iOS.csproj `
    /p:BuildIpa=True `
    /p:Configuration=Release `
    /p:Platform=iPhone `
    /p:CodesignKey="Apple Distribution: XXXXXXX (XXXXXXXX)" `
    /p:CodesignProvision="myappprovision" `
    /t:Build

と、ここで問題発生。

"Apple Distribution: XXXXXXX (XXXXXXXX)" のところが、"Apple Distribution: MyCompany.,Ltd. (XXXXXXXX)" などと「カンマ」が入っている場合、そのパースで次のエラーになってしまう。

MSBUILD : error MSB1006: プロパティが無効です。
スイッチ: Ltd. (XXXXXXXX)

カンマをエスケープする方法をいろいろ(以下)試したが、どれも変わらず。

"Apple Distribution: MyCompany.,Ltd. (XXXXXXXX)"
"""Apple Distribution: MyCompany.,Ltd. (XXXXXXXX)"""
\"Apple Distribution: MyCompany.,Ltd. (XXXXXXXX)\"
"Apple Distribution: MyCompany.\,Ltd. (XXXXXXXX)"
"Apple Distribution: MyCompany.`,Ltd. (XXXXXXXX)"
"Apple Distribution: MyCompany.,,Ltd. (XXXXXXXX)"

最終的には、 MSBuild で特殊文字をエスケープする - MSBuild | Microsoft Learn で紹介されている方法で、カンマ「,」を %2c と記述することで、エラーなく実行することができた。

msbuild .\MyApp.iOS.csproj `
    /p:BuildIpa=True `
    /p:Configuration=Release `
    /p:Platform=iPhone `
    /p:CodesignKey="Apple Distribution: MyCompany.%2cLtd. (XXXXXXXX)" `
    /p:CodesignProvision="myappprovision" `
    /t:Build

ちょっと不格好だけど、とりあえずはいいや。

PowerShell の仕様か MSBuild の仕様かよく分からなかったが、MSBuild の仕様ということらしい。

おまけ

この事について ChatGPT(GPT-4) さんに聞いたのだけど、軽くイラッとしたw

image.png

image.png