アセンブリのバージョン番号を維持するためのベストプラクティス/ガイダンス


154

.NETアセンブリの3つの異なるアセンブリバージョン番号を管理する方法について、ポインタ、提案、さらにはディクテーションを探しています。これは通常ビジネスによって決定されるように思われるので、製品バージョンは最も単純です。次に、ファイルバージョンはデプロイメント間のバージョン管理用のようで、実際のアセンブリバージョンは出荷時にのみ使用されます。

現在は、依存しないアセンブリのテストおよびメンテナンスリリースにラベルを付ける簡単な方法を探しているだけなので、ファイルバージョンの自動インクリメントビルド番号とリビジョン番号を調べ、最終リリースでは、現在のバージョンをコピーしていますファイルバージョンからアセンブリバージョンへ。製品は本番稼働中ですが、まだ開発中です-ご存知のように-小さな会社の1つであり、変更管理インフラストラクチャの状況はありません。


1
このアウトをチェックしてください... codinghorror.com/blog/2007/02/...
ラーフル曽爾

回答:


211

バージョン管理は非常に情熱的で、使いやすいバージョン管理システムを考案するために長い間費やしてきました。質問ですでに述べたことから、1つの重要なポイントを理解したことは明らかです。アセンブリのバージョン番号は製品のバージョンと同義ではありません。1つは技術的に推進され、もう1つはビジネスによって推進されます。

以下では、何らかの形のソース管理とビルドサーバーを使用することを想定しています。コンテキストには、TeamCityとSubversion / Git を使用します。TeamCityは、少数(10)のプロジェクトでは無料で、非常に優れたビルドサーバーですが、他にも完全に無料なものもあります。

バージョン番号の意味

バージョンが1人の人に何を意味するかは、別の人に別の意味があるかもしれません。一般的な構造は、メジャー、マイナー、マクロ、ミクロです。私がバージョン番号を見る方法は、それを2つの部分に分解することです。前半では、メインバージョン(メジャー)とすべての主要な更新(マイナー)について説明します。後半は、いつビルドされ、ソースコードのバージョンが何であったかを示しています。バージョン番号は、API、Webアプリなど、コンテキストに応じて異なる意味でもあります。

MajorMinorBuildRevision

  • Revision これは、実際に何が作成されたかを識別するためにソース管理から取得した数です。
  • Buildこれは、ビルドサーバーで特定のビルドを見つけるために使用できる、ますます増加する数です。ビルドサーバーが異なるパラメーターセットを使用して同じソースを2回ビルドした可能性があるため、これは重要な数値です。ビルド番号をソース番号と組み合わせて使用​​すると、何がどのようにビルドされたかを識別できます。
  • Minorこれは、パブリックインターフェイスに大きな変更がある場合にのみ変更する必要があります。たとえば、それがAPIである場合、消費するコードはコンパイルできますか?メジャー番号が変更されると、この番号はゼロにリセットされます。
  • Major使用している製品のバージョンを示します。たとえば、すべてのVisualStudio 2008アセンブリのメジャーは9で、VisualStudio 2010は10です。

ルールの例外

ルールには常に例外があり、それらに遭遇したときに適応する必要があります。私の最初のアプローチはsubversionの使用に基づいていましたが、最近はGitに移動しました。中央リポジトリを使用するSubversionやSource Safeなどのソース管理には、特定の時点の特定のソースセットを識別するために使用できる番号があります。これは、Gitなどの分散ソース管理には当てはまりません。Gitは各開発マシンにある分散リポジトリを使用するため、使用できる自動インクリメント数はありません。チェックインの数を使用するハックがありますが、見苦しいです。このため、私のアプローチを進化させなければなりませんでした。

MajorMinorMacroBuild

リビジョン番号がなくなり、ビルドは以前のリビジョンの場所に移動し、マクロが挿入されました。マクロはどのように見えるかを使用できますが、ほとんどの場合はそのままにしておきます。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>

うまくいけば私ははっきりしているが、多くのことが関係している。質問してください。フィードバックを使用して、より簡潔なブログ投稿をまとめます。


GitHubのバージョンタグの使用を検討しましたか?それがパズルにどのように当てはまるのか、私はとても興味があります。
raRaRa 2017

