Xamarinはクソ


Xamarinはクソである. これがここ数日の開発体験で得た知見である. 以下に理由を挙げるので, 異論がある人 (i.e. 解決策を知っているXamarin専門家) は遠慮なく私に教えて欲しい.

Webサイトがクソ

Webサイトがいきなりクソだ. XamarinのWebサイトに行くと, WindowsユーザーにはやたらとXamarin for Visual Studioをインストールさせたがる. また, オフラインのインストーラの場所も教えてくれない. Windows向けXamarin Studioやオフラインのインストーラーには, Xamarin Storeにサインインして右上に表示されるアカウント名にカーソルをのせるとメニューが出てくるので, そこから”Install”をクリックすることでアクセスできる. そんなのわかりっこない. 一見さんお断りな仕様だ.

Sharedコードがクソ

Xamarinではクロスプラットフォーム開発をするときにPCL (Portable) とSharedの2つを選べる. PCLの場合には, アセンブリ (バイナリ) レベルで共有されるが, Sharedの場合はソースレベルで共有される. PCLではプラットフォーム依存のもの (例えばAndroidとiOSでしか使えないHttpListenerなど) は使えないので, その際にはSharedを選択できる.

しかし, Sharedコードには問題がある. 名前空間は同じでも, アセンブリ名が異なるのだ. よって, アセンブリ名に依存するリソース参照やXAMLでのBindingContextなどでは問題になる. ここでプリプロセスするのだが, 現在のアセンブリ名を教えてくれるようなマクロはなく, 自分でそれぞれの場合のコードを#ifで分けて書く必要がある. おまけに, これはXAMLでは使えない. だからその部分はC#でコンストラクタに書いたりしてごまかさなければならなかったりする.

Xamarin for Visual StudioとXamarin Studioの相互運用性がクソ

ただでさえ2つIDEがあって面倒なのに, この相互運用性はクソだ. 私はまず最初にXamarin for Visual Studioを試し, その後Xamarin Studioを試した. するとアプリケーションが起動しない. 一度アンインストールしてから再インストールすることで問題は解決した. これが本番で起きたらどうするつもりなんだろうか. ユーザーは再インストール (とそれによるデータ喪失) を強いられるかもしれない. 他のSDKを使っても必ずすべきことだが, Xamarinの場合は特にビルド後のバイナリをデプロイ前にテストしなければ最悪の事態が起こり得る.

また, Xamarin for Visual StudioでビルドしたXamarin.Forms本体が, Xamarin Studioでは動作しなかった. ライブラリ等を作成する際にも注意しなければならないのかと思う.

バグがあってクソ

まず最初に遭遇したのは, HttpListenerが停止時にObjectDisposedExceptionを投げる問題だ. これはMonoの問題である. 何故かXamarin Studioや, 自前ビルドのXamarin.Formsをインストールした後では再現しなかった. 意味不明である.

次に, Xamarin.FormsでLabel.FormattedText.Spans.AddしてもLabelの大きさが変わらない問題. これはソースコードを読んで原因を特定できた. オープンソース最高だぜってその時は思った.

Xamarin.Forms本体がビルドできなくてクソ

知っての通り, Xamarinランタイムはオープンソース化された. ところが, ユーザーにはそう簡単にビルドさせないクソである. まずREADMEを見てみる. 丁寧に環境について説明してくれているが, ビルドについての説明は殆ど無い. Visual Studioが必要って書いてあるんだから, それに食わせればビルドができるんだろ思うかもしれないが, それはある意味正しくない.

ビルドして吐き出されるのはDLLだ. productionは当然複数人で行うはずだから, もしその際に変更を行いたくなったらnupkgにしてNuGetで容易にインストールできるようにしたいと思うのは当然だろう. しかしそうは問屋が卸さない. さて.nuspecディレクトリでnuget pack Xamarin.Core.nuspecして見るとどうか, エラーが出る. 曰くdocs/Xamarin.Core.xmlが足りない. ググっても情報は少なく, 唯一見つけたブログ記事は汚いハックをこしらえている. それでリポジトリ内をよくよく見てみると怪しいMakefileがある. それだと思ってnmakeにかけた. またしてもエラーが出る. そこにはこうある.

/Library/Frameworks/Mono.framework/Libraries/mono/xbuild-frameworks/.NETPortable/v4.5/Profile/Profile259/

なんかUNIXっぽいパスだけど/LibraryってのはUNIXじゃないな. OS Xじゃないはず, と思ったけど実際OS Xだった. つまり, Visual Studioでビルドしておけと言っておきながら開発にはOS Xを使っている. それに加え, 実のところWindows関連以外はXamarin Studioでビルドできる. どうせMicrosoftに言われたからVisual Studio使えって書いたんじゃねえの, とか考えてしまう.

とにかく, 最も問題なのはこのMakefileはOS Xでしか使えないということだ. 変数にしてオーバーライドできるようにすらしていない. 「オープンソースだから誰でも手直しできるぞ!」ってのは嘘だ. 単なるアピールぐらいの意味しかないのではと感じた.

ランタイムが入れ替えられなくてクソ

Monoランタイムの入れ替え方が示されていない. 結局リソースモニターを使ってランタイムがC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v1.0にあることを突き止めたが, どうやら入れ替えは想定されていないようである. オープンソースだからといって自分でランタイムを改造するわけにはいかないのだ.

それでもXamarin

これらを踏まえると, 到底Xamarin (特にXamarin.Forms) はproduction-readyとは言えない. ほんの数日で複数のバグに遭遇し, かと言ってオープンソースだから自分で直そうとしても簡単にはいかない.

それでもXamarinを使うというのは, (Web技術ベースのものを除けば) Xamarinがプラットフォームの境を超えられる唯一の存在で, それによる利点が十分その不満を上回るということなのだろう. ただ, その結果, Xamarinを使う際に自分で問題を解決できる存在がいない開発チームにとってはXamarinは選択肢ではなくなってしまうということを注意すべきだろう.

[top]