インサイドXamarin(11)
Xamarin Studio/MonoDevelopの基本機能と、C#コーディング補助機能
MonoDevelopとXamarin Studioはどう違うのか? MonoDevelopの基本的な機能を解説。C#コーディング補助機能についても紹介する。
Xamarin StudioとMonoDevelopの位置付け
前回までで、Xamarinのモバイル製品についての説明をだいたい終えた。今回はXamarin Studioを取り上げる。
MonoDevelopは、XamarinにおけるVisual Studioのような位置付けのIDEで、もともとはGtk#でLinux環境におけるC#のIDEとして開発されて発展してきたものが、MacでもWindowsでも利用できるようになったものだ。Visual Studioが動作するWindows環境で動作するメリットとしては、オープンソースで公開されているので、UnityやPlayStation Mobile SDKのように、製品にバンドルできるということが挙げられる(特にUnityはMac版もある。このようなクロスプラットフォーム化はWindows専用のSharpDevelopでは困難だろう)。
これまで何度か言及したが、Xamarin StudioはMonoDevelopにXamarin製品アドインを追加したものである。Xamarin製品に関して拡張した部分については、前回まででだいぶ説明したので、実質的には今回は大部分がMonoDevelopの解説となる。以降は、Xamarin StudioとMonoDevelopの共通部分についての説明では、単に「MonoDevelop」と表記することにする*1。
- *1 Monoの公式サイトからMonoDevelopのバイナリパッケージをダウンロードすると、「Xamarin Studio」という名前で起動する環境もあるが、MonoDevelopと違いはなく、Xamarin製品を別途インストールしていなければ、各種拡張機能が有効になることもない。
MonoDevelopの諸機能
MonoDevelopの基本的な画面構成は、メインメニュー、メイン画面(エディター部分)、各種パッド([ソリューション][プロパティ][Errors]など)から成る、Visual Studio類似の構成となっている。メインメニュー(=メニューバー)の[ビュー]メニューから表示するパッドを選択でき、ドッキングビューなのでサブウィンドウとして切り離したりできる。
以下にMonoDevelopの機能・特徴を挙げる。今回はXamarin製品に関する記事なので、Xamarin製品と無関係なものについては、紹介にとどめ、説明は割愛させていただく。
- MonoDevelopでは、複数のプログラム言語、さまざまな種類のアプリケーションを対象とするプロジェクトモデルをサポートしている
- MonoDevelopは、プロジェクトのビルド/実行/デバッグを行える
- MonoDevelopの機能の大半は、高度なアドイン機構に基づいて構築されており、さまざまな言語バインディングや機能が、monodevelop本体およびユーザーコミュニティによって作成されている
- コードエディターは、基本的な編集機能を備えているだけでなく、各種言語、特にC#に特化した拡張機能が追加されている
- MonoDevelopでは、エディターの外部でも、コーディングを補助するさまざまな機能が用意されている。例えば.NET用のアセンブリブラウザー、型やメンバーを手軽に検索するツールバー、複数のコードファイルを一括整形するツール、正規表現を試行できるツールボックス、C#などのインタラクティブシェル、といった機能が含まれている
- MonoDevelopには、GitやSubversionを用いたバージョン管理ツールの便宜が図られており、ローカルでの変更を差分表示したり、その場で修正を破棄したり、変更ログを時系列表示したりといった機能がIDE各所で統合されている
- MonoDevelopには、ソースコードをアーカイブしたパッケージを配布するためのヘルパーツールが備わっている。Xamarin製品については、iOSのApp Storeでの配布や、AndroidのGoogle Playでの配布について、パッケージングを補助する機能がアドインで追加されている
- MonoDevelopには、NUnitを用いた単体テスト統合機能が備わっている。[単体テスト]パッドを表示すると、NUnitを使用したプロジェクトで、テストを実行し、結果を確認できることが分かるだろう。この機能はXamarinのモバイル製品と統合されたものではないので、ここでは詳しく説明しない
- IDEにはRADツール、GUIデザイナーが備わっているものが多い。MonoDevelopには、GTK#のGUIデザイナーが含まれている。また、Mac版にはバンドルされているデータベースデザイナーのアドインは、ソースからのビルドではデフォルトで有効になっていないが、configureの時点で有効にすることもできる(Windows版には含まれていない)。これらは、やはりXamarinのモバイル製品と関係がないので、ここでは詳しく説明しない
ソリューションとプロジェクトによるファイル管理
MonoDevelopでは、(一般的なIDEとして)プログラムのビルドなどに必要なファイル群を、1つの「プロジェクト」という単位にまとめ、それをさらに1つのIDEで開く「ソリューション」という単位でまとめる。標準的な.NETプロジェクトの場合、1つのプロジェクトから1つのアセンブリが生成される。
MonoDevelopは、Visual Studioでも使用されるMSBuild互換のプロジェクトファイル(*proj
という名前が典型的に使用される)に基づくプロジェクトモデルをサポートしており、同様にソリューションファイル(.slnファイル)もサポートしている。
MSBuildのプロジェクトフォーマットは、.NETに限定されてはおらず、C++などのプロジェクトでも使用されており、MonoDevelopでも、.NETのプロジェクト以外に、C++などのプロジェクトがサポートされている。ValaやJavaのプロジェクトについてもmonodevelop本体のソースコードにプロジェクトモデルが存在している(ただ、誰もmonodevelop本体でメンテナンスしておらず、大抵の場合、ソースからビルドできず、バイナリにも含まれていない)。他の言語に関して言えば、MonoDevelopチームの外部でHaxeやDのプロジェクトモデルのアドインを公開しているコミュニティハッカーもいる。
.NET言語のプロジェクトとしては、C#は当然サポートされており、さらにF#バインディングも(2014年4月時点で)、ソースのGitリポジトリのmasterブランチに取り込まれて、サポート対象となっている。アクティブに開発されてはいないが、VB.NETのプロジェクトモデルも存在する。
MonoDevelopは、MSVC(Microsoft Visual C++)に特化したVisual C++の*.vcxprojなどをサポートしない。逆に、gccを前提とするMonoDevelopのC++プロジェクトや、Valaプロジェクトは、もちろんVisual Studioでは開けない。
プロジェクトモデルは、言語の種類だけの問題ではなく、アプリケーションやライブラリの種類の問題でもある。C#は最もアプリケーションの種類が多く、コンソールアプリケーション以外でも、GTK#、ASP.NET*2、PCL(ポータブル・クラス・ライブラリ)、NUnitテストなどが存在する。Xamarin Studioはここに、iOS、Android、Macなどのプロジェクトモデルを追加していることになる。典型的なMSBuildプロジェクトには、「ProjectTypeGuids」というプロジェクトの種類を判別するためのGUIDが2つ含まれている。1つは言語を指定し、1つはアプリケーションの種類を指定する、といった使い方だ。
- *2 ASP.NETのサポートは、あくまでプロジェクトモデルとして存在しているのであって、WISYWIG的なWebデザイナーがサポートされているわけではない。ビルドして実行できることを意味している。
プロジェクトには、いくつかの依存アセンブリを指定できる。具体的には、アセンブリ参照、Web参照、サービス参照が、MonoDevelopで指定できる。さらにNuGetサポートのアドインを追加すればNuGetパッケージも、Xamarin StudioならXamarinコンポーネントストアのパッケージも、指定可能だ(NuGetアドインの作者は、Xamarinに参加して仕事するようになったので、いずれMonoDevelop本体に取り込まれると思われる)。
これらの特殊なアイテムは、IDEのアドインで拡張・追加されたものだ。monodevelop本体のソースに、Web参照およびサービス参照を追加する「MonoDevelop.WebReferences」というアドインがあるので、もし同様の機能をアドインで実装したい場合は、そのソースコードが参考になるだろう。
テキストエディターとNRefactory
MonoDevelopのテキストエディターは、IDEの一部として、単なるテキストエディター以上の機能を備えている。ここにその機能を列挙してみよう。
- シンタックスハイライティングが実装されており、文脈に基づいてソースコードの要素の表示色・フォントをカスタマイズできる
- 型/メンバー/コードブロック(C#なら「#region」)を選択できるツールバーが用意されている
- ソースコード分析に基づく高度な補完機能が実装されている。これは文脈に基づいて特別なメッセージを表示する場合もある。試しにint型の変数で「.ToString()」を試してみると、発見があることだろう
- カーソル位置のシンボル(変数名など)について:
・ツールチップヒントが表示される
・コンテキストメニューから、定義(型/メンバー/変数)へジャンプできる
・コンテキストメニューから、それを参照するコードを検索できる
・そのオーバーライドを検索できる - テキスト編集中に文脈に基づいて整形を行うスマートインデントが実装されている
- コード整形のスタイルを詳細に設定できる
- さまざまなリファクタリング機能が実装されている:
・型名/メンバー名/変数名の変更
・インターフェース/抽象クラスの実装の追加
・コード分析と潜在的な問題の指摘・修正
これらの機能の有無は、プロジェクトの言語によって異なる。外部アドインが無い状態では、高度な機能はC#にのみ存在する。言語コミュニティによっては、高水準のコード編集機能を備えたアドインが提供されている場合もある。
C#コーディング補助機能
C#については、特にソース分析機能を有効にしていると(Macでは[設定]ダイアログ、Windowsでは[オプション]ダイアログの[テキストエディタ]の中に[Source Analysis]という項目から有効にできる)、ReSharperのようなコード改善案が提示される。コードエディター上でコンテキストメニューを開くと、そのコードの文脈に応じて、さまざまなリファクタリングコマンドが出現する。これは、同じくダイアログで[ソースコード]-[C#]に[Code Inspection]や[Context Actions]といった設定(現在のgit master版は「Code Rules」や「Code Actions」に名称変更されており、今後そうなる可能性が高い)で個別に設定可能だ(細かすぎて筆者はとても設定する気になれない)。
C#の強力なコーディング補助機能は、SharpDevelopと共同で開発している「NRefactory」という「サービスとしてのコンパイラー」(Compiler as a Service、あるいはLanguage Service)と総称されるコーディング補助ライブラリの機能に基づいている。実はこの部分は今後、大きく変わりそうである。というのは、マイクロソフトも、同様の機能を提供する「Roslyn」というライブラリを開発していたが、2014年4月になって、このライブラリがApache 2ライセンスの下で公開されるに至ったのである。これを受けてNRefactoryの開発者は、今後はRoslynを統合すると意思表明している。
Roslyn、NRefactoryともに、アプリケーションの開発者が通常必要とするものではないが、MonoDevelopのようなエディターを高度に拡張したい開発者が重宝するものだ。実際、VimでC#の高度なコード補完を実現する「OmniSharp」というプロジェクトは、NRefactoryを使用している。
一方で、C#以外の言語についても、例えば、最新版ではmonodevelop本体にも取り込まれるF#バインディングや、Haxeバインディング、D言語バインディングでは、これらの高度な機能が一部実現されている。これらの言語にも、NRefactoryのようなライブラリやツールが存在しており、それらを呼び出す形でこれらの機能を実現している。
他の言語では、例えばTypeScriptは標準でLanguage Serviceを提供しており、2014年4月時点でのmonodevelopの本家リポジトリには、これをサポートしようとするブランチが存在する(ただ、実際には、現存するSharpDevelopアドインに基づくコードがこれを置き換える予定だ)。また、さまざまな言語でLanguage Serviceの実装が試みられており(有名なところではLLVMプロジェクトのclangが挙げられよう)、アドイン開発者には興味深い分野であろう。
コードエディターの機能については、筆者が過去にC#コードエディターが各種機能を実現する仕組みについて、MonoDevelopのソースコードに踏み込んで説明した「MonoDevelopのC#アドインについて」の記事があるので、参考文献として挙げておきたい。
ちなみに、Windows版のMonoDevelopのテキストエディターは、コーディング補助機能だけでなく、キーバインディングのカスタマイズも柔軟に行え、Visual Studio、Emacs、Viといったモードも備わっている(ViモードはMac版でも利用可能)。
MonoDevelopのバージョン管理機能
MonoDevelopでは、VCS(バージョン管理システム)がIDEに統合されていて、IDE上から差分やマージの表示・編集、blameやlogの表示などが操作できる。また、ソリューション、プロジェクト、フォルダーの単位で、差分を表示したりパッチを作成したりもできる。
具体的なバージョン管理システムとしては、標準ではGitとSubversionが統合されている。コミュニティには、TFS(Visual Studio Team Foundation Server)サポートのアドインを開発している人もいるようだ。また、筆者も以前にMercurialを追加サポートするアドインを作成していたことがある(これは最近になってmonodevelop開発チームに引き渡したので、今後、統合される可能性もある)。
バージョン管理統合の機能は、以下の部分に表れている(上記のいずれのバージョン管理アドインも、共通のアドイン拡張ポイントを実装している範囲で、これらを共通に扱うことができている)。
テキストエディター
ソースファイルの差分表示・編集、注釈(blame)、ログ(変更履歴)、マージ編集のためのビューが備わっている。
[プロジェクト]パッド
[プロジェクト]パッドのコンテキストメニュー上から、ソリューションディレクトリ、プロジェクトディレクトリ、各ソースファイルの単位でコミットや変更破棄などの操作が行える。
メインメニュー
メインメニューの[バージョン管理]メニューから、リポジトリに対するpull、push、ブランチ切り替えなどの操作が行える。
■
ちなみに、MonoDevelop 4.3の時点では、Gitサポートを実装するために、JavaソースコードからC#ソースコードを自動生成する「Sharpen」というツールを使用して、JGitというライブラリを変換した「NGit」というライブラリを、MonoDevelopチームが作成して使用している。これによってクロスプラットフォームで問題なく動作するGitサポートが実現している(Subversionサポートが機能するためには、実行可能なsvn
にPATHが通っている必要がある)。ただ、これを「libgit2sharp」に置き換えようという動きもある(実現性は不明だ)。
■
以上、MonoDevelop(Xamarin Studio)の基本的な機能やC#コーディング補助機能についても説明した。次回も引き続き、MonoDevelopでアプリケーションをビルド/実行/デバッグするための機能を解説。iOS/Android向けのGUIデザイナーや、MonoDevelopのカスタムアドインについても紹介する。
※以下では、本稿の前後を合わせて5回分(第9回~第13回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
10. Xamarin.AndroidにおけるJava相互運用の仕組みと、Javaバインディング・プロジェクト
Xamarin.AndroidでJavaとの相互運用を実現するアーキテクチャについて、さらにメモリ管理などの注意点を説明。さらにXamarin.Androidの制限事項についても解説する。
11. 【現在、表示中】≫ Xamarin Studio/MonoDevelopの基本機能と、C#コーディング補助機能
MonoDevelopとXamarin Studioはどう違うのか? MonoDevelopの基本的な機能を解説。C#コーディング補助機能についても紹介する。
12. MonoDevelopにおけるビルド/実行/デバッグと、iOS/Android向けのGUIデザイナー
MonoDevelopでアプリをビルド/実行/デバッグするための機能を解説。iOS/Android向けのGUIデザイナーや、MonoDevelopのカスタムアドインについても紹介する。
13. Xamarinと、ポータブル・クラス・ライブラリ(PCL)
複数プラットフォーム向けのライブラリを作れるPCLの概要と利点について解説。また、Xamarin.iOSやXamarin.Androidでの利用方法や、XamarinでPCLを実現する仕組み、PCLの課題を説明する。