Windowsで書いたC#ソリューションをMacでビルドするために友人とともにちょっと奮闘しましたので記録しておきます。手早く試したかったので、IDEなどのツールを使わない方法のメモになっています。
使用したソリューションは「冒険者は森に強い」というゲームのソースコードです。GitHubから参照できます。
##概要
この記事で紹介する順番とは異なります。
- VisualStudioのソリューション(.sln)やプロジェクト(.csproj)をコンパイルするには
xbuild
コマンドを使う - NuGetパッケージを復元するにはNuGet.exeを実行する
- mono環境で利用できないライブラリの参照をなくす
##brewでmonoをインストール
まだmonoをインストールしていない場合は、まずmonoをインストールする必要があります。友人はパッケージマネージャとしてbrewを使っていたので、それでmonoをインストールしました。次のコマンドでインストールします。
brew install mono
##NuGetパッケージを復元する
用意したソリューションをビルドするために、NuGetパッケージの復元を行い、ソリューションが依存しているパッケージを復元する必要があります。まずは、復元を行ってくれるアプリケーションであるNuGet.exeを用意します。用意する方法ですが、今回はWebからダウンロードしてくるようにしましょう(友人と試したときは別の方法でした)。NuGetのサイトにアクセスし、"Direct Download"からnuget.exeをダウンロードして使うことにします。
ダウンロードしてパスを通すなどの準備をしたら、次のコマンドを実行してください。mono
コマンドはexeファイルをmac,linux上で実行するためのコマンドのようです。
mono NuGet.exe restore Rpg.sln
次のようにパッケージの依存関係が解決・インストールされます。
Installing 'Ix-Main 1.2.2'.
Successfully installed 'Ix-Main 1.2.2'.
Installing 'CsvHelper 2.10.0'.
Successfully installed 'CsvHelper 2.10.0'.
##Mac環境で利用できないライブラリの参照をなくす
パッケージの参照を復元したらxbuild
コマンドでコンパイルできるのですが、私のソリューションではMac環境で利用できないライブラリへの参照が混入していたようで、アセンブリ参照が足りていない旨のエラーが出ました。
今回のケースでは、テストプロジェクト(Rpg1.Test
という名前でした)でMicrosoft.VisualStudio.TestTools.UnitTesting
名前空間を参照していたのが原因だったので、テストプロジェクトを丸ごとソリューションのビルドから除外することにしました。ソリューションを管理できるツールがなかったので、ソリューションファイルを直接弄ってテストプロジェクトをビルド対象から外して対処しました。次のように数行削除すればOKです。
# 以下の2行を削除した
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rpg1.Test", "Rpg1.Test\Rpg1.Test.csproj", "{3D7A1777-D467-49AA-9CC8-2C76898114E8}"
EndProject
##ビルド!
ビルドはxbuild
コマンドで実行します。引数なしで実行するとカレントディレクトリにあるソリューションをビルドします。
結果:
1 Warning(s)
0 Error(s)
ビルドが通りました!「冒険者は森に強い」はWindows向けのゲームなので、Macではビルドはできても実行はできませんでしたが、コンソールアプリケーションなどでWindowsで書かれたものをMacで動かしてみたいという人はこのメモを参考にしてみてください。
##NuGet.exeを入手するもう一つの方法
本記事ではNuGetのサイトからダウンロードしましたが、友人と試したときは別の方法を使っていました。まずWindows上のVisualStudioでソリューションを開き、ソリューション エクスプローラーを開いてソリューションを右クリック→「NuGet パッケージの復元の有効化」を実行することで、NuGet.exeを生成しました。本記事でこちらの方法を採用しなかったのは、Windowsが必要なことと、単純に面倒なこと、またVS2015 RCでは「NuGet パッケージの復元の有効化」がメニューに現れなかったことがあります。私はNuGetのサイトからダウンロードする方法を使えばいいと思います。