1
@raRaRa-これはかなり古い投稿です。ほとんどの場合、私はまだ待機していますが、私は異なることをすることがあります。NuGetのバージョン管理により、私が行う方法が変わり、ビルドを成功させるためにGitタグを使用していますが、結局のところ、アセンブリのバージョン番号は、ビルドサーバーのビルドバージョンとソース管理のタグバージョンに関連付けられているはずです。
Bronumski、2017

57

[AssemblyVersion]は.NETでは非常に重要です。Microsoftが推奨する1つの哲学は、自動インクリメントを可能にし、アセンブリに依存するすべてのプロジェクトを強制的に再コンパイルすることです。ビルドサーバーを使用すれば大丈夫です。それは間違いではありませことで剣を運ぶ人々に注意してください。

もう1つは、その実際の意味とより密接に関連しており、その数はアセンブリのパブリックインターフェイスのバージョン管理を表すものです。つまり、パブリックインターフェースまたはクラスを変更する場合にのみ変更します。このような変更だけが、アセンブリのクライアントを再コンパイルする必要があるためです。ただし、これは手動で行う必要があります。ビルドシステムは、そのような変更を自動検出するほどスマートではありません。

このアプローチをさらに拡張するには、アセンブリが手の届かない場所にあるマシンに配置されたときにバージョンを増やすだけです。これはMicrosoftが使用するアプローチであり、.NETアセンブリのバージョン番号はほとんど変更されません。主にそれが顧客に与える非常に大きな痛みのためです。

したがって、マイクロソフトが教えていることは、マイクロソフトが実践していることではありません。ただし、そのビルドプロセスとバージョン管理は比類のないものであり、プロセスを監視する専用のソフトウェアエンジニアさえいます。特にうまくいきませんでした。特に、WaitHandle.WaitOne(int)オーバーロードはかなりの痛みを引き起こしました。非常に異なるアプローチの.NET 4.0で修正されましたが、範囲を少し超えています。

ビルドプロセスとリリースサイクルを適切に制御して独自に選択できるかどうかは、どちらかというとあなた次第です。それ以外は、[AssemblyFileVersion]を自動的にインクリメントすることが非常に適切です。ただし、これがサポートされていないという不便があります。


11

自動インクリメントには、バージョン番号のビルド部分を使用できます。

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

ご使用の環境でのテストバージョンは、ビルドバージョン!= 0のバージョンです。リリース時にマイナーパーツをインクリメントし、ビルドパーツを0に設定すると、リリースされたアセンブリを特定できます。

アセンブリをGACにインストールすると、GACには時間の経過とともに多くの異なるバージョンが殺到するため、そのことを覚えておいてください。しかし、ローカルでのみdllを使用する場合、これは良い方法だと思います。


リリースバージョンの0ビルド番号が好きです。
ProfK

1
もちろん、これは、アセンブリの厳密な名前が、ビルドのたびに変更することを意味します。
Richard

9

追加Bronumskisの答えは、私は、セマンティックバージョン2.0標準の後ということを指摘したいsemver.orgMajor.Minor.Build.Revision数を増やした後、右にすべての通常の値がゼロにリセットされなければならないという規則による違法になります。

標準に従うより良い方法は、を使用することMajor.Minor+Build.Revisionです。これは明らかにで使用するためのものではありませんAssemblyVersionAttributeが、代わりにカスタム属性または静的クラスを使用できます。

TeamCityのSemverは、Meta-runner Power Packを使用して利用できるはずです。git-flowを使用したgit(特に.NETの世界)では、GitVersionが役立ちます。


2
興味深いことに、私はこれをチェックします。言及したバージョン番号の形式は、AssemblyInformationalVersion属性で使用できます。
Bronumski、2014年

1

アセンブリのバージョン管理に関しては厳密な規則はありません。どちらでもうまくいくか試してみてください。ただし、変更を加える場合に備えて柔軟性があるので、4パーツアプローチを使用することをお勧めします。将来は。

...例:1.0.0。*

予約済み-これは、将来変更を加えたい場合に備えて、柔軟性を追加します。ただし、デフォルトでは0のままにします。

また、強力なキーでアセンブリに署名することを検討してください。これにより、GACに複数のバージョンのアセンブリが登録されている場合のアセンブリの競合の問題が解決されます。 MSDNリンク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.