前回の .NET ビルド小技集 (3) では、PowerShell スクリプトでプロジェクトをビルドして ZIP ファイルを作成しました。
今回はさらに、バージョン番号をインクリメントする方法を追加します。
PowerShell でバージョンをインクリメントしてビルドする
前回までの方法では、Release ビルドの前に手動で AssemblyInfo.cs のバージョンを編集しなければなりませんでした。
今回は、バージョンのインクリメントも PowerShell で自動化します。
$msbuild = "C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" | |
.\IncrementVersion-cs.ps1 ..\EmptyConsole | |
$slnFilePath = "..\BuildSample.sln" | |
Invoke-Expression ([string]::Format("{0} {1} /p:Configuration=Release /t:Clean", $msbuild, $slnFilePath)) | |
Invoke-Expression ([string]::Format("{0} {1} /p:Configuration=Release /t:Rebuild", $msbuild, $slnFilePath)) | |
.\CreateZipForAssembly.ps1 ..\EmptyConsole\bin\Release\EmptyConsole.exe ..\Downloads | |
explorer ..\Downloads |
$source = @" | |
using System; | |
using System.IO; | |
using System.Linq; | |
using System.Text; | |
using System.Text.RegularExpressions; | |
public static class Program | |
{ | |
public static int Main(string[] args) | |
{ | |
if (args.Length < 1) return 100; | |
IncrementVersion(args[0]); | |
return 0; | |
} | |
public static void IncrementVersion(string projDirPath) | |
{ | |
var assemblyInfoPath = Directory.EnumerateFiles(projDirPath, "AssemblyInfo.cs", SearchOption.AllDirectories).First(); | |
var contents = File.ReadLines(assemblyInfoPath, Encoding.UTF8) | |
.Select(IncrementLine) | |
.ToArray(); | |
File.WriteAllLines(assemblyInfoPath, contents, Encoding.UTF8); | |
} | |
static string IncrementLine(string line) | |
{ | |
if (line.StartsWith("//")) return line; | |
var match = Regex.Match(line, @"Assembly(File)?Version\(""([0-9\.]+)""\)"); | |
if (!match.Success) return line; | |
var oldVersion = match.Groups[2].Value; | |
var newVersion = IncrementBuildNumber(oldVersion); | |
return line.Replace(oldVersion, newVersion); | |
} | |
static string IncrementBuildNumber(string version) | |
{ | |
return Regex.Replace(version, @"^(\d+\.\d+\.)(\d+)((\.\d+)?)$", m => m.Groups[1].Value + IncrementNumber(m.Groups[2].Value) + m.Groups[3].Value); | |
} | |
static string IncrementNumber(string i) | |
{ | |
return (int.Parse(i) + 1).ToString(); | |
} | |
} | |
"@ | |
Add-Type -TypeDefinition $source -Language CSharp | |
# $Args[0]: project directory path | |
[Program]::Main($Args) |
前回のファイルに 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 で実行するだけです。
実行結果:
2018.02.06 追記: バージョンをインクリメントしてビルドする PowerShell スクリプトを NuGet でインストールできるようにしました。
前回: .NET ビルド小技集 (3)
作成したサンプル
BuildSample (GitHub)
参照
Add-Type
.NET Framework の正規表現
Build Version Increment Add-In Visual Studio
第4回 ミッション:ビルドを自動化セヨ!