ビルドして ZIP にする PowerShell スクリプト

以前に .NET ビルド小技集 (4) という記事を書き、
PowerShell でバージョンをインクリメントしてビルドする方法を紹介しました。
今回は、そのツールを改良したうえで NuGet で公開しました。

Visual Studio のプロジェクトに対して、NuGet で KTools.ZipRelease をインストールすると、
次の PowerShell ファイルがプロジェクトに追加されます。

  • KTools.VersionIncrement.ps1
  • KTools.ZipRelease.ps1

image

エクスプローラー上で PowerShell スクリプトを実行できます。

image

KTools.ZipRelease.ps1 により、以下の処理が実行されます。

  • バージョン番号のインクリメント (KTools.VersionIncrement.ps1 の呼び出し)
  • MSBuild.exe を利用して Release ビルド
  • ビルドの結果を ZIP ファイルにする
    • ファイル名は「AssemblyName-x.y.z.zip」の形式
    • 既定ではプロジェクト フォルダーの下の「zip」フォルダーに作成される

image

 

KTools.VersionIncrement.ps1 により、AssemblyInfo.cs 内の
AssemblyVersion 属性および AssemblyFileVersion 属性の値のビルド番号を 1 だけ増加させています。
例えば、1.0.2.0 が 1.0.3.0 に、1.0.2 が 1.0.3 に、1.0.2-alpha が 1.0.3-alpha に変わります。

ちなみに、バージョン番号は .exe および .dll ファイルのプロパティに反映されます。

image

PowerShell スクリプトのため、各自の要件に合わせてカスタマイズできるでしょう。
また、バージョン番号のインクリメントについては、
KTools.VersionIncrement として単独でインストールして使うことができます。

 

技術的には、以下の特徴が挙げられます。
ソースコードは ZIP-Release (GitHub) にあります。

  • PowerShell の中で C# を利用
  • 値を変更する処理で正規表現を利用
  • .csproj ファイルからの値の読み込みに XPath を利用
  • MSBuild.exe のパスを探索 (たいへん)
    • .NET Framework 付属の MSBuild より Visual Studio 付属の MSBuild を優先

 

作成したツール
ZIP-Release (GitHub)

参照
.NET ビルド小技集 (4)
.NET Framework の正規表現
.nuspec リファレンス
NuGet Package Version Reference

広告

.NET ビルド小技集 (2)

前回の .NET ビルド小技集 (1) では、プロジェクトのビルド イベントを利用しました。
今回はビルド イベントで ZIP ファイルを作成する方法についてです。

 

ZIP ファイルを作成する

前回説明したファイルのコピーに加えて、ビルドにより出力された実行ファイル一式を圧縮して ZIP ファイルにします。
PowerShell では .NET のライブラリを利用することができるため、
PowerShell スクリプトで ZIP ファイルを作成することにします。
(PowerShell には圧縮のための Compress-Archive Cmdlet があったりもしますが。)

まず、ZipFile.CreateFromDirectory メソッドをラップしたスクリプトを用意します。
引数は、アセンブリのディレクトリと ZIP ファイルのパスです。

そして、前回のプロジェクトのビルド イベントでこのスクリプトを呼び出します。

cd $(ProjectDir)
xcopy Data $(OutDir)Data /D/E/C/I/H/Y
powershell -ExecutionPolicy Unrestricted ..\Tools\CreateZip.ps1 $(OutDir) ..\Downloads\$(TargetName).zip

これで、ビルドのたびに ZIP ファイルが作成されます。

image

 

ちなみに、PowerShell では C# のコードを埋め込むことができます。
次のようにしても同様の結果が得られます。

 

ZIP ファイルの名前にバージョンを含める

さらに、ZIP ファイルの名前を、App1-1.0.0.zip のようにバージョン番号が含まれるようにしてみましょう。
バージョン番号として、AssemblyInfo.cs の AssemblyFileVersion 属性に指定された値を取得します。

先ほどの CreateZip.ps1 を拡張して、
対象のアセンブリから AssemblyFileVersion 属性を取得して、
ZIP ファイルの名前が App1-1.0.0.zip の形式になるように組み立てます。
このスクリプトの引数は、アセンブリのパスと出力先のディレクトリとしています。

あとは、プロジェクトのビルド イベントでこのスクリプトを呼び出します。

