バージョン管理は私が非常に情熱を持っていることであり、使いやすいバージョン管理システムを考え出すために長い時間を費やしてきました。質問ですでに述べたことから、1つの重要な点を理解していることは明らかです。アセンブリのバージョン番号は、製品のバージョンと同義ではありません。1つは技術的に推進され、もう1つはビジネスによって推進されます。
以下は、何らかの形式のソース管理とビルドサーバーを使用することを前提としています。コンテキストには、TeamCityとSubversion/Gitを使用します。TeamCityは、少数のプロジェクトに対して無料であり、非常に優れたビルドサーバーですが、他にもあり、その一部は完全に無料です。
バージョン番号の意味
ある人にとってバージョンが意味することは、別の人とは異なることを意味する場合があります。一般的な構造は、メジャー、マイナー、マクロ、ミクロです。私がバージョン番号を見る方法は、それを2つの部分に分解することです。前半では、メインバージョン(メジャー)と主要な更新(マイナー)について説明します。後半は、いつビルドされたか、ソースコードのバージョンは何かを示しています。バージョン番号も、API、Webアプリなど、コンテキストに応じて異なる意味を持ちます。
Major
。Minor
。Build
。Revision
Revision
これは、実際に構築されたものを識別するためにソース管理から取得された数値です。
Build
これは、ビルドサーバーで特定のビルドを見つけるために使用できる数が増え続けています。ビルドサーバーが異なるパラメーターのセットを使用して同じソースを2回ビルドした可能性があるため、これは重要な数値です。ビルド番号をソース番号と組み合わせて使用すると、何がどのようにビルドされたかを識別できます。
Minor
これは、パブリックインターフェイスに大幅な変更があった場合にのみ変更する必要があります。たとえば、それがAPIの場合、消費するコードは引き続きコンパイルできますか?メジャー番号が変更されたら、この番号をゼロにリセットする必要があります。
Major
使用している製品のバージョンを示します。たとえば、すべてのVisualStudio 2008アセンブリのメジャーは9で、VisualStudio2010は10です。
ルールの例外
ルールには常に例外があり、それらに遭遇したときに適応する必要があります。私の元々のアプローチはSubversionの使用に基づいていましたが、最近Gitに移行しました。中央リポジトリを使用するSubversionやSourceSafeなどのソース管理には、特定の時間から特定のソースのセットを識別するために使用できる番号があります。これは、Gitなどの分散ソース管理には当てはまりません。Gitは各開発マシンにある分散リポジトリを使用するため、使用できる自動インクリメントの数がないため、チェックインの数を使用するハックがありますが、それは醜いです。このため、私は自分のアプローチを進化させなければなりませんでした。
Major
。Minor
。Macro
。Build
リビジョン番号がなくなり、ビルドが以前のリビジョンにシフトし、マクロが挿入されました。マクロは自分に合った方法で使用できますが、ほとんどの場合、そのままにしておきます。TeamCityを使用しているため、リビジョン番号から失われた情報はビルドで見つけることができます。これは、2段階のプロセスがあることを意味しますが、何も失われておらず、許容できる妥協案です。
何を設定するか
最初に理解することは、アセンブリバージョン、ファイルバージョン、および製品バージョンが一致している必要はないということです。私は異なる番号のセットを持つことを推奨していませんが、依存するアセンブリを再コンパイルする必要がないパブリックインターフェイスに影響を与えないアセンブリに小さな変更を加えると、作業がはるかに楽になります。私がこれに対処する方法は、アセンブリバージョンでメジャー番号とマイナー番号を設定するだけで、ファイルバージョンですべての値を設定することです。例えば:
- 1.2.0.0(AssemblyVersion)
- 1.2.3.4(FileVersion)
これにより、アセンブリのバージョンが一致しないために既存のコードを壊さないホットフィックスをロールアウトできますが、ファイルのバージョン番号を確認することでアセンブリのリビジョン/ビルドを確認できます。これは一般的なアプローチであり、アセンブリの詳細を見ると、一部のオープンソースアセンブリで確認できます。
チームリーダーであるあなたは、重大な変更が必要になったときに、マイナー番号を増やす責任を負う必要があります。必要な変更をインターフェースにロールアウトするが、以前のコードを壊さないための1つの解決策は、現在のコードを廃止としてマークし、新しいインターフェースを作成することです。これは、既存のコードがメソッドが廃止され、いつでも削除できることを警告されていることを意味しますが、すべてをすぐに中断する必要はありません。その後、すべてが移行されたら、廃止されたメソッドを削除できます。
一緒に配線する方法
上記のすべてを手動で行うこともできますが、非常に時間がかかります。以下は、プロセスを自動化する方法です。各ステップは実行可能です。
- すべてのプロジェクトAssemblyInfo.csファイルから
AssemblyVersion
および属性を削除します。AssemblyFileVersion
- 共通のアセンブリ情報ファイル(VersionInfo.csと呼びます)を作成し、リンクされたアイテムとしてすべてのプロジェクトに追加します。
- 値が「0.0.0.0」のバージョンに属性を追加
AssemblyVersion
します。AssemblyFileVersion
- ソリューションファイルをビルドするMsBuildプロジェクトを作成します。
- VersionInfo.csを更新するビルドの前にタスクを追加します。バージョン番号を設定できるAssemblyInfoタスクを含むオープンソースのMsBuildライブラリがいくつかあります。任意の数に設定してテストするだけです。
- ビルド番号の各セグメントのプロパティを含むプロパティグループを追加します。ここでメジャーとマイナーを設定します。ビルド番号とリビジョン番号は引数として渡す必要があります。
Subversionの場合:
<PropertyGroup>
<Version-Major>0</Version-Major>
<Version-Minor>0</Version-Minor>
<Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
<Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
<Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
<Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>
うまくいけば、私は明確になりましたが、多くのことが関係しています。ご不明な点がございましたらお問い合わせください。フィードバックを使用して、より簡潔なブログ投稿をまとめます。