読者です 読者をやめる 読者になる 読者になる

たぷつきません

おなかがでてきた。もうたぷついてるやん。

アセンブリバージョンの管理 その2

 前回のやり方ではビルド番号インクリメントプラグインと自作スクリプトの組み合わせを行ったんだけど、そもそもビルドイベントでスクリプトに手を出してるなら、毒を喰らわば皿まで、いっちゃっていいじゃない!...ってことに気づき、ビルド番号のインクリメントなんて人に任せなくても良いことに気付いた。ワケないワケなーい。
 実はそれよりも、ファイルバージョンに、1.0a とか数字以外の文字を入れたくなったので(about boxに使うので)改造することにした。AssemblyVersionは数字のみで構成しないと怒られるので、ファイルバージョンだけね。

'Usage: CScript //nologo makeVersionInfoTemplate.vbs
Const ForReading = 1, ForWriting = 2
Const adTypeText = 2
Const adCRLF = -1
Const adLF = 10
Const adCR = 13
Const adReadAll = -1
Const adReadLine = -2
Const adWriteLine = 1
Const adSaveCreateNotExist = 1
Const adSaveCreateOverWrite = 2

If WScript.Arguments.Length <> 2 Then
    WScript.Echo "Usage...:" & vbCRLF & " makeVersionInfoTemplate.vbs AssemblyInfo.csパス 出力するAssemblyInfoテンプレートファイル"
    WScript.Quit(1)
End If

fromAssemblyInfoFileName = WScript.Arguments(0)
toAssemblyInfoTemplateFileName = WScript.Arguments(1)

Set InStream = CreateObject("ADODB.Stream")
InStream.Open
InStream.Charset = "UTF-8"
InStream.LoadFromFile(fromAssemblyInfoFileName)
If Err.number > 0 Then
    WScript.Echo "Can't open " & fromAssemblyInfoFileName & " for reading."
    WScript.Quit 1
End If
allText = InStream.ReadText(adReadAll)

'既存のビルド番号を取得
pattern = "\[assembly: AssemblyVersion\(""([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)""\)\]"
Set regEx = New RegExp
regEx.Pattern = pattern
regEx.IgnoreCase = False
regEx.Global = True
Set Matches = regEx.Execute(allText)
If Matches.Count = 0 Then
    WScript.Echo "AssemblyVersion not found."
    WScript.Quit 1
End If
'インクリメントしたビルド番号
IncrementedBuildNumber = CInt(Matches(0).SubMatches(2)) + 1

'置換

pattern = "\[assembly: AssemblyVersion\(""([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)""\)\]"
replacer = "[assembly: AssemblyVersion(""$1.$2." & IncrementedBuildNumber & ".$$WCREV$$"")]"

Set regEx = New RegExp
regEx.Pattern = pattern
regEx.IgnoreCase = False
regEx.Global = True
allText = regEx.Replace(allText, replacer)

pattern = "\[assembly: AssemblyFileVersion\(""([0-9]+)\.([0-9a-z]+)\.([0-9]+)\.([0-9]+)""\)\]"
replacer = "[assembly: AssemblyFileVersion(""$1.$2." & IncrementedBuildNumber & ".$$WCREV$$"")]"

Set regEx = New RegExp
regEx.Pattern = pattern
regEx.IgnoreCase = False
regEx.Global = True
allText = regEx.Replace(allText, replacer)


Set OutStream = CreateObject("ADODB.Stream")
OutStream.Open
OutStream.Charset = "UTF-8"
OutStream.WriteText allText
OutStream.SaveToFile toAssemblyInfoTemplateFileName, adSaveCreateOverWrite
OutStream.Close

Set InStream = Nothing
Set OutStream = Nothing

 これでBuildVersionIncrementとはおさらば。むしろ使っちゃダメ。
 副作用として、そもそもこのソリューション、AssemblyInfo.csを自動更新するので、みんなで開発しているとコンフリクトしまくるんだけどね。。。。

追記

 ていうか、警告が出るね。「'ファイルバージョン'に指定されたバージョン'1.0a.123.123'は正常なmajor.minor.build.version'フォーマットではありません。」文字を入れちゃだめらしい。警告を無視すると、ファイルのプロパティで表示されるバージョン情報が1.0.0.0固定になってしまう。残念。