cd $(ProjectDir)
xcopy Data $(OutDir)Data /D/E/C/I/H/Y
powershell -ExecutionPolicy Unrestricted ..\Tools\CreateZipForAssembly.ps1 $(TargetPath) ..\Downloads

AssemblyFileVersion 属性には、「1.0.1-Alpha」のように任意の文字列を指定できるようです。
(ただし、AssemblyVersion 属性は数値または * でなければビルド エラーになります。)

image

実行結果:

image

 

次回は、ビルド自体を PowerShell で実行する方法についてです。

前回: .NET ビルド小技集 (1)
次回: .NET ビルド小技集 (3)

作成したサンプル
BuildSample (GitHub)

バージョン情報
Visual Studio 2013

参照
ZipFile.CreateFromDirectory メソッド

Add-Type
PowerShell の Add-Type と [Reflection.Assembly]
PowerShellスクリプト内でC#コードを書いて使う

Compress-Archive
PowerShell v5 の新機能紹介 – Zipファイルの操作が可能に

カテゴリー: ALM, ツール. タグ: , . 2 Comments »

.NET ビルド小技集 (1)

.NET アプリケーション開発のビルドに関する小技を集めました。
以下の内容の実現方法について取り扱います。

  • ビルド時にファイルをコピーする
  • ZIP ファイルを作成する
  • ZIP ファイルの名前にバージョンを含める
  • PowerShell でビルドする
  • PowerShell でバージョンをインクリメントしてビルドする

2018.02.06 追記: バージョンをインクリメントしてビルドする PowerShell スクリプトを NuGet でインストールできるようにしました。

 

ビルド時にファイルをコピーする

.NET アプリケーションをビルドすると、
プロジェクト フォルダーの下の bin\Debug や bin\Release に実行ファイルが出力されます。
このとき同時に、画像、動画、データなどのコンテンツ ファイルをコピーする方法を紹介します。
(サイズの小さい画像ファイルであればアセンブリ内のリソースとして埋め込んで使いますが。)

よくある方法としては、コンテンツ ファイルをプロジェクトに含めて、プロパティで [出力ディレクトリにコピー] の項目を設定します。
ただしこれだと、ファイルごとに設定しなければならないという欠点があります。

imageimage

 

この欠点を回避するには、プロジェクトのビルド イベントを利用するとよいでしょう。
プロジェクトのプロパティを開き、[ビルド イベント] を選択します。
この画面で、ビルド時に実行するコマンド ラインを指定できます。

ファイルをコピーするには copy、フォルダーをコピーするには xcopy を利用します。

xcopy $(ProjectDir)Data $(TargetDir)Data /D/E/C/I/H/Y

image

$(ProjectDir) などの形式の文字列はマクロと呼ばれるもので、
ソリューションやプロジェクトにとっての特別な文字列を扱うことができます。
[ビルド後の編集] をクリックするとエディターが開きます。
ここではマクロの実際の値を確認しながら自動で挿入できます。

image

 

上記で使用した xcopy の各オプションの説明も挙げておきます。

  • /D コピー元の日付がコピー先の日付より新しいファイルだけをコピーします。
  • /E ディレクトリまたはサブディレクトリが空であってもコピーします。"/S /E" と同じ意味です。
  • /C エラーが発生してもコピーを続けます。
  • /I 指定されたコピー先が存在しない場合、コピー先をディレクトリとしてコピーします。
  • /H 隠しファイルやシステム ファイルもコピーします。
  • /Y 既存のファイルを上書きする前に確認のメッセージを表示しません。

 

このように設定してビルドを実行すれば、出力ディレクトリにコンテンツ ファイルがコピーされます。

image

 

なお、ビルド イベントでコマンド ラインが実行されるときの作業ディレクトリは、
$(TargetDir)、つまり bin\Debug や bin\Release などの出力ディレクトリです。
複数のコマンドを実行する場合など、相対パスにしたほうがわかりやすくなるときは、

cd $(ProjectDir)
xcopy Data $(OutDir)Data /D/E/C/I/H/Y

のように作業ディレクトリを設定するとよいでしょう。

次回は、ビルド時に ZIP ファイルを作成する方法についてです。

次回: .NET ビルド小技集 (2)

作成したサンプル
BuildSample (GitHub)

バージョン情報
Visual Studio 2013

参照
Copy
Xcopy

カテゴリー: ALM, ツール. タグ: . 1 Comment »

NuGet パッケージを作成して公開する

NuGet パッケージ (.nupkg) を作成して公開する方法について記述します。

 

