.NET ビルド小技集 (4)

前回の .NET ビルド小技集 (3) では、PowerShell スクリプトでプロジェクトをビルドして ZIP ファイルを作成しました。
今回はさらに、バージョン番号をインクリメントする方法を追加します。

 

PowerShell でバージョンをインクリメントしてビルドする

前回までの方法では、Release ビルドの前に手動で AssemblyInfo.cs のバージョンを編集しなければなりませんでした。
今回は、バージョンのインクリメントも PowerShell で自動化します。

前回のファイルに IncrementVersion-cs.ps1 を追加しました。
このスクリプトで AssemblyInfo.cs 内の
AssemblyVersion 属性および AssemblyFileVersion 属性の値のビルド番号を 1 だけ増加させています。
例えば、1.0.2.0 が 1.0.3.0 に、1.0.2 が 1.0.3 に変わります。

Add-Type Cmdlet を利用しており実質的には C# のコードで、
文字列の検索・置換には正規表現を利用しています。

 

これで、リリース時にはスクリプトを PowerShell で実行するだけです。

image

実行結果:

image

 

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

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

参照
Add-Type
.NET Framework の正規表現
Build Version Increment Add-In Visual Studio
第4回 ミッション:ビルドを自動化セヨ!

たまに利用する .NET Tips 集
NuGet パッケージを作成して公開する

広告
カテゴリー: ALM, ツール. タグ: , . 3 Comments »

.NET ビルド小技集 (3)

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

 

PowerShell でビルドする

前回までの方法では、ビルドのたびにコンテンツ ファイルがコピーされ、ZIP ファイルが作成されますが、
現実の運用では ZIP ファイルを作成するのは毎回である必要はなく、
アプリをリリースするときの Release ビルドだけでよいでしょう。

そこで今回は、Release ビルドと ZIP ファイルの作成を PowerShell で実行することにします。
ただし、xcopy によるファイルのコピーはデバッグ時にも必要だと考えられるため、プロジェクトのビルド イベントに残します。

image

PowerShell スクリプトで、MSBuild.exe および前回作成した CreateZipForAssembly.ps1 を呼び出します。

 

以上で準備は完了です。
リリース時には AssemblyInfo.cs でバージョンを設定して、この ps1 ファイルを PowerShell で実行します。

image

image

実行結果:

image

 

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

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

バージョン情報
Visual Studio 2013

参照
Build Version Increment Add-In Visual Studio
第4回 ミッション:ビルドを自動化セヨ!

たまに利用する .NET Tips 集
NuGet パッケージを作成して公開する

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

.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 »

PowerShell でデータベースのすべてのデータをエクスポートする

PowerShell では .NET のライブラリを呼び出せるとのことなので、その記述方法を学ぶために、
データベースのすべてのデータを CSV ファイルにエクスポートするスクリプトをサンプルとして作成してみました。
テーブル名をあらかじめ指定しておかなければなりませんでしたが、今回はテーブル名を動的に取得します。
 
アプローチとしては、まず C# で作成し、そのコードを PowerShell スクリプトに置き換えました。
テーブル名はデータベースのメタデータから取得します。
 
C# のコードはこちらです。

string instanceName = @".\SQLEXPRESS";
string databaseName = "Tfs_DefaultCollection";
string outDirPath = "Output";

string commandText = "select [name] from sys.tables order by [name]";
string connectionString = string.Format("Data Source={0};Initial Catalog={1};Integrated Security=True",
    instanceName, databaseName);

DataTable dt = new DataTable();  

using (SqlDataAdapter da = new SqlDataAdapter(commandText, connectionString))
{
    da.Fill(dt);
}  

Directory.CreateDirectory(outDirPath);  

foreach (DataRow dr in dt.Rows)
{
    Process.Start("bcp"string.Format(@"[{2}].[dbo].[{0}] out {3}\{0}.csv -S {1} -T -w -t ,",
        (string)dr[0], instanceName, databaseName, outDirPath));
}  


 
これを PowerShell スクリプトに変換すると、次のようになります。
ファイル名を「ExportData.ps1」として保存します。

$instanceName = ".\SQLEXPRESS"
$databaseName = "Tfs_DefaultCollection"
$outDirPath = "Output"
 
$commandText = "select [name] from sys.tables order by [name]"
$connectionString = [String]::Format("Data Source={0};Initial Catalog={1};Integrated Security=True", $instanceName, $databaseName)
 
$dt = New-Object System.Data.DataTable
$da = New-Object System.Data.SqlClient.SqlDataAdapter($commandText, $connectionString)
[void]$da.Fill($dt)
$da.Dispose()
 
if (-! (Test-Path $outDirPath))
{
    New-Item $outDirPath -type directory
}
 
$dt.Rows | ForEach-Object { bcp ([String]::Format("[{0}].[dbo].[{1}]", $databaseName, $_[0])) out ([String]::Format("{0}\{1}.csv", $outDirPath, $_[0])) -S $instanceName -T -w -t "," }

 
ExportData.ps1 を右クリックして [PowerShell で実行] をクリックするとデータがエクスポートされます。
ちなみに、この例では Team Foundation Server 2010 の既定のチーム プロジェクト コレクションである 
Tfs_DefaultCollection データベースを対象としており、全部で 213 テーブルあります。
 
 
 
注意点
(1) 既定では PowerShell の実行ポリシーが Restricted に設定されているため、.ps1 ファイルを PowerShell で実行できません。
     このことは Get-ExecutionPolicy コマンドレットを実行すれば確認できます。
     実行ポリシーを緩める必要があり、そのためには次のように Set-ExecutionPolicy コマンドレットを実行します。
Set-ExecutionPolicy RemoteSigned
(2) 上記の例ではコレクション内でループさせるために ForEach-Object コマンドレットを使用していますが、
     C# の foreach に近い構文を使用することもできます (Windows PowerShell 入門(5)-制御構文)。
 
(3) 逆に、データをインポートする場合は外部参照制約に注意する必要があります。
     親テーブルから先にデータをインポートしなければなりませんが、
     次のようなクエリでテーブルの親子関係を取得すれば何とかできそうです。
select [ct].[name] as [ChildTableName], [pt].[name] as [ParentTableName]
from sys.foreign_keys as [f]
inner join sys.tables as [ct] on [f].[parent_object_id] = [ct].[object_id]
inner join sys.tables as [pt] on [f].[referenced_object_id] = [pt].[object_id]
参照