きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

プライべートなNuGetリポジトリでプライベートなシンボルサーバーを使う

NuGetには対象のライブラリの他に、デバッグシンボルとソースを含んだシンボルパッケージ(Symbol Package)を作成することが出来ます。公式のNuGetギャラリーで公開する場合、SymbolSource.orgにシンボルパッケージをデプロイすることで自動的にパッケージを関連付けてPDBファイルをダウンロードし、Visual Studioソースコードにステップインを行うことができます。


これを『ローカルネットワーク上のプライベートリポジトリでも行えないか?』と思って調べてみると、NuGet.Serverを拡張したNuPeekというプロダクトがありました。
これを試してみたので、以下のステップでエントリにまとめてみたいと思います。

  1. NuPeekの準備
  2. ライブラリおよびシンボルパッケージの作成と配置
  3. Visual Sutdioでの設定
  4. パッケージの利用

<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にズバリの記述があります。@さんが日本語訳して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.パッケージの配置

作成したライブラリとシンボルのそれぞれのパッケージを配置します。
ライブラリのパッケージは以下のように配置します。


nuget push <パッケージ名> -s <リポジトリサーバ>
リポジトリサーバのアドレスはAPI Keyは、先ほどの実行画面にそのまま指定すべき値が例示されますので、それを参考にしてください。このlコマンドで、ライブラリおよびシンボルの双方のパッケージを発行します。

今回の私の環境の例では以下のようになります。


ライブラリパッケージ:


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の設定をしておきます。

  1. NuGetのリポジトリ参照の追加
  2. シンボルサーバの利用および外部ソースの参照の設定
1.NuGetリポジトリの参照の追加

NuGetが参照するリポジトリを追加しておきます。
[ツール]−[オプション]から[パッケージマネージャー]−[パケージソース]から、先ほど設定したNuPeekのサーバのアドレスを指定します。実行時にブラウザで『In the package manager settings, add the following URL to the list of Package Sources: 』に表示されていたアドレスを設定します。例えば以下のようになります。

2.ソースサーバー サポートを有効にする

次に、ソースサーバーのサポートを有効にします。
同じくオプションダイアログから、[デバッグ]−[全般]ノードの『ソースサーバー サポートを有効にする』をチェックして有効にしておきます。

3.外部コードのステップインを許可する

同じくオプションの[デバッグ]−[全般]ノードにて、『マイコードのみを有効にする』のチェックを外して無効にします。

4.シンボルサーバを追加する

さらに、[デバッグ]−[シンボル]ノードにて、シンボルサーバを追加します。シンボルサーバのアドレスや指定方法は、NuPeek実行時のブラウザ上で『Use the address below in the symbols settings of Visual Studio: 』以下に指定された値になります。
例えば以下のようになります。



パッケージの利用

以上で、すべての前準備が整いました。では、実際に使ってみましょう。

適当にWindowsフォーム*5のプロジェクトを新規に作成し、NuGetで先ほど追加したローカルリポジトリからライブラリをインストールしてください。


あとはこんな感じでブレークポイントを設定してデバッグ実行してステップインしていくと…


ちゃんとステップインできました!

まとめ

というわけで、上記にように、ローカルのリポジトリでもシンボルサーバを使った開発・デバッグが可能になりました。便利ですね。

*1:NuRepというこれの前身のプロジェクトと間違えないように注意してください。私は最初こっちをとってきてしまって、うまく動かなくて苦労しました

*2:試してないですが、現在の最新3.3.1.0でcontentsペインにフォルダ追加するときにsrcとか出てくるので、普通にできると思います

*3:csprojからnuspecを生成すると、$hoge$なプレースホルダが記述されます。この値はパッケージ作成時にAssenblyInfo等の記述から動的にリプレースされます

*4:気にならない人はそのままでもいいです

*5:別にWPFでもコンソールでもなんでもいいです