Project Rider EAP で Xamarin を書けるか。
Project Rider といえば、JetBrains が開発中のIDEです。内部にはReSharperが入っているということもあり、大きく期待されています。
まだ EAP (Early Access Preview) なので、いろいろ動かない部分があるのですが、我々 Xamarin ユーザーとしては Xamarin の開発に使えるかどうかが最大の興味でしょう。
Xamarin のプロジェクトをロードしたときのエラーメッセージから、なんとなくいける気がしたので試してみました。
原因を確認する
Rider で Xamarin のプロジェクトをロードすると、以下のようにエラーメッセージが表示されます。
Event Log ウィンドウでみると、このようなログになっています。
Project 'Phoneword.iOS' load failed: The imported project "/Applications/Rider EAP.app/Contents/lib/ReSharperHost/macos-x64/mono/lib/mono/xbuild/Xamarin/iOS/Xamarin.iOS.CSharp.targets" was not found. Confirm that the path in the declaration is correct, and that the file exists on disk. /Users/***/Projects/Phoneword/iOS/Phoneword.iOS.csproj (show balloon) Project 'Phoneword.Droid' load failed: The imported project "/Applications/Rider EAP.app/Contents/lib/ReSharperHost/macos-x64/mono/lib/mono/xbuild/Xamarin/Android/Xamarin.Android.CSharp.targets" was not found. Confirm that the path in the declaration is correct, and that the file exists on disk. /Users/***/Projects/Phoneword/Droid/Phoneword.Droid.csproj (show balloon)
つまり /Applications/Rider EAP.app/Contents/lib/ReSharperHost/macos-x64/mono/lib/mono/xbuild/Xamarin/iOS/Xamarin.iOS.CSharp.targets や /Applications/Rider EAP.app/Contents/lib/ReSharperHost/macos-x64/mono/lib/mono/xbuild/Xamarin/Android/Xamarin.Android.CSharp.targets があれば良い、ということのようです。
Xamarin の .targets ファイルを探す
では、これらのファイルはどこにあるのでしょうか。ターミナルを開いて mdfind コマンドで探してみましょう。mdfind コマンドは Spotlight を使った高速な検索です。
$ mdfind Xamarin.Android.CSharp.targets /Library/Frameworks/Xamarin.Android.framework/Versions/6.0.3-5/lib/xbuild/Xamarin/Android/Xamarin.Android.CSharp.targets $ mdfind Xamarin.iOS.CSharp.targets /Library/Frameworks/Xamarin.iOS.framework/Versions/9.4.2.27/lib/mono/2.1/Xamarin.iOS.CSharp.targets /Library/Frameworks/Xamarin.iOS.framework/Versions/9.6.1.9/lib/mono/2.1/Xamarin.iOS.CSharp.targets
ls でこれらのファイルが入っているディレクトリを確認すると、DLL などいろいろなものが入っていて、恐らく一緒に必要になりそうであると予想できます。
Rider を改造して Xamarin を参照させる
targets ファイルの入っているディレクトリをまるっと Rider の中にシンボリックリンクしてしまいます。
$ mkdir "/Applications/Rider EAP.app/Contents/lib/ReSharperHost/macos-x64/mono/lib/mono/xbuild/Xamarin" $ cd "/Applications/Rider EAP.app/Contents/lib/ReSharperHost/macos-x64/mono/lib/mono/xbuild/Xamarin" $ ln -s /Library/Frameworks/Xamarin.Android.framework/Versions/6.0.3-5/lib/xbuild/Xamarin/Android $ ln -s /Library/Frameworks/Xamarin.iOS.framework/Versions/9.6.1.9/lib/mono/2.1 iOS
※これをすると、GateKeeper に未検証のアプリケーションと言われてしまうようになります。
結果
この状態で MvvmCross 4 で構築したアプリは、プロジェクト自体のロードができるようになり、Androidは補完もばっちり効いて使えそうでした。しかし。iOS と PCL についてはうまくロードされませんでした。
正式サポートされるのをおとなしく待つ方が良いかもしれませんね…。