Visual StudioでGITを使用する場合のプロジェクトバージョンの半自動インクリメント

多くの記事がインターネット上でアプリケーションのバージョンの増分について書かれており、それぞれ独自の方法を使用しています。 一部のリビジョンはビルドとして使用され、他のリビジョンは現在の秒数(Microsoftなど)、他の誰かのリビジョンです。



私のプロジェクトでは、4つの定義バージョンを使用しています。



たとえば、 1.2.34.56 、ここで:

1-メジャーバージョン:プロジェクトの重要な変更(新しい機能が導入され、既存の機能が根本的に再設計されたなど)。 手動でインストールされます。

2-マイナーバージョン:アプリケーションの機能部分の変更、コードの大幅な改善など。手動でインストール。

24-ビルド:コミュニティに分類されるリリース番号。 自動的に割り当てられます。

56-リビジョン:GITから取得したリビジョン番号。 自動的に割り当てられます。



誰がどの方法を使用するかは考慮しませんので、この結果をどのように達成したかを書きます。







ステップ1.準備



まず、プロジェクト設定に移動する必要があります( プロジェクト -> MyProjectプロパティ )。 ここで、[ アプリケーション ]タブで[ アセンブリ情報 ]に移動し、[ アセンブリバージョン]パラメーターの4つのフィールドすべてが入力されていること、およびリリースに従って最初の2桁が指定されていることを確認します。 私の場合、これはバージョン " 2.3 "で、残りの数字はanyになります。



画像



変更を行ったら、プロジェクトフォルダーに移動してAssemblyInfo.csファイルを見つける必要があります。このファイルは通常、 Propertiesフォルダーにあります。

編集のためにファイルを開き、一番下で行を探します:



// You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("2.3.0.0")] [assembly: AssemblyFileVersion("2.3.0.0")]
      
      







コメント行を削除します。

 // [assembly: AssemblyVersion("1.0.*")]
      
      





これは、新しい表現が、最初に見つかった一致からバージョン(メジャー、マイナー)のキー桁を読み取る正規表現を使用するために必要です。

削除、保存、ファイルを閉じました。 彼はもう必要ありません。



ステップ2.「ChangeRevision」



便宜上、 PropertiesAssemblyInfo.csファイルからmajor、minor、buildの値を読み取るコンソールアプリケーションと、GITコミットの数をコンパイルしました。

