ソフトウェアのバージョン番号を正しく取得する。v1.0.0.1 [終了]
-
02-07-2019 - |
質問
私はソフトウェアをオンラインで配布していますが、バージョン番号をより適切に定義する適切な方法はないものかと常に考えています。
答えに A.B.C.D があると仮定しましょう。各コンポーネントをいつ増やすのですか?
D mod 2 == 1 は社内リリースのみを意味するなど、他のバージョン番号のトリックを使用していますか?
独自のバージョン番号を持つベータ リリースはありますか? それともバージョン番号ごとにベータ リリースがありますか?
解決
私は、一部のアプリ (例:パーフォース)を使用します。基本的には、リリースした年と、その年の中での順番が記載されているだけです。したがって、2008.1 が最初のバージョンとなり、1 ~ 3 か月後に別のバージョンをリリースすると、2008.2 になります。
このスキームの利点は、リリースの「規模」が暗黙的に示されないことです。メジャー バージョンの増分を保証するほどメジャーな機能であるかどうかについて議論が生じることはありません。
オプションでビルド番号にタグを付けることもできますが、これは内部目的のみである傾向があります (例:これを EXE/DLL に追加すると、ファイルを検査して適切なビルドが存在することを確認できます)。
他のヒント
私の意見では、ほとんどすべてのリリース番号スキームは、多かれ少なかれ正常に機能するようにすることができます。私が取り組んでいるシステムでは、11.50.UC3 などのバージョン番号が使用されています。U は 32 ビット Unix を示し、C3 はマイナー リビジョン (フィックスパック) 番号です。他の文字は他のプラットフォーム タイプに使用されます。(このスキームはお勧めしませんが、機能します。)
これまで明言されていないものの、人々が議論している内容には暗黙的に含まれている黄金律がいくつかあります。
- 同じバージョンを 2 回リリースしないでください。バージョン 1.0.0 が誰かにリリースされると、再リリースすることはできません。
- リリース番号は単調増加するはずです。つまり、バージョン 1.0.1、1.1.0、または 2.0.0 のコードは、常にバージョン 1.0.0、1.0.9、または 1.4.3 (それぞれ) より新しい必要があります。
現在、実際には、新しいバージョンが利用可能である間に、古いバージョンの修正をリリースする必要があります。たとえば、GCC を参照してください。
- GCC 3.4.6 は 4.0.0、4.1.0 (および AFAICR 4.2.0) の後にリリースされましたが、GCC 4.x に追加された機能を追加するのではなく、GCC 3.4.x の機能を継続しています。
したがって、バージョン番号付けスキームを慎重に構築する必要があります。
私が固く信じているもう 1 つの点:
- リリース バージョン番号は、簡単なプログラムを除いて、CM (VCS) システムのバージョン番号とは無関係です。複数のメイン ソース ファイルを持つ本格的なソフトウェアには、単一ファイルのバージョンとは関係のないバージョン番号が付けられます。
SVN では、SVN バージョン番号を使用できますが、予想外に変化するため、おそらく使用しないでしょう。
私が扱っているものに関しては、バージョン番号は純粋に政治的な決定です。
ちなみに、私はバージョン 1.00 から 9.53 までリリースを経て、その後 2.80 に変更されたソフトウェアを知っています。それは重大な間違いでした - マーケティングによって決定されました。確かに、ソフトウェアのバージョン 4.x は廃止された/廃止されたため、すぐに混乱を招くことはありませんでしたが、ソフトウェアのバージョン 5.x はまだ使用および販売されており、リビジョンはすでに 3.50 に達しています。5.x (古いスタイル) と 5.x (新しいスタイル) の両方で動作する必要があるコードが、避けられない競合が発生した場合にどうなるのか、非常に心配しています。古い 5.x が本当に廃止されるまで、彼らがのんびりと 5.x への変更を続けてくれることを期待する必要があると思いますが、私は楽観的ではありません。また、正常に実行できるように、3.50 コードを表すために 9.60 などの人為的なバージョン番号も使用します。 if VERSION > 900
次のことを行うのではなく、テストを行います。 if (VERSION >= 900 || (VERSION >= 280 && VERSION < 400)
, ここで、バージョン 9.00 x 900 を表します。そして、バージョン 3.00.xC3 で導入された重要な変更があります -- 私のスキームはマイナー リリース レベルでの変更を検出できません...不平不満...不平不満...
注意:エリック・レイモンドが提供する ソフトウェアリリースの実践方法 HOWTO これには、リリースの命名 (番号付け) に関する (リンクされた) セクションが含まれます。
私は通常、dをビルドカウンター(コンパイラによる自動増分)として使用します(すべてのビルドがリリースされるわけではありません)にビルドがリリースされるたびにcを増分します。
この質問に答えるには 2 つの方法があると思いますが、それらは完全に相補的なものではありません。
- テクニカル:技術的なタスクに基づいてバージョンを増やします。例:D はビルド番号、C はイテレーション、B はマイナー リリース、A はメジャー リリースです。マイナー リリースとメジャー リリースの定義は非常に主観的なものですが、基盤となるアーキテクチャの変更などに関連する可能性があります。
- マーケティング:顧客に提供されている「新しい」機能または「便利な」機能の数に基づいてバージョンを増やします。バージョン番号を更新ポリシーに関連付けることもできます。A への変更にはアップグレード ライセンスの購入が必要ですが、他の変更にはその必要はありません。
肝心なのは、あなたとあなたの顧客にとって機能するモデルを見つけることだと思います。偶数バージョンがパブリック リリースであり、奇数バージョンがベータ版または開発リリースとみなされているケースをいくつか見てきました。CとDをまとめて無視する製品もいくつか見たことがあります。
次に、Micrsoft の例があります。ここでは、.Net Framework のバージョン番号に対する唯一の合理的な説明は、マーケティングが関与しているということです。
私たちのポリシー:
- A-機能性またはインターフェイスの変更または追加。
- B-機能またはインターフェイスの小さな変更または追加。
- C-インターフェイスを破るマイナーな変更。
- D-インターフェイスを変更しないビルドに修正します。
人々はこれを実際に必要以上に難しくしたい傾向があります。製品に長期存続するブランチが 1 つしかない場合は、ビルド番号で連続したバージョンに名前を付けるだけです。「軽微なバグ修正は無料ですが、主要な新しいバージョンには料金を支払う必要がある」場合は、1.0、1.1 ... を使用してください。1.n、2.0、2.1...等
例の A、B、C、D が何であるかをすぐに理解できない場合は、明らかにそれらは必要ありません。
私がバージョン番号を使用した唯一の用途は、顧客がバージョン 2.5.1.0 などを使用していることを私に伝えるためでした。
私の唯一のルールは、その数値を報告する際の間違いを最小限に抑えるように設計されています。 4 つの数字はすべて 1 桁のみである必要があります.
1.1.2.3
大丈夫ですが、
1.0.1.23
ではありません。顧客は両方の数字を(少なくとも口頭では)「1-1-2-3」と報告する可能性があります。
ビルド番号の自動インクリメントにより、次のようなバージョン番号が得られることがよくあります。
1.0.1.12537
それもあまり役に立ちません。
技術的ではない優れたスキームでは、次の形式でビルド日付を使用するだけです。
YYYY.MM.DD.ビルド番号
ここで、BuildNumber は連続した数値 (変更リスト) か、毎日 1 から始まります。
例:2008.03.24.1 または 2008.03.24.14503
これは主に内部リリース用であり、月に 1 回以上の頻度でリリースしない場合、一般リリースではバージョンが 2008.03 として表示されます。メンテナンス リリースには、2008.03a 2008.03b などのフラグが付けられます。「c」を超えることはめったにありませんが、超えた場合は、より良い QA および/またはテスト手順が必要であることを示す良い指標となります。
ユーザーがよく目にするバージョン フィールドは、わかりやすい「2008 年 3 月」形式で印刷する必要があります。詳細な技術情報は、[バージョン情報] ダイアログまたはログ ファイルに保存してください。
最大の欠点:同じコードを別の日にコンパイルするだけで、バージョン番号が変わる可能性があります。ただし、バージョン管理変更リストを最後の番号として使用し、それと照合して日付も変更する必要があるかどうかを判断することで、これを回避できます。
私はVRMを使用します。2.5.1
V (バージョン) の変更は大幅な書き換えです
R (リビジョン) の変更は、重要な新機能またはバグ修正です。
M (修正) の変更は、マイナーなバグ修正 (タイプミスなど) です。
最後に SVN コミット番号を使用することもあります。
結局のところ、それはすべて非常に主観的なものであり、単にあなた自身/あなたのチーム次第です。
すでに回答されているすべての回答を見てください。どれもまったく異なります。
個人的に私が使っているのは Major.Minor.*.*
- Visual Studio がリビジョン/ビルド番号を自動的に入力します。これは私が働いているところでも使われています。
古い Mac OS に由来する優れたユーザーフレンドリーなバージョン管理スキームについては、次の Apple テクニカル ノートで説明されています。 http://developer.apple.com/technotes/tn/tn1132.html
私は年月日が好きです。 したがって、v2009.6.8 がこの投稿の「バージョン」になります。複製することは(合理的には)不可能であり、何かがより新しいリリースであるかどうかは非常に明確です。小数点以下を切り捨てて v20090608 にすることもできます。
ライブラリの場合、バージョン番号によって、 互換性のレベル 2 つのリリース間でのアップグレードの難しさ。
バグ修正リリースでは、バイナリ、ソース、およびシリアル化の互換性を維持する必要があります。
マイナー リリースはプロジェクトごとに異なる意味を持ちますが、通常はソースの互換性を維持する必要はありません。
メジャー バージョン番号は 3 つの形式すべてを壊す可能性があります。
根拠について詳しく書きました ここ.
github の世界では、バージョン番号に関して Tom Preston-Werner の「semver」仕様に従うことが一般的になりました。
から http://semver.org/ :
バージョン番号 MAJOR.MINOR.PATCH を指定すると、次の値をインクリメントします。
互換性のないAPI変更を行うときのメジャーバージョン、後方互換性のある方法で機能を追加するときのマイナーバージョン、および後方互換のバグ修正を行うときのパッチバージョン。プレリリースおよびビルドメタデータの追加ラベルは、Major.minor.patch形式への拡張として利用できます。
自社開発の場合は以下のフォーマットを使用します。
[Program #] . [Year] . [Month] . [Release # of this app within the month]
たとえば、今日アプリケーション # 15 をリリースし、それが今月 3 回目の更新である場合、バージョン # は次のようになります。
15.2008.9.3
まったく標準ではありませんが、私たちにとっては便利です。
過去 6 つのメジャー バージョンについては、M.0.m.b を使用しました。M はメジャー バージョン、m はマイナー バージョン、b はビルド番号です。したがって、リリースされたバージョンには 6.0.2、7.0.1、...、11.0.0 までが含まれていました。なぜ 2 番目の数値が常に 0 なのかは尋ねないでください。何度も質問しましたが、誰も本当のことは知りません。1996 年に 5.5 がリリースされて以来、ゼロ以外の値はありませんでした。