質問

.NETアセンブリの3つの異なるアセンブリバージョン番号を管理する方法に関するポインター、提案、さらには口述を探しています。これは通常、ビジネスによって決定されるように見えるため、製品バージョンは最も簡単です。次に、ファイルバージョンは、実際のアセンブリバージョンが出荷時にのみ使用される展開間でバージョン化用のようです。

現在、私は依存していないアセンブリのテストとメンテナンスのリリースにラベルを付ける簡単な手段を探しているだけなので、ファイルバージョンの自動インクリメントビルド番号とリビジョン番号を探しています。アセンブリバージョンへのファイルバージョン。この製品は生産の使用中ですが、まだ開発中です - ご存知のように、それらの小さな会社の1つであり、変更制御インフラストラクチャの状況はありません。

役に立ちましたか?

解決

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

以下は、何らかの形のソースコントロールとビルドサーバーを使用することを前提としています。コンテキストには使用します TeamCity およびsubversion/git。 TeamCityは少数のプロジェクトの数で無料で、非常に優れたビルドサーバーですが、他には完全に無料です。

バージョン番号の意味

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

Major.Minor.Build.Revision

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

ルールの例外

ルールには常に例外があり、それらに出会うときに適応しなければなりません。私の元のアプローチは、Subversionの使用に基づいていましたが、最近Gitに移動しました。中央リポジトリを使用するSubversionやSaurce Safeなどのソースコントロールには、特定の時間から特定のソースセットを識別するために使用できる数があります。これは、GITなどの分散型ソース制御には当てはまりません。 GITは、各開発マシンにある分散リポジトリを使用しているため、使用できる自動増分番号はありません。チェックインの数を使用するハックがありますが、醜いです。このため、私は自分のアプローチを進化させなければなりませんでした。

Major.Minor.Macro.Build

改訂番号がなくなり、ビルドは改訂版の場所にシフトし、マクロが挿入されました。マクロを使用する方法を使用することができますが、ほとんどの場合、私はそれをそのままにしておきます。 TeamCityを使用しているため、リビジョン数から失われた情報はビルドで見つけることができます。2段階のプロセスがあることを意味しますが、何も失っておらず、許容可能な妥協です。

何を設定するか

最初に理解することは、アセンブリバージョン、ファイルバージョン、および製品バージョンが一致する必要がないことです。私は異なる数字のセットを持っていることを主張していませんが、依存アセンブリを再コンパイルすることを余儀なくされていない公共インターフェイスに影響を与えないアセンブリに小さな変更を加えると、人生をずっと楽にします。これに対処する方法は、アセンブリバージョンの主要な数字とマイナー数を設定するだけでなく、ファイルバージョンにすべての値を設定することです。例えば:

  • 1.2.0.0(AssemblyVersion)
  • 1.2.3.4(fileversion)

これにより、アセンブリバージョンが一致しないため、ファイルバージョン番号を調べてアセンブリのリビジョン/ビルドを確認できるため、既存のコードを壊さないホットな修正を展開する機能が得られます。これは一般的なアプローチであり、アセンブリの詳細を見るといくつかのオープンソースアセンブリで見ることができます。

チームリードとしてのあなたは、壊れた変更が必要な場合、マイナー数を増やす責任が必要です。インターフェイスに必要な変更を展開するが、以前のコードを壊すのではなく、現在のコードを廃止して新しいインターフェイスを作成するためのソリューションの1つです。つまり、既存のコードは、この方法が時代遅れであり、いつでも削除される可能性があるが、すぐにすべてを破る必要はないことを警告されていることを意味します。その後、すべてが移行されたときに時代遅れの方法を削除できます。

一緒に配線する方法

上記のすべてを手動で行うこともできますが、非常に時間がかかります。以下は、プロセスを自動化する方法です。各ステップは実行可能です。

  • を削除します AssemblyVersionAssemblyFileVersion すべてのProject AssemblyInfo.csファイルからの属性。
  • 共通のアセンブリ情報ファイル(it versioninfo.csを呼び出す)を作成し、すべてのプロジェクトにリンクされたアイテムとして追加します。
  • 追加 AssemblyVersionAssemblyFileVersion 「0.0.0.0」の値を持つバージョンへの属性。
  • ソリューションファイルを構築するMSBUILDプロジェクトを作成します。
  • versioninfo.csを更新するビルドの前にタスクを追加します。バージョン番号を設定できるAssemblyInfoタスクを含む多くのオープンソースMSBuildライブラリがあります。任意の番号とテストに設定するだけです。
  • ビルド番号の各セグメントのプロパティを含むプロパティグループを追加します。ここで、メジャーとマイナーを設定します。ビルドと改訂番号は、引数として渡す必要があります。

転覆して:

<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>

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

他のヒント

AssemblyVersion]は.NETで非常に大したことです。 Microsoftによって奨励されている1つの哲学は、あなたがそれを自動インクリメントにし、強制することです すべて 再コンパイルされるアセンブリに依存するプロジェクト。ビルドサーバーを使用している場合は大丈夫です。それは決してです 間違い やることは、剣を持っている人々に注意してください。

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

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

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

むしろあなたと、ビルドプロセスとリリースサイクルをどれだけうまく制御できるかについての自信があります。それ以外は、[AssemblyFileversion]を自動的に自動化することが非常に適切です。しかし、これは不便なことです いいえ サポート。

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

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

環境では、テストバージョンはビルドバージョン!= 0を備えたバージョンです。リリースでマイナーパーツを増やし、ビルドパーツを0に設定すると、これがリリースアセンブリを識別する方法です。

GACにアセンブリをインストールすると、GACが時間の経過とともに多くの違いのバージョンがあふれているので、それを念頭に置いてください。しかし、DLLをローカルでのみ使用する場合、これは良い習慣だと思います。

追加 Bronumskisの答え, 、セマンティックバージョン2.0標準の後にそれを指摘したい semver.org, Major.Minor.Build.Revision 数を増やした後、右側のすべての通常の値をゼロにリセットする必要があるというルールのために違法です。

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

TeamCityのSemverは、Meta-Runner Power Packを使用して利用できるようにする必要があります。 git-flow(特に.netの世界で)のgitについて、私は見つけました Gitversion 役立つこと。

バージョンのアセンブリに関しては難しいルールはありませんので、どちらがあなたのために機能するかを自由に試してみてください。将来。

...例:1.0.0。*

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top