■ 事前準備

  • NuGet Gallery アカウントの作成

NuGet Gallery でアカウントを作成します。
アカウントを作成すると、パッケージの公開に必要な API キーが発行されます。

  • ツール

NuGet パッケージを作成するには、次のいずれかのツールが必要です。
両方とも NuGet – Downloads で入手できます。

・NuGet.exe : コマンドライン ツール
・NuGet Package Explorer : GUI ツール

NuGet Package Explorer があれば、NuSpec ファイルや NuGet パッケージを手軽に作成できます。
ただし、バージョン アップなどで継続的に NuGet パッケージを作成するには、
コマンドライン ツールを利用すると便利です。
以下では、主に NuGet.exe で NuGet パッケージを作成する方法を紹介します。

 

■ Nuspec ファイルを作成する

NuGet パッケージを作成するには、DLL ファイルなどの配布物のほかに、
ID や作者などのメタデータを記述した Nuspec ファイルが必要です。
Nuspec ファイルは拡張子が .nuspec で、XML 形式のファイルです。

Nuspec ファイルのテンプレートは、

nuget spec

を実行すれば得られます。
このファイルに実際のメタデータの値を指定していきます。

Nuspec ファイルの仕様は Nuspec Reference に記述されています。
外部への参照やファイルの追加は、次のように指定します。

  • .NET Framework アセンブリへの参照

<frameworkAssemblies>
  <frameworkAssembly assemblyName="System.Web" />
</frameworkAssemblies>

  • パッケージへの参照

<dependencies>
  <dependency id="jQuery" />
</dependencies>

  • パッケージに含めるファイル

ライブラリとしてプロジェクトの参照に追加するのであれば、

<files>
  <file src="bin\Release\*.*" target="lib\net45" />
</files>

のように指定します。
ファイルとしてプロジェクトに追加するには、lib の代わりに content を指定します。
なお、<files> は <package> の子要素 (<metadata> の兄弟要素) のため注意が必要です。

 

■ NuGet パッケージを作成する

NuGet パッケージ (.nupkg) を作成するには、次のコマンドを実行します。

nuget pack MyLibrary.nuspec

 

■ NuGet パッケージを公開する

NuGet パッケージを公開するには、次の方法があります。

  • コマンドライン

次のコマンドを実行します。

nuget setapikey XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
nuget push MyLibrary.1.0.0.0.nupkg

setapikey を一度実施すれば API キーが保存されるようです。

  • NuGet Package Explorer

NuGet Package Explorer を利用する場合、API キーは毎回指定しなければならないようです。

  • NuGet Gallery

NuGet Gallery でアップロードする場合、API キーを指定する必要はありません。

なお、公開前にローカルの環境でインストールを試すことができます。
そのためには、Visual Studio のオプションでパッケージ ソースにローカル ディレクトリを追加します。

 

■ プロジェクトから NuGet パッケージを作成する方法

一部のメタデータを自動的に補完させる方法もあります。
これは、アセンブリをライブラリとして (target="lib\xxx") パッケージを作成する場合に利用できます。

プロジェクト フォルダー (.csproj などが存在するフォルダー) を作業フォルダーにして

nuget spec

を実行すると、$id$, $version$, $title$, $author$, $description$
というプレースホルダーが含まれた Nuspec ファイルが作成されます。
これらのプレースホルダーには、AssemblyInfo.cs などに記述されたアセンブリ属性の値が利用されます。

あとは、このフォルダー上で

nuget pack

を実行します。
ただし、これだと既定では Debug ビルドされたファイルからパッケージを作成してしまいます。
Release ビルドされたファイルを利用するには、次のコマンドを実行します。

nuget pack -Prop Configuration=Release

 

■ その他のツール

NuGet Packup を使うと、
必要な情報をすべて AssemblyInfo.cs に指定しておくことで NuGet パッケージを作成できます。

NuGet Packup - AssemblyInfo.cs

 

参照
NuGet Gallery
Nuspec Reference
NuGet (CodePlex)
NuGet Package Explorer (CodePlex)

NuGet – NuGet でプロジェクト ライブラリを管理する
NuGet – パッケージを作成して NuGet で公開する
.NET開発の新標準「NuGet」入門(後編)
NuGet Packup (GitHub)

カテゴリー: ツール. タグ: , . 2 Comments »

jQuery の IntelliSense

Visual Studio では、JavaScript に対しても IntelliSense (入力補完機能) を利用できます。
VS 2010でのJavaScript IntelliSenseの改善で説明されている通り、メンバーやその型などが動的に推論されます。

一方で、推論できない部分に対しては XML ドキュメント コメントを記述することで解決できます。
具体的には、関数の説明を表示したり、変数および戻り値の型を明示したりできます。
C# の XML ドキュメント コメントに近い形式で記述します。

しかし、本番環境では転送量を削減するため、空白やコメントを除去して軽量化した JavaScript ファイルを使うことがあります。
例えば jQuery であれば、jquery-1.8.3.min.js のような名前のファイルです。
そのような状況で開発する場合、<script src="~"> には軽量化した JavaScript ファイルのパスを指定しつつ、
XML ドキュメント コメントを利用したいと思うでしょう。
Visual Studio は、これに対応できる機能を備えています。

■ 自分のサイトに jQuery を配置する場合

実際に Visual Studio 2010 で、「ASP.NET Web アプリケーション」または
「ASP.NET MVC 2 Web アプリケーション」のテンプレートからプロジェクトを作成してみると、
jQuery としては次の 3 種類のファイルが含まれています。

  • jquery-1.4.1-vsdoc.js (XML ドキュメント コメントあり)
  • jquery-1.4.1.js (通常版)
  • jquery-1.4.1.min.js (軽量版)

jQuery 1.4.1 の XML ドキュメント コメント

<script src="~"> で jquery-1.4.1.min.js を読み込んでコードを記述してみます。

jQuery 1.4.1 の IntelliSense

このように、<script src="~"> に xxx.js または xxx.min.js が指定された場合、
同じ階層に xxx-vsdoc.js が存在するとその XML ドキュメント コメントが適用されます。
デバッグ時のステップ実行には、<script src="~"> で指定されたファイルが適用されます。

なお、jQuery 1.4.1 では XML ドキュメント コメントが日本語で記述されています (Visual Studio が日本語版の場合)。
jQuery の初心者が学習しながら実装していくには最適な環境だと思います。

ただし、これよりも後のバージョンでは日本語化されていないと思います。
「ASP.NET MVC 3 Web アプリケーション」のテンプレートに含まれている jQueryのバージョンは 1.5.1 ですが、
この XML ドキュメント コメントは英語で記述されています。

■ 外部の CDN 上の jQuery を参照する場合

リモートの jQuery を参照する場合も、原理は同様です。
CDN として Microsoft Ajax Content Delivery Network を利用すると便利です。
この CDN では、先ほどと同様の 3 種類のファイルがホストされています。

jQuery 1.8.3 の IntelliSense

■ JavaScript ライブラリを自作する場合

JavaScript ライブラリを自分で作成する場合は、
xxx-vsdoc.js にコードおよび XML ドキュメント コメントを記述して開発し、
Microsoft Ajax Minifier などの軽量化ツールで xxx.min.js を生成すればよいでしょう。

■ Visual Studio 2012 の新機能

Visual Studio 2012 では、上記で紹介した機能に加えて次の機能が使えるようになりました。

  • 関数のオーバーロードを表現するための <signature> タグ
  • XML ドキュメント コメントのみを記述できる xxx.intellisense.js ファイル。

jQuery 1.7.1 の IntelliSense

バージョン情報
Visual Studio 2010, 2012

参照
Microsoft Ajax Content Delivery Network
Microsoft Ajax Minifier
JavaScript IntelliSense (MSDN)
XML ドキュメント コメント (JavaScript) (MSDN)
VS 2010でのJavaScript IntelliSenseの改善
Visual Studio 2012 の jQuery インテリセンスとコード スニペット

コード スニペットの作成

Visual Studio で開発する場合、使用頻度の高いコードの断片をコード スニペットとして事前に定義しておくと便利です。

例えば、パブリック メソッドでは引数の値が null でないことを検証するために、
次のようなコードを記述することがよくあります (C# の場合)。


public void Method1(string parameter1)
{
    if (parameter1 == null)
    {
        throw new ArgumentNullException("parameter1");
    }

    ・・・ (以下省略) ・・・
}


そこで、以下では この if 節のコード ブロックをスニペットとして作成します。

Visual Studio 2010 の既定のコード スニペットは
「%ProgramFiles%\Microsoft Visual Studio 10.0\VC#\Snippets\1041\Visual C#」フォルダーに格納されているので、
それらを参考にするとよいでしょう。

では、コード スニペットの作成手順を以下に示します。

  1. 次の内容を UTF-8 でファイルに保存する。ファイル名を argnull.snippet とする。

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2008/CodeSnippet">
      <CodeSnippet Format="1.0.0">
        <Header>
          <Title>argnull</Title>
          <Shortcut>argnull</Shortcut>
          <Description>null でないことを検証するためのコード スニペット</Description>
          <Author>(作者名)</Author>
          <SnippetTypes>
            <SnippetType>Expansion</SnippetType>
          </SnippetTypes>
        </Header>
        <Snippet>
          <Declarations>
            <Literal>
              <ID>parameter</ID>
              <ToolTip>引数の名前</ToolTip>
              <Default>parameter</Default>
            </Literal>
          </Declarations>
          <Code Language="CSharp">
            <![CDATA[if ($parameter$ == null)
    {
        throw new ArgumentNullException("$parameter$");
    }
    $end$]]>
          </Code>
        </Snippet>
      </CodeSnippet>
    </CodeSnippets>


  2. 作成した argnull.snippet を
    「C:\Users\(ユーザー名)\Documents\Visual Studio 2010\Code Snippets\Visual C#\My Code Snippets」フォルダー
    (Windows 7 の場合) に配置する。

手順は以上です。次回 Visual Studio を起動したときに利用可能になります。
[ツール] – [コード スニペット マネージャー] を開くと、「My Code Snippets」の中に現れるはずです。

コード スニペットを利用するときは、
C# のコード内で「argnull」と入力して Tab キーを 2 回入力します。
するとコード ブロックが自動的に挿入されるので、続けて引数の名前を入力すれば完了です。

バージョン情報
Visual Studio 2010

参照
IntelliSense コード スニペットの作成と使用 (MSDN ライブラリ)

カテゴリー: ツール. タグ: . 1 Comment »

Visual Studio の初心者向けデモ (Silverlight 編)

初心者用のセミナーなどでは Visual Studio の開発生産性を示すデモがよく行われます。
Windows フォーム編WPF 編に引き続き、
Silverlight 上のグリッドを特定のテーブルにバインドさせるだけの簡単なサンプルを作成する手順について記述します。
Northwind データベースの Products テーブルを対象とします。
Windows フォームとは違って、データの保存はできません。
  1. Visual Studio を起動する。
  2. (1) [ファイル] – [新規作成] – [プロジェクト] をクリックし、
         テンプレートから [Silverlight アプリケーション] を選択して [OK] をクリックする。
    (2) [WCF RIA サービスを有効にする] チェック ボックスをオンにし、[OK] をクリックする。
      → ソリューションおよびプロジェクトが作成される。
  3. (1) [プロジェクト] – [新しい項目の追加] をクリックし、
         テンプレートから [ADO.NET Entity Data Model] を選択して [追加] をクリックする。
    (2) [次へ] をクリックする。
    (3) [新しい接続] をクリックする。
    (4) [localhost\SQLEXPRESS] サーバーの [Northwind] データベースを選択して [OK] をクリックする。
    (5) [次へ] をクリックする。
    (6) [Products] テーブルを選択し、[生成されたオブジェクトの名前を複数化または単数化する] チェック ボックスを
         オンにして [完了] をクリックする。
      → SilverlightApplication1.Web プロジェクトに Model1.edmx が作成される。
  4. [ビルド] – [ソリューションのビルド] をクリックする。
  5. (1) [プロジェクト] – [新しい項目の追加] をクリックし、テンプレートから [Domain Service Class] を選択して [追加] をクリックする。
    (2) [Product] の [Enable editing] チェック ボックスをオンにして [OK] をクリックする。
      → SilverlightApplication1.Web プロジェクトに DomainService1.cs が作成される。
  6. MainPage.xaml を表示させ、[データ] – [データ ソースの表示] をクリックする。
      → [データ ソース] ウィンドウが表示される。
  7. [データ ソース] ウィンドウの [Product] を MainPage.xaml にドラッグ アンド ドロップする。
      → DataGrid が配置される。
  8. productDataGrid を右クリックし、[レイアウトのリセット] – [すべて] をクリックする。
      → productDataGrid の領域が最大限に広がる。

  9. [デバッグ] – [デバッグなしで開始] をクリックする。
      → 作成されたアプリケーションが起動する。

 
バージョン情報
Silverlight 4
.NET Framework 4
Visual Studio 2010 + Silverlight 4 Tools
 
参照