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

tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

Azure Web Apps を使ったReference Source による ブラウザ上でのコード追跡

C# Azure

2014年2月に Microsoft がブラウザ上におけるソースコード閲覧の新しい体験を提供しました。今でも使うことが多い、Reference Source です!! 個人的にこの時の衝撃はすさまじいものがありました。

blogs.msdn.microsoft.com

http://referencesource.microsoft.com/

※ Reference Source で閲覧可能なソースは、現在の 4.6.2 までの全ソースを zip でダウンロードすることもできます。

Download the entire reference source

さて、今回はこの Reference Source を自分のソースコードにも適用できますよ。というお話です。こんな感じで!

f:id:guitarrapc_tech:20160824043604g:plain

目次

Roslyn を使った Reference Source のジェネレータ

Reference Source 以外にも実は Roslyn も同様のフォーマットで公開されています。

Roslyn Reference Source

これらはMicrosoft のエンジニアである KirillOsenkov がOSSとして 2015年に公開した SourceBrowser を使って生成されています。

github.com

SourceBrowser は非常に強力で、既存のC# プロジェクトの Solution ファイルを食わせるだけで自動的に静的サイトのdll やhtml を生成します。

早速見てみましょう。

サンプル

今回は、UniRx をリファレンスソースとして参照可能にしてみます。事前に、Visual Studio Tools for Unity をインストールしておきましょう。

visualstudiogallery.msdn.microsoft.com

SourceBrowser のビルド

SourceBrowser に含まれる HtmlGenerator で、ソースコードをHtml に変換、生成します。まずは、Github からクローンしたら、SourceBrowser.sln を開き HtmlGenerator をDebugビルドしましょう。

f:id:guitarrapc_tech:20160824040312p:plain

ビルドできましたね?

f:id:guitarrapc_tech:20160824040400p:plain

静的Html の生成

では、次に HtmlGenerator のプロジェクトプロパティ > Debug で、Command line arguments に Reference Source を生成したいプロジェクトの .sln ファイルを食わせましょう。今回、D:\GitHub\UniRx\UniRx.sln に、UniRx を置いたので指定して実行します。これで Htmlが生成されます。

f:id:guitarrapc_tech:20160824040643p:plain

が、CI を前提にビルドされた .exe を使っても生成してみましょう。SourceBrowser\bin\Debug\HtmlGeneratorHtmlGenerator.exe が生成されているので次の書式で実行します。

HtmlGenerator.exe <生成したいプロジェクトの.sln> <生成先パス>

今回、私は HtmlGenerator.exe "D:\GitHub\UniRx\UniRx.sln" "D:\GitHub\UniRx.ReferenceSource\src" としました。

f:id:guitarrapc_tech:20160824041147p:plain

実行すると、さくさく生成されます。

f:id:guitarrapc_tech:20160824041655p:plain

中略

f:id:guitarrapc_tech:20160824041639p:plain

生成されました。非常に高速です。

Writing referencing assemblies complete. Took: 00:00:00.0277302
04:16:02 Finalizing references complete. Took: 00:00:08.6732978
04:16:02 Generating website complete. Took: 00:00:31.2171024

生成されたファイルは、HtmlGenerator.exe と同パスにある Index フォルダにあります。

f:id:guitarrapc_tech:20160824041849p:plain

Azure Web Apps にデプロイ

生成された中身は Web.config や Global.asax をはじめ、各種dll まで含まれており Roslyn ベースで動いています。そのため、ホスティングするサーバーは .NET 4.6 が動いている必要があります。まさに Azure Web Sites 向けですね!

f:id:guitarrapc_tech:20160824042048p:plain

f:id:guitarrapc_tech:20160824042057p:plain

生成したファイルを Github 経由でデプロイして閲覧できるようにしました。個人的に、こういう大量のファイルをただデプロイする場合は、Github -> Azure Web Apps 連携がいいと思います。くれぐれも MSBuild + Deploy Package や MSDeploy は無駄なのでやめたいところです。

github.com

できました!Azure Web Apps も無料プランでお財布に優しいです。

f:id:guitarrapc_tech:20160824042543p:plain

UniRx.ReferenceSource

ということで、どうぞ。UniRx のソースをブラウザ上で閲覧できます。

UniRx.ReferenceSource

f:id:guitarrapc_tech:20160824042950p:plain

できることはReference Source 同様です。定義へのジャンプ、コード検索、シンタックスハイライト、コード選択でURL共有、などなどちょっとしたIDEよりも高性能です。

f:id:guitarrapc_tech:20160824043604g:plain

CI

ちなみにVSTS を使うと、ビルドパイプラインをガシガシ重ねることで特別なスクリプトなどもなしにCI/CD が可能です。f:id:guitarrapc_tech:20160824044446p:plain

同期ツール

イミュータブルなビルドパイプラインを作っていると、ローカルで同期をしたくなることがあります。しかし、RoboCopy は最終更新時間で判定、MSDeploy はチェックサム検証コピーが可能ですが遅いと従来のツールでは問題があります。しかし、同じくKirillOsenkov が作成した CotentSync を使うと爆速で同期できます。最高です。このツール、コードもきれいでシンプルで、本当に感動を覚えます。

github.com

まとめ

グラニでは、実際にプロダクションコードを Github 以外にもブラウザから追跡可能なように提供しています。*1 この記事が、皆様のコード共有の役に立つことを願っています。

*1:AzureAD 認証を付けることで SSOも担保できます