tmytのらくがき

個人の日記レベルです

msdbuilで `.` を含むプロジェクトを/tでプロジェクトを指定しようとすると失敗する

表題の通りですが、.を含むプロジェクトを含んだソリューションをmsbuildを使って なおかつ/tパラメータでビルドするプロジェクトを指定しようとするとなぜかうまくいきません。

理由は、msbuildが.slnを.metaprojに変換するときにプロジェクト名に含まれる._に置換してしまうかららしいです。

なので、たとえばこういう古いUniversalプロジェクトで見かけるコマンドライン

msbuild App1.sln /t:App1\App1.Windows

これは

msbuild App1.sln /t:App1\App1_Windows

と書き換えるとうまく動きます。

なぜこうなっているかはよくわかりませんが、MSBuildがうまくいかない時はmetaprojを生成させて、そのファイルを読むとわかるかも。

metaprojを生成するにはmsbuildemitsolution環境変数に1を設定してあげるといいです。たとえばこんな感じ。

> set msbuildemitsolution=1
> msbuild App1.sln

こうすると、App1.slnの隣にApp1.sln.metaprojというファイルができます。こっちがmsbuildが解釈するプロジェクト形式なので ここを見てあげると今回のような実はプロジェクト名が書き変わっていたということに気づけます。というかこれを出力させるまで全く分からなくて1日使いました。