tech.guitarrapc.cóm

Technical updates

PackageManagement (aka. OneGet) の プライベートパッケージソースを NuGet Server で立ててみよう

OneGetでは、パッケージの取得先のことをパッケージソース (PackageSource)と呼びます。OneGetにはデフォルトで2つのパッケージソース(PackageSource) が入っています。*1

Get-PackageSource
Name                             ProviderName     IsTrusted  IsRegistered IsValidated  Location
----                             ------------     ---------  ------------ -----------  --------
nuget.org                        NuGet            False      True         False        https://www.nuget.org/api/v2/
PSGallery                        PSModule         False      True         False        https://www.powershellgallery...

必要に応じてChocolateyなども登録できるので、自分のパッケージをnuget pushnuget pushしてChocolateyなどに登録すれば、あっという間にOneGetで利用できるようになります。

しかしChocolateyに社内で利用するパッケージを公開すると、同時に世界に公開されてしまいます。そう、プライベートなパッケージソースは自分達で構築しないとなのです。

そこで今回は「自社だけに配信するためのプライベートなパッケージソースを立てて、利用する方法」を説明します。

概要

今回は、Creative Cloud デスクトップアプリをプライベートパッケージソースから配信するようにしてみましょう。いたって簡単です。

https://creative.adobe.com/ja/products/creative-cloud

プライベートなパッケージソースを作るには、プリべートNuGet Serverを立てるだけです。OneGetは、NuGet Feedを解釈できるので、NuGet Serverでいいのですね。

これだけでピンと来る人は、通常のNuGet Server構築とほぼ変わりません。以降適当に流し読みどうぞ。

GitHub

この記事の内容をあげておいたので、ご自分で試すときにでもどうぞ。

https://github.com/guitarrapc/MyOneGetServer

NuGetServer の構築

Visual Studui 2015で作成したNuGet ServerをWindows 10 + IIS 10から配信してみましょう。もちろんAzure Web Appsでも、Windows Server 2012 R2上のIIS 8でも問題なく実行できます。

ASP.NET 空プロジェクトの作成

早速New Projectから、ASP.NET Web Applicationを作成します。名前は適当にMyOneGetServerとしました。

NuGet.Server の導入

Package Manager ConsoleからNuGet.Serverを入れます。

Install-Package NuGet.Server

参照がごそっと入って

プロジェクト構成がこのようになります。

あとはプロジェクトのプロパティ -> Webにいって、IISにデプロイするようにしておいて

デバッグ実行してみると?

構築終わりです。簡単。Azureでもどこでもデプロイしたらいいでしょう。*2

もしデバッグ実行やIISにホストしたポートがファイアウォールで空いてない場合は開けておきましょう。

https://gist.github.com/guitarrapc/075e4d73c1769f6a1dc1

NuGet.Server の設定編集

さて、実際にパッケージをNuGet Serverからフィード(配信) するには、.nupkg を所定のパスに置く必要があります。NuGet.Serverではこういった設定はWeb.Configから行えます。

今回は2点設定しておきましょう。

  • apikey
  • nupkgの配置パス

apikey

API Keyを必要とするのは、pushとdeleteの時です。PowerShellやLinqPadで適当にGuidを生成しておけばいいでしょう。

https://gist.github.com/guitarrapc/49f28bb5b1d7087cdedd

この値をweb.configのapikeyにいれれば完了です。

nupkg の配置パス

apikey同様に、web.configのpackagesPathにnupkgを設置したいパスを指定します。指定しなければ、~/Packagesになります。

今回は、C:\Packagesに設置することにしましょう。

これで、再びデバッグ実行すると、C:\Packagesがフィード元になっていることが表示されます。

nupkg の作成

NuGetライブラリをリリースしている人は、まぁふつーに作ってください。nuget packしてnuget pushすればokです。

ただし、Chocolateyと同様にソフトウェアインストールを扱うのでちょっといじります。

NuGet のダウンロード

nugetコマンドを扱うので、手元にない人はNuGet.exeをダウンロードしておいてください。

https://docs.nuget.org/consume/installing-nuget

今回は、適当にC:\Packages\nuspecに置いておきます。

パッケージファイルの作成テンプレート

私が実際に使っているnupkg作成テンプレートを公開します。これはAdobe CCをChocolateyプロバイダーとしてOneGetコマンドからインストールするテンプレートです。

