NuGetには対象のライブラリの他に、デバッグシンボルとソースを含んだシンボルパッケージ(Symbol Package)を作成することが出来ます。公式のNuGetギャラリーで公開する場合、SymbolSource.orgにシンボルパッケージをデプロイすることで自動的にパッケージを関連付けてPDBファイルをダウンロードし、Visual Studioでソースコードにステップインを行うことができます。
これを『ローカルネットワーク上のプライベートリポジトリでも行えないか?』と思って調べてみると、NuGet.Serverを拡張したNuPeekというプロダクトがありました。
これを試してみたので、以下のステップでエントリにまとめてみたいと思います。
- NuPeekの準備
- ライブラリおよびシンボルパッケージの作成と配置
- Visual Sutdioでの設定
- パッケージの利用
<2013/04/09 23:35 追記>
IISでの動作について状況をまとめました。
2013/04/09時点の最新Commit版においては、サーバのルートに配置する場合はIISでも問題なく動作します。
仮想ディレクトリに配置する場合は現時点では一部問題がありますが、forkして修正したものもありますので、詳細はこちらをご覧ください。
<2013/04/09 00:50 追記>
一応、動作しました。
詳細はこちら。
<2013/04/08 21:55 追記>
本エントリではIIS Expressで実際に動作することを確認したのですが、手元にある通常のIISにデプロイしてみたところ、現状、まだうまく動かせていません。
上手く動いてるという方がおられましたら、教えていただけると大変助かります。
リポジトリサーバ「NuPeek」の設定
まずは、リポジトリサーバを立ててみます。通常、ローカルリポジトリは特にWebサーバなどは不要でファイルシステムで十分ですが、シンボルサーバはそういうわけにいかないようです。今回は先に紹介したとおり、NuGet.Serverを拡張してNuGetのリポジトリに加えてシンボルサーバの機能も持ったリポジトリサーバ、『NuPeek』を使用してみます。
1.NuPeekの取得
NuPeekを取得します。NuPeekはBitBucketでホストされています。以下からアクセスし、Cloneするなりソース一式をダウンロードするなりお好みの方法で取得してください*1。
thinkbeforecoding/NuPeek-Bitbucket
2.ソリューションをVisual Studio 2012で開く
NuPeekはVisual Studio 2012で作成されているようですので、Visual Studio 2012で開いてください。おそらくですが、Express Editionでも開けると思います。
開くとパッケージマネージャコンソールに以下のように表示されると思いますので、[復元]を実行して足りないパッケージを取得してください。
3.実行する
本来であればビルドし、ASP.NETが動作するサーバにデプロイ…するところですが、NuPeekはIISにデプロイしなくても、IIS ExpressやVS内臓の開発サーバでも動作します。ですので、今回はこのまま実行して動作を確認してみます(なお、実際に稼働させる場合はweb.configのconfiguration/appSettings内にある、apiKeyを変更することをお勧めします。デフォルト値は"topsecret"となっています)。
F5キーなどで実行し、ブラウザが起動して次のように表示されればまずは成功です。
(ここで表示されている情報はパッケージの配置やVisual Studioから参照する際に重要になります)
ライブラリおよびシンボルパッケージの作成
次に、ライブラリパッケージおよびシンボルパッケージを作りましょう。
シンボルパッケージの作成は公式のNuGet Docsにズバリの記述があります。@yfakariyaさんが日本語訳してgithubで公開してくださっているので、こちらを参照してみてください:シンボルパッケージの作成と公開
(英語の本家はこちら:Creating and Publishing a Symbol Package)
なお、今回は前述のドキュメントに倣ってコマンドラインでやってみた手順を紹介します。しかし、GUIツールのNuGet Package Explorerでも普通に作れると思います*2。NuGetコマンドラインを未導入の方は、こちらを参照してインストールしてみてください:パッケージの作成と公開:NuGet.exe のインストール
1.ライブラリのDLLの作成
今回はこんな感じで、HogeLibという極シンプルなC#のクラスライブラリのプロジェクトをつくり、これをnugetで配布する想定で試してみます。
namespace HogeLib { public class Hogecs { /// <summary> /// ほげメソッド /// </summary> /// <returns> ほげほげなメソッド </returns> public string GetHoge() { return "hoge" ; } /// <summary> /// ふがメソッド /// </summary> /// <param name="name"> おなまえ </param> /// <returns> ふがふがなメソッド </returns> public string GetFuga( string name) { return "Fuga" + name; } } }
なお、後でパッケージ生成時に値を利用するために、AssemblyInfo.csの中身の属性をすこし編集しておきます。
[ assembly: AssemblyTitle( "HogeLib" )] [ assembly: AssemblyDescription( "NuGetのシンボルサーバのテスト用のパッケージ" )] [ assembly: AssemblyConfiguration( "" )] [ assembly: AssemblyCompany( "kiyokura" )] [ assembly: AssemblyProduct( "HogeLib" )] [ assembly: AssemblyCopyright( "Copyright 〓 2013" )] [ assembly: AssemblyTrademark( "" )] [ assembly: AssemblyCulture( "" )]
これで一度、ビルドしておきます。
2.nuspecファイルの生成
nuspecファイルのテンプレートを生成します。今回はcsprojから生成しました。コマンドプロンプトでHogeLib.csprojのある階層に移動し、以下のコマンドで生成します。
C:\Project\HogeLib\> nuget spec
うまくいくと、プロンプトに「Created 'HogeLib.nuspec' successfully.」と表示され、フォルダに
HogeLib.nuspec
が作成されます。中は恐らく、こんな感じで生成できると思います*3。
3.HogeLib.nuspecの編集
生成されたスペックファイルはそのままでもいいのですが、いくつか『サンプル記述のままだよ』という警告が出るので、削除しておきましょう*4。出来上がりはこんな感じです。
<?xml version="1.0"?> <package > <metadata> <id>$id$</id> <version>$version$</version> <title>$title$</title> <authors>$author$</authors> <owners>$author$</owners> <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>$description$</description> <releaseNotes></releaseNotes> <copyright>Copyright 2013</copyright> </metadata> </package>
4.パッケージの生成
コマンドでパッケージを作ります。
ライブラリ本体は通常どおり、以下のコマンドで作成しましょう。
C:\Project\HogeLib\> nuget pack
問題なければ、フォルダ内に次のnupackファイルが作成されます。
HogeLib.1.0.0.0.nupkg
次にシンボルパッケージを作成します。次のコマンドを実行してください。
C:\Project\HogeLib\> nuget pack -symbols
成功すると、次のシンボルパッケージが出来上がります。
HogeLib.1.0.0.0.symbols.nupkg
必要なパッケージの作成はこれで完了です。
5.パッケージの配置
作成したライブラリとシンボルのそれぞれのパッケージを配置します。
ライブラリのパッケージは以下のように配置します。
今回の私の環境の例では以下のようになります。
ライブラリパッケージ:
C:\Project\HogeLib\> nuget push HogeLib.1.0.0.0.nupkg -s http://localhost:41538/ topsecret
シンボルパッケージ:
C:\Project\HogeLib\> nuget push HogeLib.1.0.0.0.symbols.nupkg -s http://localhost:41538/ topsecret
成功するとぞれぞれ以下のように表示されます。
Your package was pushed.
Visual Sutdioでの設定
実際にパッケージを利用する前に、いくつかVisual Studioの設定をしておきます。
- NuGetのリポジトリ参照の追加
- シンボルサーバの利用および外部ソースの参照の設定
1.NuGetリポジトリの参照の追加
NuGetが参照するリポジトリを追加しておきます。
[ツール]−[オプション]から[パッケージマネージャー]−[パケージソース]から、先ほど設定したNuPeekのサーバのアドレスを指定します。実行時にブラウザで『In the package manager settings, add the following URL to the list of Package Sources: 』に表示されていたアドレスを設定します。例えば以下のようになります。
パッケージの利用
以上で、すべての前準備が整いました。では、実際に使ってみましょう。
適当にWindowsフォーム*5のプロジェクトを新規に作成し、NuGetで先ほど追加したローカルリポジトリからライブラリをインストールしてください。
あとはこんな感じでブレークポイントを設定してデバッグ実行してステップインしていくと…
まとめ
というわけで、上記にように、ローカルのリポジトリでもシンボルサーバを使った開発・デバッグが可能になりました。便利ですね。