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

だるろぐ

とてもだるだるした日記です http://about.daruyanagi.jp/

お知らせ

WebMatrix:NuGet サーバーをたてる

WebMatrix NuGet





というわけで、NuGet.Server を利用してプライベートリポジトリを構築する - しばやん雑記 を参考に自分で NuGet サーバーをたててみた。WebMatrix で。このブログはできるだけ WebMatrix でなんとかやってしまう主義なのです。

プロジェクトを作成する

f:id:daruyanagi:20130405125533p:plain

まず、ASP.NET で「空の Web サイト」テンプレートを選択。最初はテンプレートじゃなくて、クイックスタートで[Empty Site]メニューを選んだのだけど、これだと NuGet が使えないみたい。ちょっと泣いた。

次に NuGet で NuGet Gallery | NuGet.Server 2.2.2 をインストール。

f:id:daruyanagi:20130405125949p:plain

そのとき、あらかじめテンプレートの favicon.ico を削除しておくといい。NuGet.Server にはかわいい favicon が含まれているのだけど、インストールがスキップされてしまう。

f:id:daruyanagi:20130405125850p:plain

下準備はこれで完了。

実行 & 手直し

f:id:daruyanagi:20130405130159p:plain

とりあえず実行するとエラーになる。~/App_Code/DataServices/Routes.cs に少し手を加えないといけないようだ。

using System.Data.Services;
using System.ServiceModel.Activation;
using System.Web.Routing;
using Ninject;
using NuGet.Server;
using NuGet.Server.DataServices;
using NuGet.Server.Infrastructure;
using RouteMagic;

// [assembly: WebActivator.PreApplicationStartMethod(typeof(.NuGetRoutes), "Start")]
[assembly: WebActivator.PreApplicationStartMethod(typeof(NuGetRoutes), "Start")]

// namespace {
namespace ASP {
    public static class NuGetRoutes {
        public static void Start() {
            MapRoutes(RouteTable.Routes);
        }

        private static void MapRoutes(RouteCollection routes) {
            // The default route is http://{root}/nuget/Packages
            var factory = new DataServiceHostFactory();
            var serviceRoute = new ServiceRoute("nuget", factory, typeof(Packages));
            serviceRoute.Defaults = new RouteValueDictionary { { "serviceType", "odata" } };
            serviceRoute.Constraints = new RouteValueDictionary { { "serviceType", "odata" } };
            routes.Add("nuget", serviceRoute);
        }

        private static PackageService CreatePackageService() {
            return NinjectBootstrapper.Kernel.Get<PackageService>();
        }
    }
}

修正個所は二か所かな? WebActivator というのはよくわからないけれど、名前から察するに、おそらくアプリケーションの実行前にメソッドを挿入(インジェクション)するものだと思う。なぜわざわざ型名を .NuGetRoutes としてあったのかはよくわからない。

名前空間は空になっている。アプリケーションの名前空間を入れておこう。WebMatrix で作成するアプリケーションの名前空間は ASP みたいなので、それを加えておく。

追記(13:45)


NuGet をインストールする際、テンプレートにしたがって名前空間が補われるのだけど、Web Pages には名前空間がない(とれない)ので、空白になってしまうということみたいだね。なるほどなるほど。

f:id:daruyanagi:20130405130851p:plain

これでコンパイルは通るのだけど…… http://localhost:43239/nuget/ (ポートはそれぞれの環境ごとに違うので読み替えてくれ)が 404 になってしまう。どうもさきほどの NuGetRoutes.Start() がちゃんとキックされていないみたい。

#~/_AppStart.cshtml

@{
    NuGetRoutes.Start();
}

というわけで、無理やりたたき起こしてやった(ぁ

f:id:daruyanagi:20130405131111p:plain

これでうまく動いた。

f:id:daruyanagi:20130405131421p:plain
f:id:daruyanagi:20130405131127p:plain

http://localhost:43239/nuget/ を NuGet のパッケージソースに加えれば、~/Packages に放り込んだ NuGet パッケージが検索できるようになるぞー!

ExpressWeb へデプロイ

ローカルでそのまま使ってもいいのだけれど、リモートでホストした方が便利だと思う。今回は ExpressWeb へアップロードしたけれど、動作させるためにはエラーを二つ潰す必要がある。

複数サイトバインディング

f:id:daruyanagi:20130405132450p:plain

よくわからんが、エラーメッセージにしたがって Web.config を書き換えればよい。

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

認証スキーム

f:id:daruyanagi:20130405132648p:plain

これまたよくわからんが、ExpressWeb 側で Windows 認証を無効化したらエラーが解消した。

f:id:daruyanagi:20130405132850p:plain

できた! プッシュできるようにしてもいいのだけれど、WebMatrix で管理するなら NuGet パッケージを ~/Packages に追加するのは別に苦じゃないので、今回はパス。