https://gist.github.com/guitarrapc/542305b7717a9cfb28c7

面倒なのは、Install-ChocolateyPackageなどの配置ですが、テンプレート通りにやればいいでしょう。

アンインストールを今回用意していませんが、Uninstall-ChocolateyPackageをテンプレートで併せて作成すればいけます。

さっそくテンプレートを実行してnupkgを作成します。

https://gist.github.com/guitarrapc/76cf3f6197197227c307

今回は、こんな感じでNuGetのフィードパスC:\Packagesにnupkgを配置しました。

push してみる

nupkgを作成したら、パッケージをサーバーに配置します。今回のようにweb.configに指定したパッケージ参照元であるC:\Packagesに直接ファイルコピーでもいいです。

が、リモート先にサーバーを立てた後そんなことするのはつらいのでnuget pushで配置します。

push方法は、先ほどからデバッグ実行してあるNugetサーバーのTopに載っています。

このコマンドの通りに実行します。

https://gist.github.com/guitarrapc/fda8fa14d996b4c8f479

配置できていますね。

プライベートパッケージソースを OneGetから利用する

NuGetサーバーを立て終わりました。あとはOneGetから利用するだけです。

早速、PowerShell 5.0をおもむろに立ち上げて見てみましょう。

プライベートパッケージソースOneGet に登録する

最後に利用したい人のOneGetに、作成したMyOneGetを登録します。

さて、作成したNueGetサーバーをOneGetのパッケージソースとして登録する際には、フィード元のURLが必要です。これは、NuGetサーバーにアクセスしたときのTop画面に表示されています。

パッケージソースの登録もコマンド1つです。

https://gist.github.com/guitarrapc/d3c9c2d84290d4965b8a

もしGet-PackageSourceでChocolateyがない人は先に登録してください。

Name                             ProviderName     IsTrusted  IsRegistered IsValidated  Location
----                             ------------     ---------  ------------ -----------  --------
chocolatey                       PSModule         True       True         False        https://chocolatey.org/api/v2/

Chocoalateyが登録されていれば、MyOneGet登録できましたね。

Name                             ProviderName     IsTrusted  IsRegistered IsValidated  Location
----                             ------------     ---------  ------------ -----------  --------
MyOneGet                         Chocolatey       True       True         True         https://localhost:33478/nuget

パッケージの検索

パッケージを検索するには、 Find-Packageです。このときにFind-PackageからMyOneGetに絞ることで結果を限定できます。

https://gist.github.com/guitarrapc/4a778e027c28b907a5e3

作成したnupkgが表示されますね。

Name                           Version          Source           Summary
----                           -------          ------           -------
Adobe.CreativeCloud            3.2.0.129        https://localh... Adobe Creative Cloud installation through OneGet

もちろん、nupkgをnuget deleteや直接消せば見えなくなります。

nupkgを戻せば元通りですね。

パッケージのインストール

パッケージをインストールするには、VSを使ってる人にはおなじみのInstall-Packageです。Install-PackageからInstall-Packageパイプラインでつなぐこともできるので好きな方法で。

https://gist.github.com/guitarrapc/f2679bcadb6a12973743

パッケージの一覧をGet-Packageで確認するとありますね。というか、これインストール最中ですでにでるという...。

https://gist.github.com/guitarrapc/69c824fa4842234a971e

ふつーにインストールされます。

まとめ

いかがでしょうか。パッケージのメンテナンスを考えると、Chocolateyにあるものをわざわざ手元に持ってくるのもおかしな話です。

しかし、利用シーンはいくつもあるでしょう。

  • 企業内のルールで閲覧先が限定されている場合などでもOneGetから取得するようにしたり
  • 利用可能なソフトウェアを表示したり
  • ソフトウェアのインストールを自動化

などなど。もってこいと言えます。

NuGet.Serverもご覧のとおり簡単に作成できるので、開発経験がなくても気おくれすることもありません。 利用規約内ならVS Communityでnugetを使って作成できますからね!

https://www.visualstudio.com/ja-jp/products/visual-studio-community-vs.aspx

まだまだOneGetは物足りない部分も多いですが、活用できるシーンで使っていくといいと思います。

*1:WMF5.0を以前から触ってた人は、Chocolateyも入っているかと思います

*2:アクセス制御には気を付けましょうね