読者です 読者をやめる 読者になる 読者になる

Project Rider EAP で Xamarin を書けるか。

Dev .NET Xamarin

Project Rider といえば、JetBrains が開発中のIDEです。内部にはReSharperが入っているということもあり、大きく期待されています。

f:id:iseebi:20160508090917p:plain

まだ EAP (Early Access Preview) なので、いろいろ動かない部分があるのですが、我々 Xamarin ユーザーとしては Xamarin の開発に使えるかどうかが最大の興味でしょう。

Xamarin のプロジェクトをロードしたときのエラーメッセージから、なんとなくいける気がしたので試してみました。

原因を確認する

Rider で Xamarin のプロジェクトをロードすると、以下のようにエラーメッセージが表示されます。

f:id:iseebi:20160508091505p:plain

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 についてはうまくロードされませんでした。

f:id:iseebi:20160508092406p:plain

正式サポートされるのをおとなしく待つ方が良いかもしれませんね…。