tech.guitarrapc.cóm

C#, PowerShell, Unity, Cloud, Serverless Technical Update and Features

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 pushchoco push して Chocolatey などに登録すれば、あっという間にOneGet で利用できるようになります。

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

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

概要

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

creative.adobe.com

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

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

目次です。

GitHub

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

github.com

NuGetServer の構築

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

f:id:guitarrapc_tech:20150904025426p:plain

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

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

f:id:guitarrapc_tech:20150904025709p:plain

f:id:guitarrapc_tech:20150904025725p:plain

NuGet.Server の導入

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

Install-Package NuGet.Server

f:id:guitarrapc_tech:20150904025845p:plain

参照がごそっと入って

f:id:guitarrapc_tech:20150904030100p:plain

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

f:id:guitarrapc_tech:20150904030036p:plain

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

f:id:guitarrapc_tech:20150904030759p:plain

f:id:guitarrapc_tech:20150904030832p:plain

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

f:id:guitarrapc_tech:20150904030925p:plain

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

f:id:guitarrapc_tech:20150904031024p:plain

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

gist.github.com

f:id:guitarrapc_tech:20150904034003p:plain

NuGet.Server の設定編集

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

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

  • apikey
  • nupkg の配置パス
apikey

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

gist.github.com

f:id:guitarrapc_tech:20150904031732p:plain

f:id:guitarrapc_tech:20150904031746p:plain

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

f:id:guitarrapc_tech:20150904031908p:plain

nupkg の配置パス

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

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

f:id:guitarrapc_tech:20150904032042p:plain

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

f:id:guitarrapc_tech:20150904040203p:plain

nupkg の作成

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

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

NuGet のダウンロード

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

Installing NuGet

f:id:guitarrapc_tech:20150904032601p:plain

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

f:id:guitarrapc_tech:20150904034155p:plain

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

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

gist.github.com

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

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

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

gist.github.com

f:id:guitarrapc_tech:20150904034630p:plain

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

f:id:guitarrapc_tech:20150904034819p:plain

push してみる

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

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

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

f:id:guitarrapc_tech:20150904035009p:plain

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

gist.github.com

f:id:guitarrapc_tech:20150904035204p:plain

配置できていますね。

f:id:guitarrapc_tech:20150904035230p:plain

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

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

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

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

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

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

f:id:guitarrapc_tech:20150904040115p:plain

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

gist.github.com

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

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

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

Name                             ProviderName     IsTrusted  IsRegistered IsValidated  Location
----                             ------------     ---------  ------------ -----------  --------
MyOneGet                         Chocolatey       True       True         True         http://localhost:33478/nuget
パッケージの検索

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

gist.github.com

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

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

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

f:id:guitarrapc_tech:20150904040720p:plain

f:id:guitarrapc_tech:20150904040737p:plain

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

f:id:guitarrapc_tech:20150904040903p:plain

f:id:guitarrapc_tech:20150904040915p:plain

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

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

f:id:guitarrapc_tech:20150904041938p:plain

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

gist.github.com

f:id:guitarrapc_tech:20150904042411p:plain

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

f:id:guitarrapc_tech:20150904042730p:plain

まとめ

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

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

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

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

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

www.visualstudio.com

f:id:guitarrapc_tech:20150904041207p:plain

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

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

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