したがって、 ChangeRevision.exeコード:



 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.IO; using System.Diagnostics; namespace ChangeRevision { class Program { static void Main(string[] args) { try { Process process = new Process(); process.StartInfo.WorkingDirectory = Environment.CurrentDirectory; process.StartInfo.FileName = "\"c:\\Program Files (x86)\\Git\\cmd\\git.exe\""; process.StartInfo.Arguments = @"rev-list master --count"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardError = true; StringBuilder output = new StringBuilder(); int timeout = 10000; using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false)) using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false)) { process.OutputDataReceived += (sender, e) => { if (e.Data == null) outputWaitHandle.Set(); else output.AppendLine(e.Data); }; process.Start(); process.BeginOutputReadLine(); if (process.WaitForExit(timeout) && outputWaitHandle.WaitOne(timeout)) { string text = File.ReadAllText(@"..\..\..\"+args[1]+@"\Properties\AssemblyInfo.cs"); Match match = new Regex("AssemblyVersion\\(\"(.*?)\"\\)").Match(text); Version ver = new Version(match.Groups[1].Value); int build = args[0] == "Release" ? ver.Build + 1 : ver.Build; Version newVer = new Version(ver.Major, ver.Minor, build, Convert.ToInt16(output.ToString().Trim())); text = Regex.Replace(text, @"AssemblyVersion\((.*?)\)", "AssemblyVersion(\"" + newVer.ToString() + "\")"); text = Regex.Replace(text, @"AssemblyFileVersionAttribute\((.*?)\)", "AssemblyFileVersionAttribute(\"" + newVer.ToString() + "\")"); text = Regex.Replace(text, @"AssemblyFileVersion\((.*?)\)", "AssemblyFileVersion(\"" + newVer.ToString() + "\")"); File.WriteAllText(@"..\..\..\" + args[1] + @"\Properties\AssemblyInfo.cs", text); } } } catch (Exception ex) { Console.WriteLine(ex.Message); Console.WriteLine(""); Console.WriteLine(ex.StackTrace); Console.ReadLine(); } } } }
      
      







コンパイルされたファイルをSolutionディレクトリに配置します。



以下に、このコードがどのように機能するかを詳しく説明します。



ステップ3.ビルド前のイベント



コンパイルする前にビルドバージョンを変更する必要があるため、コードはビルド前イベントウィンドウに適合します。

 "$(SolutionDir)ChangeRevision.exe" $(ConfigurationName) "$(ProjectName)"
      
      







画像



どこで:

「$(SolutionDir)ChangeRevision.exe」 -コンパイル済みファイルの起動を示すソリューションへのパスを指定します。これは上で説明しています。

$(ConfigurationName) -構成のタイプ( デバッグまたはリリース )。

ChangeRevision.exeファイルの実行時にDebugパラメーターが渡された場合、プロジェクトバージョンではリビジョン値のみ増加します 。つまり、2.3.0.0であれば、2.3.0.xになります。ここで、「x」はプロジェクトのコミット数です。 Releaseパラメーターが渡された場合、 ビルド番号は、コミット数だけリビジョンの変更とともに自動的に増分されます。 たとえば、2.3.0.0でしたが、2.3.1.xになります。「x」はプロジェクトのコミット数です。

「$(ProjectName)」 -プロジェクト名



UPD:プロジェクトをコンパイルするときに、パラメーターを含むファイルの開始ディレクトリが$(ProjectDir)\ bin \ Debug / Releaseであったため、エラーが発生したため、プロジェクト名を含むパラメーターはプログラムコードから削除されました。 したがって、 ChangeRevision.exeアプリケーションはスタートアップディレクトリに対して上位レベルへの遷移を使用するため、つまり、パス".. \ .. \ Properties \ AssemblyInfo.cs"を指定することによりプログラムはプロジェクトディレクトリに移動するため、プロジェクト名の転送自体は消滅しました。そこから「プロパティ」まで、必要なAssemblyInfo.csファイルを見つけます



UPD 2:実践で示したように、ソリューションに複数のプロジェクトがあり、コンパイルによってデフォルトではないプロジェクトを選択した場合、開始ディレクトリは何らかの理由でデフォルトのプロジェクトディレクトリになります。 一般に、コードは依然として上部でわずかに変更および変更されています。つまり、プロジェクト名を転送するためのパラメーターは、 ChangeRevision.exeの2番目のパラメーターによってインターセプトされ、再導入されました。 したがって、 AssemblyInfo.csへのパスは次のように変更されました。

 @"..\..\..\" + args[1] + @"\Properties\AssemblyInfo.cs"
      
      





つまり、プロジェクトをコンパイルすると、開始ディレクトリが3ステップ(ソリューションディレクトリ)シフトされ、ファイル起動パラメーターで指定されたプロジェクトフォルダーに移動して、目的のファイルに進みます。



コミットの数は、パラメーターを渡すことで見つけることができます

 git rev-list master --count
      
      





これは、 MASTERブランチからコミット数を取得する必要がある場合です。



アプリケーションが完了すると、プロジェクトの最初のパラメーターで渡されたファイルProperties \ AssemblyInfo.csが変更されます。その後、開発環境は、ファイルで指定されたバージョンでプロジェクト自体のファイルをコンパイルします。

PS: AssemblyVersionのバージョンを変更すると、 AssemblyFileVersionパラメーターの値、場合によってはAssemblyFileVersionAttributeも変更されます。



したがって、アプリケーションバージョンの半自動増分を達成しました。



PS:もちろん、チームとして作業したり、定期的にバージョンをマージしたりすると、このオプションは機能しません。コミットの数が突然減少する可能性があるため、まったく機能しません。したがって 、ソフトウェアの「新しい」「古い」バージョンを取得します。 また、ある人にとっては、バージョンの組み合わせを使用しなくても、このオプションで十分です。



ご清聴ありがとうございました!



UPD:ステップ2でコードを変更しました。説明を修正しました。

UPD 2:同じステップのすべてが再びコード内で変更されます。



All Articles