特集:.NET開発の新標準「NuGet」入門(後編)

NuGetをさらに便利に使う方法とパッケージの公開

芝村 達郎
2011/10/14
Page1 Page2 Page3

NuGetパッケージの作成

 最終的にはNuGet galleryで公開を行うが、そのためにはあらかじめパッケージを作成しておく必要がある。まずはパッケージの詳細から説明しよう。

NuGetパッケージと準備

 NuGetを利用してパッケージをプロジェクト内にインストールすると、そのプロジェクトと同じディレクトリに「packages」というディレクトリが自動で生成され、そして各ディレクトリの中には拡張子「nupkg」のファイルが保存されている(次の画面を参照)。そのファイルこそがNuGetで配布されているパッケージの実体だ。

インストールされているパッケージの数だけディレクトリが作成され、中にパッケージの実体が保存されている

 NuGetパッケージは拡張子がnupkgという独自のファイルだが、実体はzip圧縮されたファイルなので、拡張子を変えるだけで展開は可能だ。単なるzipファイルなので、配布したいファイルを用意して圧縮するだけで作成可能のように感じるかもしれないが、NuGetパッケージにはマイクロソフトが開発した「Open Packaging Conventions」という仕様が使われているため、パッケージを作成するためにはコマンドライン版のNuGet.exeを使用する必要がある。

 コマンドライン版NuGetはCodePlexからダウンロードが可能だ。すでにダウンロードしている場合でもバージョンが古い可能性があるので、コマンド・プロンプトを立ち上げてNuGet.exeファイルと同じディレクトリまで移動後、以下のコマンドを入力し、本体のアップデートを行っておくことをお勧めする。

> nuget update -self
NuGet.exe自体のアップデートを行う

 パッケージ作成の準備はこれで整ったので、実際にパッケージとして配布するものを用意しよう。今回はシンプルに.cshtmlファイルだけで動作するヘルパーを作成する。余談になるが、Razor構文には「@helper」というヘルパー定義用の文法が用意されているので、これを用いると簡単にヘルパーを作成できる。

@helper Greeting(string name)
{
  <text>Hello, @name</text>
}
配布するヘルパーのコード(ファイル名は「MyHelper.cshtml」)

定義ファイルを作成

 NuGet galleryや[Manage NuGet Package]ダイアログではパッケージ名以外にもさまざまな情報が表示されているが、これらはパッケージ作成時に記述された拡張子「nuspec」のファイルで定義されている。その定義ファイルの実体はXML形式となっているので、手書きでも問題はないが、コマンドライン版NuGetにはデフォルトのテンプレートを出力するspecコマンドが用意されているので、これを利用する。次のコマンドはその実行例である。

> nuget spec
定義ファイル(.nuspecファイル)のテンプレートを作成するコマンド

 上記のコマンドを実行して生成された.nuspecファイル(ファイル名は「Package.nuspec」となる)は、以下のような内容だ。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>Package</id>
    <version>1.0</version>
    <authors>(ログオンしているユーザー名)</authors>
    <owners>(ログオンしているユーザー名)</owners>
    <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</licenseUrl>
    <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</projectUrl>
    <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <copyright>Copyright 2011</copyright>
    <tags>Tag1 Tag2</tags>
    <dependencies>
      <dependency id="SampleDependency" version="1.0" />
    </dependencies>
  </metadata>
</package>
作成された.nuspecファイルの内容
XML形式で各種情報が定義されている。

 数多くの要素が使われているので、それぞれの要素の意味を見やすいように表にまとめた。

