ゴーの主要なversioningは吸います
6152 ワード
ポスト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.3
とv0
を超えるすべてのバージョンがモジュールパスでメジャーバージョンを使用するのに必要であると決めました.これを達成するには2つの方法があります.最初に推奨されている方法は、Go Blogの例で述べられている.
To start development on
v2
ofgithub.com/googleapis/gax-go
, we’ll create a newv2/
directory and copy our package into it.
言い換えると、すべての主要なバージョンのために、我々はCodeBase全体の新しいコピーを維持するのを奨励されます.これは、プリモジュールのユーザーがあなたのパッケージを使用できるようにしたいなら、それを行う唯一の方法です.
第2の方法は、
v1
でモジュール名を変更するだけです.前例として、go.mod
はmodule 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.
言い換えれば、私たちは変更を壊すときに主要なバージョンを増やすだけでなければなりません、そして、壊れている変更がなされるならば、彼らは同じ輸入経路を持つことができません.これが意味する間、単純なコンソール警告はコミュニティで面倒な更新戦略を強制するより良い解決であると思います.
クライアント側の別の問題は、
go get
を更新する必要がないということですが、実際には、CodeBaseを通じてgo get -u
まで必要となり、各インポート文を変更して新しいメジャーバージョンを指し示す必要があります.Users who wanted to use
v2
had to change their package imports and module requirements togithub.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
Reference
この問題について(ゴーの主要なversioningは吸います), 我々は、より多くの情報をここで見つけました https://dev.to/wagslane/go-s-major-versioning-sucks-from-a-fanboy-14g4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol