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

しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

NuGet.Server を利用してプライベートリポジトリを構築する

こんばんは。@IT で NuGet 入門記事が全て公開されてほっとしてます、しばやんです。

今回 @IT 向けに記事を書くにあたって、私が持っている s-software.net ドメイン上に NuGet のプライベートリポジトリを構築していろいろと検証を行いました。プライベートリポジトリの構築は記事にも少しだけ書きましたが「Hosting Your Own NuGet Feeds」に作り方が全部書いています。

しかし、私が使っている ExpressWeb だとそのままでは動かなかったので、そのあたりを補足しながら、楽しい NuGet プライベートリポジトリ生活を楽しんで頂きたいと思います。それでは順番に説明していきます。

空の ASP.NET Web アプリケーションを作成

ついつい癖で ASP.NET MVC 3 向けアプリを作ってしまいかけますが、今回は普通の ASP.NET アプリケーションです。しかも空っぽの奴です。

それでは NuGet.Server をインストールしていきましょう。

NuGet.Server パッケージをインストール

Manage NuGet Packages ダイアログで NuGet.Server と入れるとすぐ出てきます。もしくは

Install-Package NuGet.Server

でも問題ないです。インストールが完了するといろいろとファイルが自動的に追加されています。

中でも Packages というディレクトリは実際の NuGet パッケージが格納されるので重要です。

この時点で Packages ディレクトリに NuGet パッケージを入れるとプライベートリポジトリとして動作します。実際にパッケージを入れ、F5 を押して動かしてみましょう。

NuGet.Server の稼働中画面が出ていますね。一番下に出ているパスはローカルで動作させている時だけ表示されるものです。

そして /nuget へアクセスすると OData でいろいろな情報が取れるわけです。実際には /nuget はエントリポイントなので /nuget/Packages へアクセスしてみると、ブラウザではフィードとして認識されます。

アクセスキーを設定

実行した時に表示されたページに、Web.config に apiKey を設定しろと書いてありました。ローカルで Packages ディレクトリを簡単に弄れるのなら設定は不要ですが、リモートサーバで運用する場合にはパッケージの追加がめんどくさいですね。

そんな時 apiKey を設定しておけば NuGet.exe からプッシュできるようになり便利です。

password と書いてますが、適当に変えてください。これで NuGet.exe からプッシュできるようになりました。非常に簡単ですね。

サーバーにデプロイ

それでは ExpressWeb へデプロイしましょうか。サブドメインを割り当てて、普通にアップロードするだけでいいのですが、実際にアクセスすると以下のようなエラーが出ます。

エラーメッセージの通りに multipleSiteBindingsEnabled="true" を serviceModel に追加して対応しましょう。

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

これでエラーメッセージが表示されなくなり、プライベートリポジトリが動作するようになります。

これでサーバは動作するようになりましたが、このままだとパッケージの追加が出来ません。原因は Packages ディレクトリに書き込み権限がないからなので、ファイルマネージャから書き込み権限を付けてあげましょう。

パッケージを追加

それではパッケージを追加しましょう。コマンドは NuGet gallery と同じですが、-source でプライベートリポジトリの URL を指定し、apiKey に Web.config に書いたものと同じ文字列を指定します。

nuget push -source (url) MyPackage.1.0.nupkg (apiKey)

たったこれだけです。非常に簡単でしたね!

ASP.NET 4 が動作するサーバなら動くはずなので、構築してテスト用と使うもよし、ローカル限定にして使うもよし。NuGet gallery に登録せずに使えるリポジトリ、これは持っていて損はないと思いますよ!