ゴーの主要なversioningは吸います



ポストGo’s Major Versioning Sucks – From a Fanboyは、Qvaultに最初に現れました.
私は通常、GOツールチェーン内の剛性のファンです.実際、我々はfront and backend at Qvaultでgoを使います.標準化された書式設定、Vetting、および全体の言語間でテストすることは素晴らしいです.私が持っていた最初の本当の批評は、モジュールが主要なバージョンを扱う方法にあります.それはトップの上で独断的であり、シナリオの重要な数の開発を遅くします.

“GO MOD”の上のリフレッシュ


モジュールに移動し、関連するコマンドgo modおよびgo getをNPMと糸に対するGOの等価物と考えることができる.go toolchainは依存関係を管理し、コードのコレクションが依存するバージョンをロックする方法を提供します.
最も一般的な操作の一つは、既存のモジュールの依存関係を更新することです.例えば、
# update all dependencies
go get -u ./...

# add missing and remove unused dependencies
go mod tidy

# save all dependency code in the project's "vendor" folder
go mod vendor

意味的バージョン管理


Goモジュールは、gitタグとセマンティックバージョンを使用して、モジュールと互換性のある依存関係のバージョンを追跡します.セマンティックバージョン管理はバージョン番号をフォーマットする方法です.例えば、v{MAJOR}.{MINOR}.{PATCH}.
それぞれの数値は、以下の標準に従ってインクリメントされます.
MAJOR version when you make incompatible API changes,
MINOR version when you add functionality in a backwards compatible manner, and
PATCH version when you make backwards compatible bug fixes.

パッケージ側問題


Goは、v1.2.3v0を超えるすべてのバージョンがモジュールパスでメジャーバージョンを使用するのに必要であると決めました.これを達成するには2つの方法があります.
最初に推奨されている方法は、Go Blogの例で述べられている.

To start development on v2 of github.com/googleapis/gax-go, we’ll create a new v2/ directory and copy our package into it.


言い換えると、すべての主要なバージョンのために、我々はCodeBase全体の新しいコピーを維持するのを奨励されます.これは、プリモジュールのユーザーがあなたのパッケージを使用できるようにしたいなら、それを行う唯一の方法です.
第2の方法は、v1でモジュール名を変更するだけです.前例として、go.modmodule github.com/lane-c-wagner/go-tinydateになるだろう.Goの古いバージョンのために働いていないこの他に、私はまた、モジュール名について最も有用なものの1つを壊してしまうので、問題があることがわかります.

パッケージサイドソリューション


GNUタグを更新するだけで主なバージョンを指定することができます.真実の2つの源の必要はありません.
我々は、警告またはプロンプトをmodule github.com/lane-c-wagner/go-tinydate/v2 CLIに加えることによって安全な更新を実施することができます.我々は不必要な時間がかかる政策を追加する必要はありません.

クライアント側の問題


新しいバージョンの依存関係がリリースされるとき、私たちは最新のものを得る簡単なコマンドを持っています.問題は、このコマンドに新しいメジャーバージョンに自動的に更新する方法がないことです.これは、新しいマイナーな変更やパッチをダウンロードします.新しいメジャーバージョンが存在することをあなたに知らせるコンソールメッセージさえありません!
それは、自動更新されない理由は明確であり、公正で、よく設立されるべきです:

If an old package and a new package have the same import path, the new package must be backwards compatible with the old package.

Import compatibility rule


言い換えれば、私たちは変更を壊すときに主要なバージョンを増やすだけでなければなりません、そして、壊れている変更がなされるならば、彼らは同じ輸入経路を持つことができません.これが意味する間、単純なコンソール警告はコミュニティで面倒な更新戦略を強制するより良い解決であると思います.
クライアント側の別の問題は、go getを更新する必要がないということですが、実際には、CodeBaseを通じてgo get -uまで必要となり、各インポート文を変更して新しいメジャーバージョンを指し示す必要があります.

Users who wanted to use v2 had to change their package imports and module requirements to github.com/googleapis/gax-go/v2.


最新の依存関係を得るためにいくつかの単純なCLIコマンドの代わりに、コード自体に変更を加えています.

クライアントサイドソリューション

go.modは主要なバージョンを更新するためにさらなるコマンドライン旗を持たなければなりません、そして、あなたがまだ持っていないより新しい主要なバージョンがあるという警告を示すために、デフォルトでなければなりません.
インポートパスはメジャーバージョン間で変更する必要はありません.

なぜこれは私を吸うの


私がドメイン固有のロジックを持っているパッケージを構築したいと思っています.たとえば、我々のシステム全体で使用される共通のエンティティのgrep定義を保持しているRIPOを持っています.
時折、これらのstruct定義に逆互換性のない変更を行う必要があります.それがオープンソースライブラリであるならば、我々はそれほど頻繁に変化をしません、しかし、それが内部で、我々はすべての依存関係を知っているので、我々は定期的に輸出されたフィールドの名前を変えます.我々は悪い名前を始めるために選択したので、名前を変更していない、我々は通常、ビジネスからの要件は、起動時に急速に変更するので、名前を変更している.
これはメジャーバージョンの変更がかなり規則的な発生であることを意味します.何人かは、我々がちょうどgo get -uにとどまるべきであると言います、そして、それは妥当な解決です.問題は、これらがサービスの広い数で使用されている生産パッケージです.私たちは震えたい.
Goは大多数のケースでは、我々はメジャーバージョンをインクリメントする必要がありますマイナーバージョンをインクリメントするように選択している厄介な主要なバージョンを更新します.我々は適切なバージョン管理方式にしたがっています.

ねえ-それを得る


私は、これらの決定がなぜなされたかについて理解します、そして、私は多くの場合、彼らが大きな決定であったと思いさえします.任意のオープンソースやパブリック顔のモジュールについては、これは大きな意味をなす.Go Toolchainは、良いAPI設計を奨励する厳しい規則を実施しています.
公共のAPIを偉大にする彼らの努力において、彼らはそれを不必要に良い「ローカル」パッケージ設計を持つようにしました.
新たなメジャーバージョンがCLIから発見可能になるopen issue on Githubがあります.興味があればそれを見てください.
GOはまだ最高のツールチェーンと生態系があります.NPMとPIPはそれを吸うことができます.
あなたが意見が合わないならば、@ Twitterで私.

読書ありがとう!


あなたがどんな質問またはコメントをするならば、さえずりの上で我々について来てください
いくつかのcoding courses on our new platform
より多くのプログラミング記事のための我々の会報へのSubscribe