要素名 意味
package* ルート要素
metadata* メタデータ要素
id* パッケージID
version* バージョン番号(1.2.3)
authors 配布物の作者名(カンマ区切りで複数指定が可能)
owners パッケージ作者(カンマ区切りで複数指定が可能)
licenseUrl ライセンスURL
projectUrl プロジェクトURL
iconUrl アイコンURL(ダイアログで表示される、32×32のPNG画像ファイルを推奨)
requireLicenseAcceptance ライセンスへの同意が必要かどうか
description* パッケージの説明
copyright 著作権表示
tags タグ(スペース区切りで複数指定が可能)
dependencies 依存関係(内部に<dependency>要素を複数追加して定義)
生成されたテンプレートに記述されている要素
*の付いた要素は必須となっている

 必須の要素のみを定義すればパッケージの作成には問題ないが、やはりできる限りの情報を定義しておくべきだろう。例えば、WebMatrixでの利用を想定しているならば、前編で説明したように「ASPNETWEBPAGES」タグを付けることなどが挙げられる。基本的には生成されたテンプレートを修正するだけでパッケージを作成することはできるが、.nuspecファイルには今回紹介できなかった要素が数多く存在しているので、各自で公式ドキュメント内の「Nuspec Reference」も参照してもらいたい。

 これで最低限のパッケージ情報は定義できるが、まだ肝心の配布物をどのようにインストールするかを定義していない。配布物の定義は同様に.nuspecファイルに<files>要素を追加して行うが、<files>要素はこれまでの要素とは異なり、指定方法がかなり特殊になっている。そして<files>要素を追加する場所は<metadata>要素内ではなく、その上位の<package>要素内になることも注意だ。

 先に例として今回作成したヘルパーを配布するための定義を示す。

<files>
  <file src="MyHelper.cshtml" target="Content\App_Code" />
</files>
今回作成したヘルパーを配布するための定義例
この例ではMyHelper.cshtmlファイルはインストール時にApp_Codeディレクトリにコピーされる。

 <files>要素の中には1つ以上の<file>要素が存在しなくてはならない。そして<file>要素はsrcとtargetの2つの属性を持っており、src属性が配布されるファイルのパス、target属性がそのファイルがコピーされるパスとなっている。src属性はワイルドカードが使える以外は普通のファイル・パスなので難しいことはないが、target属性は配布するファイルの種類によって指定方法が異なっている。

 例えば、配布するファイルが.cshtmlやJavaScript、CSSなどのソース・コードで、プロジェクト自体に追加する必要がある場合、target属性には、

Content\<プロジェクト内でのコピー先のパス>

のように、先頭に「Content」を付けてパスを指定する必要がある(次のコードはその例だ)。先ほどの例でプロジェクト直下に存在するはずのApp_Codeディレクトリのパスに「Content」を付けていた理由がこれだ。

<files>
  <file src="Scripts\*.js" target="Content\Scripts" />
  <file src="Content\*.css" target="Content\Content" />
  <file src="baz.txt" target="Content" />
</files>
JavaScriptファイル、CSSファイル、テキスト・ファイルは、それぞれScriptsディレクトリ、Contentディレクトリ、プロジェクトのルートにコピーされる

 クラス・ライブラリなど、インストール時に「参照」に加える必要があるファイルの場合には、target属性に「lib」とだけ指定すれば、自動で参照に追加されて使える状態になる。しかし、場合によっては.NET Framework 2.0向けと4向けなど、ランタイムのバージョンによってインストールされるアセンブリを切り替えたいことがあるだろう。さらにSilverlightなどを考えると、パッケージをそれぞれに作る必要がありそうだが、target属性で対象とするランタイムのバージョンを指定できるので(次のコードを参照)、単一のパッケージで複数のランタイムのバージョンをサポートできる。

<files>
  <file src="Net2.0.dll" target="lib\net20" />
  <file src="Net4.0.dll" target="lib\net40" />
  <file src="Silverlight4.dll" target="lib\sl4" />
</files>
上から順番に「.NET 2.0」「4.0」「Silverlight 4」向けの指定となる

 指定可能なターゲットは下記の表のとおりだ。

