お安くプライベートなNugetServerを立ててみよう

今回はプライベートなNugetサーバをお安く作る、という事に挑戦して見ました。

とは言いましても実は非常に簡単。

ここら辺の記事の通りにプロジェクトを用意しAzure WebAppsをFreeプランで作成してデプロイすれば完成です。

まぁただFreeプランは容量が1GBなんでホイホイパッケージをデプロイしていたらあっという間に終わってしまいます。よね?、きっと・・・

でもB1辺りにするとちょっとお高い( ̄^ ̄ ;)

B1がお高いならFreeプランのままAzureStorageにパッケージを保存するようにNuget.Serverを拡張しちゃえばいいじゃない。

ということで誰かがそんな便利な物を作ってないかなぁと検索してみると

ありました。

ちょっと更新年月日が2014年で止まっているのが気になりますのでプロジェクトのGithubを見てみます。

this project is dead for now. I need to put some time into it.
Please let me know if you want to joni and help

ということで更新が止まってしまっています。

これは車輪の再開発するチャンス(*´∀`*)b.:゚+♪

という事でNuget.Serverを拡張する方法を調べて実装を行なって見ました。

本家Githubはこちら

今回再開発した車輪はこちら

IPackageServiceを実装したクラスがNugetサーバへのリクエストコントロールを行いIServerPackageRepositoryを実装したクラスがパッケージの保存や検索などを受け持っています。そしてこれらはIServiceResolverの実装から呼び出されて処理に使用されます。

ですので今回はAzureStorageを使用しましたが実装次第ではDropBoxであってもGithubであっても問題なくNugetServerのリポジトリにすることができます。今回の実装は半端じゃなく手抜きなのでパフォーマンスに問題がありますが、まぁ個人使用であったり少人数での使用でパッケージ数が100未満とかであれば然程問題にならないと思います。

使い方的にはこれらのファイルをNugetサーバプロジェクトにコピーしてNuget.Serverパッケージをインストールした時に作成されるNuGetRoutes.StartのResolverを設定しているコードを

ServiceResolver.SetServiceResolver(new MyServiceResolver(new DefaultServiceResolver()));

みたいに書き換えてWeb.ConfigのAppKeyにAzureConnectionStringを追加してvalueにAzureStorageへの接続文字列をいれればOKです。

実際に実装的には全く大したことはしていなくてPackageはBlockBlobとして保存し、保存の際にパッケージ情報のシリアライズしてbase64エンコードしてmetaタグとして保存して検索時にはmetaタグを元に処理している感じです。本当に適当に書いているので検索毎にbase64デコードしてでシリアライズしてます。

この辺はちゃんと書くのであればパッケージ情報は別にAzureTableで管理するであるとかメモリキャッシュするであるとかする必要があるかと思います。

実際に本家はローカルにパッケージを保存すると同時にパッケージ情報はオンメモリで管理している仕様でした。

またこの実装では保存したパッケージのBlobにメタタグが設定されている前提での実装になっていますが、この状態ではBlobストレージに適当にパッケージをアップロードすれば登録完了(≧∀≦*)b.:゚+イェイ♪っていうことが出来ないので、metaタグが設定されていなかった場合に挙動も実装した方が良いでしょう。

これで100GBくらいパッケージを作っても月々250円くらいで安心して車輪の再開発ができますねヽ(゚▽^*)乂(*^▽゚)ノ バンザーイ♪

ではでは

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.