ランタイム・バージョン ターゲット指定文字列
.NET Framework 2.0 net20
.NET Framework 4 net40
.NET Framework 4 Client Profile net40-client
.NET Framework 4 Full Profile net40-full
Silverlight 3 sl3
Silverlight 4 sl4
Windows Phone 7.0 sl3-wp
Windows Phone 7.1 (Mango) sl4-windowsphone71
target属性で指定可能なターゲットとなるランタイム・バージョン

 そして実際に作成した定義ファイルの内容は以下のようになる。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>Atmarkit.MyHelper</id>
    <version>0.1</version>
    <authors>shiba-yan</authors>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Atmarkit NuGet Package Sample</description>
    <tags>ASPNETWEBPAGES</tags>
  </metadata>
  <files>
    <file src="MyHelper.cshtml" target="Content\App_Code" />
  </files>
</package>
完成した定義ファイルの例

コマンドライン版NuGetでパッケージを作成

 定義ファイルの準備ができたので、実際にパッケージの作成を行おう。コマンドライン版NuGetにはパッケージを作成するpackコマンドが用意されており、パラメータとしてパッケージを作成したい定義ファイルを指定すれば、現在の作業ディレクトリに、

<パッケージID>.<バージョン番号>.nupkg

という名前のパッケージが生成される。

> nuget pack Package.nuspec
定義ファイル(この例では「Package.nuspec」)の情報を基にしてパッケージを作成

 エラー・メッセージが出力されなければパッケージの作成は成功だ。

ローカルでパッケージをテスト

 パッケージが無事に作成されても、配布したいファイルが意図したとおりのディレクトリに追加されるかどうかは、実際にインストールするまでは確認できない。従って、NuGet galleryに登録する前には必ず正しくインストールが行われるかの確認を行っておくべきだろう。NuGetはパッケージの取得場所としてローカルのディレクトリを選択できるので、この機能を利用してインストールのテストを行う。

 (メニューバーの)[ツール]メニューから[Package Manager Settings]を選択すると、NuGetの設定画面が表示される。左側に表示されているツリーから[Package Sources]を選択すると表示される画面から、パッケージを取得する場所を追加/削除できる。デフォルトでは[NuGet official package source]のみが登録されているので、画面の下にあるフォームから場所を追加する。

 具体的には、次の画面のように、[Name:]欄には場所の名前を、[Source:]欄には先ほど作成したパッケージが保存されているディレクトリを選択した後、[Add]ボタンをクリックすると追加は完了だ。

パッケージが保存されているディレクトリを選択して、パッケージ・ソースとして追加する

 これで、指定したディレクトリに存在するパッケージのインストールが可能になったので、実際にインストールをして確認を行う。インストールはコンソールとダイアログのどちらを使用しても構わないが、今回は分かりやすさを重視してダイアログを使ってインストールを行う。

 今までのように[Manage NuGet Package]ダイアログを表示して左側のサイドバーから[Online]を選択すると、[All]と[NuGet official source package]以外に、先ほど設定で追加した名前の項目が増えていることに気が付く(次の画面を参照)。デフォルトでは[All]が選択されているが、追加された項目を選択すると取得場所での絞り込みが行われ、ディレクトリ内にあるパッケージが一覧に表示される。

作成したパッケージが一覧に表示され、インストール可能になっている

 あとは今までと変わらず[Install]ボタンをクリックするとパッケージのインストールが行われるので、意図したとおりにファイルがコピーされて、プロジェクトで使用可能かを確認する。問題なくインストールできることが確認できたら、いよいよNuGet galleryで公開を行おう。


 INDEX
  特集:.NET開発の新標準「NuGet」入門(前編)
  .NETで開発モジュール導入が楽々に! NuGet入門
    1.NuGetの概要/利用場面/インストール
    2.ASP.NET MVCで利用する
    3.WebMatrixで利用する
    4.公開されている代表的なパッケージ
 
  特集:.NET開発の新標準「NuGet」入門(後編)
  NuGetをさらに便利に使う方法とパッケージの公開
    1.さらにNuGetを便利に使う
  2.NuGetパッケージの作成
    3.NuGet galleryで公開


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH