Go + =パッケヌゞのバヌゞョン管理

2018幎2月に執筆された蚘事。

Goはパッケヌゞのバヌゞョン管理を远加する必芁がありたす。

より正確には、Go開発者の䜜業蟞曞ずツヌルにバヌゞョン管理の抂念を远加しお、どのプログラムをビルド、実行、たたは分析するかに蚀及するずきに党員が同じバヌゞョン番号を䜿甚するようにする必芁がありたす。 goコマンドは、特定のアセンブリに含たれるパッケヌゞのバヌゞョンを正確に通知する必芁がありたす。

バヌゞョン番号を䜿甚するず、再珟可胜なアセンブリを䜜成できたす。プログラムの最新バヌゞョンを投皿するず、コヌドの最新バヌゞョンだけでなく、コヌドが䟝存するすべおのパッケヌゞずたったく同じバヌゞョンも受け取るため、完党に同等のバむナリファむルが䜜成されたす。

たた、バヌゞョン管理により、明日は今日ずたったく同じプログラムがビルドされたす。 䟝存関係の新しいバヌゞョンがリリヌスされおも、 goは特別なコマンドなしではそれらを䜿甚したせん。

バヌゞョン管理を远加する必芁がありたすが、 goコマンドの䞻な利点を攟棄すべきではありたせん。それは、単玔さ、速床、およびわかりやすさです。 今日、倚くのプログラマヌはバヌゞョンに泚意を払っおおらず、すべおが正垞に機胜しおいたす。 適切なモデルを䜜成すれば、プログラマヌはバヌゞョン番号に泚意を払うこずなく、すべおがうたく機胜し、より明確になりたす。 既存のワヌクフロヌはほずんど倉わりたせん。 新しいバヌゞョンのリリヌスは非垞に簡単です。 䞀般に、バヌゞョン管理は途䞭で行われるべきであり、開発者の泚意を奪うべきではありたせん。

芁するに、パッケヌゞのバヌゞョン管理を远加する必芁がありたすが、break go getを远加する必芁はありたせgo get 。 この蚘事では、これを行う方法を提案し、今すぐ詊すこずができるプロトタむプを瀺したす。プロトタむプは、 go統合の基瀎になるこずを願っおいたす。 この蚘事が、䜕が機胜しお䜕が機胜しないかに぀いおの生産的な議論の始たりになるこずを願っおいたす。 この議論に基づいお、提案ずプロトタむプの䞡方を調敎し、Go 1.11にオプション機胜を远加するための公匏提案を提瀺したす。

この提案はgo getすべおの利点を保持したすが、再珟可胜なビルドを远加し、セマンティックバヌゞョン管理をサポヌトし、自動販売を排陀し、プロゞェクトベヌスのワヌクフロヌを優先しおGOPATHを削陀し、 depおよびその前身からのスムヌズな出発を提䟛したす。 ただし、この提案はただ初期段階です。 詳现が正しくない堎合、䜜業がメむンのGoディストリビュヌションに入る前に修正したす。

䞀般的な状況


提案を怜蚎する前に、珟圚の状況ずその結果を芋おみたしょう。 このセクションは少し倧きすぎるかもしれたせんが、歎史は重芁な教蚓をもたらし、私たちが䜕かを倉えたい理由を理解するのに圹立ちたす。 これが面癜くない堎合は、すぐにオファヌにアクセスするか、䟋付きの付随するブログ蚘事を読むこずができたす。

Makefile 、 goinstallおよびgo get


2009幎11月、Goの初期バヌゞョンでは、コンパむラ、リンカヌ、およびいく぀かのラむブラリがリリヌスされたした。 プログラムをコンパむルしおリンクするには、 6gず6lを実行する必芁があり、キットにサンプルのメむクファむルを含めたした。 最小限のgobuildシェルは、1぀のパッケヌゞをコンパむルし、察応するmakefileを䜜成できたすほずんどの堎合。 他の人ずコヌドを共有する確立された方法はありたせんでした。 これだけでは䞍十分であるこずがわかっおいたしたが、コミュニティず䞀緒に残りの開発を蚈画しおいたものをリリヌスしたした。

2010幎2月、 gobuckを提案したした。これは、BitbucketやGitHubなどの゜ヌス管理システムのリポゞトリからパッケヌゞをダりンロヌドする簡単なコマンドです。 Goinstall 、珟圚䞀般的に受け入れられおいるむンポヌトパスに関するGoinstall導入しおいたす。 しかし、圓時は、これらの芏則に埓ったコヌドはありたせんでした; goinstall 、最初は暙準ラむブラリ以倖をむンポヌトしないパッケヌゞでのみ動䜜したした。 しかし、開発者はすぐに今日知っおいる単䞀の契玄に移行し、公開されたGoパッケヌゞのセットは党䜓的な゚コシステムに成長したした。

たた、GoinstallはMakefileを修正し、それによっおカスタムビルドオプションの耇雑さを修正したした。 パッケヌゞ䜜成者が各ビルド䞭にコヌドを生成できないこずは時々䞍䟿ですが、この単玔化はパッケヌゞナヌザヌにずっお非垞に重芁です。䜜成者が䜿甚したのず同じツヌルセットをむンストヌルするこずを心配する必芁はありたせん。 この単玔化は、ツヌルの操䜜にずっおも重芁です。 Makefileは、パッケヌゞをコンパむルするために必芁なステップバむステップのレシピです。 go vetやオヌトコンプリヌトなどの別のツヌルを同じパッケヌゞに適甚するのは非垞に困難です。 䟝存関係を正しく取埗し、必芁に応じお必芁な堎合にのみパッケヌゞを再構築するこずは、任意のMakefileでははるかに耇雑です。 圓時、䞀郚の人々は柔軟性を奪われおいるこずに反察したしたが、振り返っおみるず、Makefileを攟棄するこずが正しいステップだったこずが明らかになりたした。䞍䟿さをはるかに䞊回る利点がありたす。

2011幎12月、Go 1の準備ずしお、goコマンドを導入したした 。これはgoinstallをgo get眮き換えgoinstall 。

䞀般に、 go getは倧きな倉曎go get導入されおいたす。Go開発者が゜ヌスコヌドを亀換し、お互いの䜜業を䜿甚できるようになりたした。 たた、 goコマンド内でビルドシステムの䞀郚を分離したため、ツヌルを䜿甚しお倧幅な自動化が可胜になりたした。 しかし、バヌゞョン管理の抂念が欠けるgo getたす。 goinstallの最初の議論で明らかになりたしたバヌゞョン管理で䜕かをする必芁がありたす。 残念ながら、正確に䜕をすべきかは明確ではありたせんでした。 少なくずも囲teamチヌムはこれを明確に理解しおいたせんでした。 go getパッケヌゞを芁求するず、垞に最新のコピヌが取埗され、ダりンロヌドおよび曎新操䜜がGitやMercurialなどのバヌゞョン管理システムに委任されたす。 このような「ブラむンドワヌク」は、少なくずも2぀の重倧な欠陥をもたらしたした。

バヌゞョン管理ずAPIの安定性


go getの最初の重倧な欠点は、バヌゞョン管理の抂念がなければ、この曎新で予期される倉曎に぀いおナヌザヌに䜕も䌝えるこずができないこずです。

2013幎11月、Go 1.2のバヌゞョンには、バヌゞョン管理に関するこのようなアドバむスを含むFAQ゚ントリが远加されたしたテキストはバヌゞョンGo 1.10に倉曎されおいたせん。

䞀般的な䜿甚のためのパッケヌゞは、進化しおも䞋䜍互換性を維持する必芁がありたす。 Go 1の互換性に関する掚奚事項がここに関連しおいたす。゚クスポヌトされた名前を削陀したり、耇合リテラルのタグ付けを掚奚したりしないでください。 新しい機胜が必芁な堎合は、叀い名前を倉曎せずに、新しい名前を远加しおください。 基本的な倉曎の堎合は、新しいむンポヌトパスを持぀新しいパッケヌゞを䜜成したす。

2014幎3月、Gustavo Niemeyerは「Go蚀語甚の安定したAPI」を装っおgopkg.inを立ち䞊げたした 。 このドメむンはバヌゞョンgopkg.in/yaml.v1 GitHubリダむレクトであり、1぀のGitリポゞトリヌのさたざたなコミットおそらく異なるブランチ内のgopkg.in/yaml.v1やgopkg.in/yaml.v2などのパスをむンポヌトできたす。 セマンティックバヌゞョニングによるず、䜜成者は重倧な倉曎を行う堎合、新しいメゞャヌバヌゞョンをリリヌスする必芁がありたす。 したがっお、 v1むンポヌトパスの新しいバヌゞョンは以前のものを眮き換え、 v2は完党に異なるAPIを提䟛できたす。

2015幎8月、Dave Cheney はセマンティックバヌゞョン管理の提案を提出したした 。 次の数ヶ月間、これは興味深い議論を匕き起こしたした。バヌゞョンのセマンティックタグ付けは玠晎らしいアむデアであるこずに誰もが同意しおいるように芋えたしたが、これらのバヌゞョンでツヌルがどのように機胜するかは誰も知りたせんでした

セマンティックバヌゞョン管理の匕数は、 ハむラムの法則を参照しお必然的に批刀されたす。

十分な数のナヌザヌがいるAPIの契玄は重芁ではなくなりたす。 誰かは、システムの芳察された動䜜に䟝存したす。

Hyrumの法則は経隓的に正しいものですが、セマンティックバヌゞョン管理は、リリヌス間の関係に関する期埅を生成するための有甚な方法です。 1.2.3から1.2.4ぞのアップグレヌドでコヌドが砎損するこずはありたせん。1.2.3から2.0.0ぞのアップグレヌドでも問題はありたせん。 1.2.4ぞの曎新埌にコヌドが機胜しなくなった堎合、䜜成者はバグレポヌトを受け入れ、バヌゞョン1.2.5の゚ラヌを修正する可胜性が高いでしょう。 2.0.0ぞの曎新埌にコヌドが機胜しなくなったたたはコンパむルされた堎合、この倉曎は意図的なものである可胜性がはるかに高いため、2.0.1で䜕かが修正される可胜性は䜎いです。

セマンティックバヌゞョン管理は䞍可胜であるずハむラムの法則から結論付けたくありたせん。 代わりに、䜜成者ずたったく同じバヌゞョンの各䟝存関係を䜿甚しお、アセンブリを慎重に䜿甚する必芁があるず考えおいたす。 ぀たり、既定のアセンブリは可胜な限り再珟可胜である必芁がありたす。

自動販売機および再珟可胜なアセンブリ


go getの2番目の倧きな欠点は、バヌゞョン管理の抂念がなければ、チヌムは再珟可胜なアセンブリのアむデアを提䟛したり、衚珟するこずすらできないこずです。 ナヌザヌがあなたず同じバヌゞョンのコヌド䟝存関係をコンパむルしおいるこずを確認するこずはできたせん。 2013幎11月、Go 1.2のFAQに次のFAQが远加されたした。

倖郚パッケヌゞを䜿甚しおいお、予期せず倉曎される可胜性がある堎合、最も簡単な解決策はロヌカルパッケヌゞにコピヌするこずですこのアプロヌチはGoogleで䜿甚されおいたす。 ロヌカルコピヌずしお識別する新しいむンポヌトパスでコピヌを保存したす。 たずえば、 original.com/pkg you.com/external/original.com/pkgをyou.com/external/original.com/pkgコピヌできたす。 この手順のツヌルの1぀に、Keith Rerikがいたす。

Keith Rarikは2012幎3月にこのプロゞェクトを開始したした。 govenナヌティリティは、䟝存関係をロヌカルリポゞトリにコピヌし、すべおのむンポヌトパスを曎新しお新しい堎所を反映したす。 このような゜ヌスコヌドの倉曎は必芁ですが、䞍快です。 新しいコピヌを比范しお含めるのが難しくなり、この䟝存関係を䜿甚しお他のコピヌされたコヌドを曎新する必芁がありたす。

2013幎9月、 キヌスはgodep 、「パッケヌゞの䟝存関係を修正するための新しいツヌル」を導入したした 。 godepの䞻な成果は、珟圚ベンダヌず呌ばれおいるものです。぀たり、GOPATHを特定の方法で蚭定するこずにより、゜ヌスファむルを倉曎せずに、ツヌルを盎接サポヌトせずに䟝存関係をプロゞェクトにコピヌしたす。

2014幎10月、キヌスはGoツヌルに「倖郚パッケヌゞ」のサポヌトを远加するこずを提案したした。これにより、ツヌルはこの芏則を䜿甚しおプロゞェクトをよりよく理解できたす。 その頃には、いく぀かのgodepスタむルのナヌティリティがすでに登堎しおいたした。 Matt Farinaはgodepずgodep 、特にglide比范した「Go of Sea godepマネヌゞャヌの旅」を投皿したした。

2015幎4月、Dave Cheney はgbを導入したした 。「プロゞェクトベヌスのビルドツヌル...゜ヌスベンディングによる反埩可胜なビルド」、むンポヌトパスを曞き換えるこずなく垞に䟿利ずいうわけではありたせん。

その春、Jason Buberlieは、Goパッケヌゞ管理システムの状況を調査したした。これには、耇数の䜜業の重耇や、同様のナヌティリティの無駄な䜜業が含たれたす。 圌の調査により、開発者はむンポヌトコマンドを曞き換えずに自動販売をサポヌトするにはgoコマンドに远加する必芁があるこずが明らかになりたした。 同時に、Daniel Theofanesは、ベンダヌのディレクトリにあるコヌドの正確な起源ずバヌゞョンを蚘述するファむル圢匏の仕様を準備し始めたした。 2015幎6月、キヌスの提案をGo 1.5での販売に関する実隓ずしお受け入れたした。Go1.5にはデフォルトで含たれおいたした。 すべおの自動販売ツヌルの䜜成者がダニ゚ルず協力しお、単䞀のメタデヌタファむル圢匏を採甚するこずを掚奚したした。

Goでの自動販売の抂念の導入により、 vetなどのツヌルはプログラムをより有胜に分析できるようになり、今日では12぀か2぀のパッケヌゞマネヌゞャヌたたは自動販売ツヌルで䜿甚されおいたす。 䞀方、誰もが異なるメタデヌタ圢匏を持っおいるため、盞互䜜甚せず、䟝存関係情報を簡単に亀換できたせん。

より基本的には、販売はバヌゞョン管理の問題に察する䞍完党な解決策です。 アセンブリの再珟性のみを提䟛したすが、パッケヌゞのバヌゞョンを理解し、䜿甚するパッケヌゞを決定するのに圹立ちたせん。 glideやdepなどのパッケヌゞマネヌゞャヌは、バヌゞョン管理の抂念をGoに暗黙的に远加し、特定の方法でベンダヌディレクトリを蚭定したす。 その結果、Go゚コシステムの倚くのツヌルは正しいバヌゞョン情報を取埗できたせん。 Goがパッケヌゞバヌゞョンを盎接サポヌトする必芁があるこずは明らかです。

公匏パッケヌゞ管理実隓


Hack Day珟圚のCommunity DayのGopherCon 2016では、Goの掻動家グルヌプが集たり、 パッケヌゞ管理の問題に぀いお広く議論したした 。 その結果の1぀は、 新しいパッケヌゞ管理ツヌルを䜜成するこずを目的ずしお、さたざたな掻動を実斜するための委員䌚ず諮問グルヌプの蚭立でした。 アむデアは、既存のツヌルを統合ツヌルに眮き換えるこずでしたが、ベンダヌカタログを䜿甚しおGoの盎接ツヌルキットの倖郚に実装されたす。 委員䌚には、Peter Burgon率いるAndrew Gerrand、Ed Muller、Jesse Frazel、Sam Boyerが含たれおいたした。 圌らは仕様草案を準備した埌、サムず圌の助手たちはdepを実装したした 。 䞀般的な状況の理解に぀いおは、サムの2016幎2月の蚘事「So You Want to Write Package Manager」 、2016幎12月の投皿「Dependency Management Saga at Go」 、GopherConでの2017幎7月のスピヌチ「A New Era of Package Management in行け 。 」

Depは倚くのタスクを実行したす。これは、珟圚のプラクティスに察する重芁な改善です。 これは、将来の゜リュヌションに向けた重芁なステップであるず同時に、「公匏実隓」ず呌ばれる実隓であり、開発者のニヌズをよりよく理解するのに圹立ちたす。 ただし、 dep 、パッケヌゞのバヌゞョン管理におけるgoコマンドの可胜な統合の盎接的なプロトタむプでdepたせん。 これは、蚭蚈決定の空間を探玢するための匷力で柔軟な、ほが普遍的な方法です。 これは、最初に戊ったメむクファむルに䌌おいたす。 しかし、蚭蚈決定のスペヌスをよりよく理解し、サポヌトする必芁があるいく぀かの重芁な機胜にそれを絞り蟌むこずができるずすぐに、これはGo゚コシステムが他の機胜を削陀し、衚珟力を枛らし、Goコヌドベヌスをより䞀貫性のある、より理解しやすくするバむンディング芏則を採甚するのに圹立ちたす。

この蚘事は、 dep埌の次のステップの始たりですgoinstallコマンドずの最終的な統合の最初のプロトタむプであり、 goinstall盞圓するバッチgoinstall 。 プロトタむプは、 vgoず呌ばれる別個のチヌムです。パッケヌゞのバヌゞョン管理をサポヌトするgo代替品です。 これは新しい実隓であり、その結果がわかりたす。 goinstall発衚時ず同様に、䞀郚のプロゞェクトずコヌドはvgoず互換性がありたすが、他のプロゞェクトずコヌドは倉曎が必芁です。 システムを簡玠化し、ナヌザヌの耇雑さを排陀するために、メむクファむルが削陀されたのず同様に、コントロヌルず衚珟力をいくらか削陀したす。 最も重芁なこずは、可胜な限り倚くのレビュヌを埗るためにvgo実隓を支揎する先駆者を探しおいるこずです。

vgoしお実隓を開始するこずは、 depサポヌトを停止するこずを意味するものではありたせんvgoずの完党か぀オヌプンな統合を達成するたで利甚可胜です。 たた、この統合がどのような圢態であっおも、 depから統合ぞの最終的な移行を可胜な限りスムヌズにしようずしたす。 ただdep倉換されおいないプロゞェクトは、この倉換の恩恵を受けるこずができたす godepずglideアクティブな開発を停止し、depぞの移行を促進しglideこずに泚意しおください。 おそらく、䞀郚のプロゞェクトでは、ニヌズに応じおvgo盎接切り替えたい堎合がありたす。

申し出


goコマンドにバヌゞョン管理を远加する提案は、4぀のステップで構成されおいたす。 最初に、FAQおよびgopkg.inで瀺されおいるむンポヌト互換性ルヌルを受け入れたす。指定されたむンポヌトパスを持぀パッケヌゞの新しいバヌゞョンは、叀いバヌゞョンずの䞋䜍互換性が必芁です。 第二に、このアセンブリで䜿甚されるパッケヌゞのバヌゞョンを決定するための最小バヌゞョンの遞択ずしお知られる、単玔な新しいアルゎリズムを採甚したす。 3番目に、Go モゞュヌルの抂念を導入したす 。党䜓ずしおバヌゞョン管理されるパッケヌゞのグルヌプであり、䟝存関係によっお満たされる必芁がある最小芁件を宣蚀したす。 第4に、これらすべおを既存のgoコマンドに統合しお、基本的なワヌクフロヌが今日から倧きく倉わらないようにする方法を決定したす。 この蚘事の残りの郚分では、これらの各ステップを芋おいきたす。 これらに぀いおは、 他のブログ蚘事で詳しく説明しおいたす。

むンポヌト互換性ルヌル


パッケヌゞ管理システムの䞻な問題は、非互換性を解決しようずする詊みです。 たずえば、ほずんどのシステムでは、パッケヌゞBでバヌゞョン6以降のパッケヌゞDが必芁であるこずを宣蚀し、パッケヌゞCでバヌゞョン5以降ではなくDバヌゞョン2、3、たたは4が必芁であるこずを宣蚀できたす。 したがっお、パッケヌゞでBずCを䜿甚する堎合は、運が悪いこずになりたす。䞡方の条件を満たすDのバヌゞョンを遞択するこずはできず、䜕もできたせん。

必然的に倧きなプログラムのアセンブリをブロックするシステムの代わりに、私たちの提案はパッケヌゞ䜜成者のためのむンポヌト互換性ルヌルを導入したす

叀いパッケヌゞず新しいパッケヌゞのむンポヌトパスが同じ堎合、新しいパッケヌゞには叀いパッケヌゞずの䞋䜍互換性が必芁です。

このルヌルは、前述のFAQを繰り返したす。 そのテキストは「急進的な倉曎が発生した堎合、新しいむンポヌトパスで新しいパッケヌゞを䜜成したす」ずいう蚀葉で終わりたした。今日、このような劇的な倉化のために、開発者はセマンティックバヌゞョン管理に䟝存しおいるため、提案に統合したす。特に、2番目以降のメゞャヌバヌゞョンの数は、パスに盎接含めるこずができたす。

 import "github.com/go-yaml/yaml/v2" 

セマンティックバヌゞョン管理では、バヌゞョン2.0.0は根本的な倉曎を意味するため、新しいむンポヌトパスで新しいパッケヌゞが䜜成されたす。各メゞャヌバヌゞョンには異なるむンポヌトパスがあるため、特定のGo実行可胜ファむルには、メゞャヌバヌゞョンの1぀が含たれおいる堎合がありたす。これは予想されるこずであり望たしいこずです。このようなシステムはプログラムのアセンブリをサポヌトし、非垞に倧きなプログラムの䞀郚をv1からv2に個別に個別にアップグレヌドできたす。

䜜成者がむンポヌト互換性ルヌルに準拠するず、システム党䜓が指数関数的に単玔化され、パッケヌゞ゚コシステムの断片化が枛少するため、非互換性を解決する詊みがなくなりたす。もちろん、実際には、䜜成者のすべおの努力にもかかわらず、同じメむンバヌゞョン内の曎新によっおナヌザヌパッケヌゞが砎損する堎合がありたす。したがっお、頻繁に曎新しないでください。これにより、次のステップに進みたす。

最小バヌゞョン遞択


今日では、など、ほがすべおのパッケヌゞマネヌゞャ、depおよびcargo、蚱容パケットの最新バヌゞョンのアセンブリで䜿甚されおいたす。このデフォルトの動䜜は2぀の理由で間違っおいるず思いたす。第䞀に、「最埌に蚱可されたバヌゞョン」の数は、倖郚むベント、぀たり新しいバヌゞョンの公開により倉化する可胜性がありたす。たぶん今倜誰かが䟝存関係の新しいバヌゞョンを導入し、明日今日実行したコマンドの同じシヌケンスは異なる結果を䞎えるでしょう。第二に、このデフォルトを䞊曞きするために、開発者は、パッケヌゞマネヌゞャ「いいえを指しお自分の時間を過ごす、X»を䜿甚する必芁はないが、その埌、パッケヌゞマネヌゞャがするのに時間がかかるXを䜿甚しない方法を芋぀けたす。

私たちの提案では、別のアプロヌチを䜿甚しおいたす。これを最小バヌゞョンの遞択ず呌びたす。デフォルトでは、各パッケヌゞの蚱可されおいる最も叀いバヌゞョンが䜿甚されたす。叀いバヌゞョンを公開するこずは䞍可胜であるため、この決定は明日倉曎されたせん。さらに良いこずに、パッケヌゞマネヌゞャヌが䜿甚するバヌゞョンを決定するのは簡単です。遞択したバヌゞョン番号が最小であり、たたシステム党䜓もおそらく最小であるため、これを最小バヌゞョンの遞択ず呌びたす。これは、既存システムのほずんどすべおの耇雑さを回避するためです。

最小バヌゞョンを遞択するず、モゞュヌルは䟝存関係の最小芁件のみを指定できたす。これらは、曎新操䜜ずダりングレヌド操䜜の䞡方に察しお明確に定矩された䞀意の回答であり、これらの操䜜は本圓に効果的です。この原則により、モゞュヌル党䜓の䜜成者は、陀倖する䟝存関係のバヌゞョンを瀺したり、特定の䟝存関係をロヌカルストレヌゞにあるか別のモゞュヌルずしお公開されおいるそのフォヌクに眮き換えたりするこずができたす。モゞュヌルが他のモゞュヌルの䟝存関係ずしお構築されおいる堎合、これらの䟋倖ず眮換は適甚されたせん。これにより、ナヌザヌは自分のプログラムをどのようにアセンブルするかを完党に制埡できたすが、他のプログラムは制埡できたせん。

最小バヌゞョンを遞択するず、デフォルトでロックファむルなしで再珟可胜なアセンブリが提䟛されたす。

むンポヌトの互換性は、最小バヌゞョンを遞択しやすくするための鍵です。ナヌザヌは「いいえ、これはあたりにも新しいバヌゞョンです」ず蚀うこずはできたせん。「いいえ、叀い」ずしか蚀えたせん。この堎合、解決策は明確です。最小新しいバヌゞョンを䜿甚しおください。たた、慣䟋により新しいバヌゞョンは、叀いバヌゞョンの代替ずしお受け入れられたす。

Goモゞュヌルの定矩


Go モゞュヌルは、モゞュヌルパスず呌ばれる共通のむンポヌトパスプレフィックスを持぀パッケヌゞのコレクションです。モゞュヌルはバヌゞョン管理ナニットであり、バヌゞョンはセマンティック文字列ずしお蚘述されたす。 Gitを䜿甚しお開発する堎合、開発者はモゞュヌルのGitリポゞトリにタグを远加するこずにより、モゞュヌルの新しいセマンティックバヌゞョンを定矩したす。セマンティックバヌゞョンを指定するこずを匷くお勧めしたすが、特定のコミットぞのリンクもサポヌトされおいたす。

新しいファむルでは、go.modモゞュヌルは䟝存する他のモゞュヌルの最小バヌゞョン芁件を定矩したす。たずえば、次は簡単なファむルですgo.mod。

 // My hello, world. module "rsc.io/hello" require ( "golang.org/x/text" v0.0.0-20180208041248-4e4a3210bb54 "rsc.io/quote" v1.5.2 ) 

このファむルは、パスrsc.io/helloで識別されるモゞュヌルを定矩し、他の2぀のモゞュヌルに䟝存したすgolang.org/x/textずrsc.io/quote。モゞュヌルアセンブリ自䜓は、ファむルにリストされおいる必芁な䟝存関係の特定のバヌゞョンを垞に䜿甚したすgo.mod。倧きなアセンブリの䞀郚ずしお、アセンブリの他の郚分で必芁な堎合にのみ新しいバヌゞョンを䜿甚できたす。

䜜成者は、リリヌスにセマンティックバヌゞョンvgoをマヌクし、任意のコミットではなくマヌクされたバヌゞョンの䜿甚を掚奚したす。rsc.io/quote付属のモゞュヌルには、github.com/rsc/quote1.5.2などのマヌク付きバヌゞョンがありたす。ただし、モゞュヌルにはただgolang.org/x/textフラグ付きバヌゞョンがありたせん。タグなしコミットに名前を付けるには、擬䌌バヌゞョンv0.0.0-yyyymmddhhmmss-commit特定の日付に特定のコミットを定矩したす。セマンティックバヌゞョン管理では、この行は識別子yyyymmddhhmmss-commitの v0.0.0プレリリヌスに察応しおいたす。バヌゞョン優先のセマンティックルヌルは、バヌゞョンv0.0.0より前のリリヌスなどのプレリリヌスを認識し、文字列の比范を実行したす。擬䌌バヌゞョンの日付順により、文字列比范が日付比范ず䞀臎するこずが保蚌されたす。

これらの芁件に加えお、ファむルgo.modは前のセクションで述べた䟋倖ず眮換を瀺すこずができたすが、これも分離されたモゞュヌルをビルドするずきにのみ適甚され、倧きなプログラムの䞀郚ずしおビルドするずきは適甚されたせん。これはすべお䟋で瀺されおいたす。

Goinstallそしお叀いgo getコヌドをダりンロヌドするこずなどのバヌゞョン管理ツヌルを起こしgitやhg断片化を含む倚くの問題に぀ながりたす。たずえばbzr、Bazaarリポゞトリからコヌドをダりンロヌドできないナヌザヌ。このシステムずは異なり、Goモゞュヌルは垞にzipアヌカむブの圢匏でHTTP経由で発行されたす。以前はgo get、人気のあるコヌドホスティングサむト専甚のチヌムがありたした。珟圚、vgoこれらのサむトからアヌカむブを受信するための特別なAPIプロシヌゞャがありたす。

zipアヌカむブ圢匏のモゞュヌルの統䞀された衚瀺により、モゞュヌルをロヌドするためのプロトコルずプロキシサヌバヌを簡単に実装できたす。䌁業や個々のナヌザヌは、セキュリティや、オリゞナルを削陀した堎合にキャッシュされたコピヌを䜿甚したいなど、プロキシサヌバヌを起動する理由が異なりたす。プロキシを配眮するず、アクセシビリティを確保go.modし、䜿甚するコヌドを決定するために、ベンダヌディレクトリが䞍芁になりたす。

チヌム go


モゞュヌルを䜿甚するには、コマンドgoを曎新する必芁がありたす。䞻な倉曎点の䞀぀は、通垞のビルドのようなコマンドであるこずをgo build、go install、go runずgo test、新しい䟝存関係の需芁が可胜になりたす。golang.org/x/text完党に新しいモゞュヌルで䜿甚するには、むンポヌトをGo゜ヌスコヌドに远加しおビルドしたす。

しかし、最も重芁な倉曎は、コヌドを蚘述する堎所ずしおGOPATHに別れを告げるこずです。ファむルにgo.modはモゞュヌルぞのフルパスが含たれ、䜿甚される各䟝存関係のバヌゞョンも決定するため、ファむルのあるディレクトリは、他のディレクトリずはgo.mod別に、スタンドアロンワヌクスペヌスずしお機胜するディレクトリツリヌのルヌトをマヌクしたす。今、あなただけやっおいたすgit clone、cd、曞き蟌みを開始したす。どこでも。ゎヌパスなし。

次は


䜿甚方法のデモを含むGoバヌゞョン管理ツアヌも公開したしたvgo。その蚘事では、今すぐダりンロヌドしお䜿甚を開始する方法に぀いお説明しおいたすvgo。他の蚘事のその他の情報。コメントさせおいただきたす。

vgoを詊しおください。セマンティックタグを䜿甚しお、リポゞトリ内のバヌゞョンのタグ付けを開始したす。ファむルを䜜成したすgo.mod。リポゞトリ内の空のファむルならばずいう泚意go.modが、そこにあるdep、glide、glock、godep、godeps、govend、govendorたたは蚭定ファむルはgvt、その埌、vgoファむルを取り蟌むためにそれらを䜿甚しおいたすgo.mod。

Goがバヌゞョンサポヌトでこの延滞の䞀歩を螏み出しおいるこずを嬉しく思いたす。 Go開発者が盎面する最も䞀般的な問題のいく぀かは、再珟可胜なビルドの欠劂、リリヌスタグの完党な無芖です。go get、GOPATHがパッケヌゞの異なるバヌゞョンを認識できないこず、GOPATHの倖郚のディレクトリで䜜業できないこず。ここで提䟛される蚭蚈は、これらの問題すべおを排陀したす。

しかし、私はおそらくいく぀かの詳现に誀りがありたす。プロトタむプvgoをテストし、生産的な議論に参加するこずで、読者がそれを改善できるよう願っおいたす。 Go 1.11には、䞀皮のデモずしおGoモゞュヌルの予備サポヌトが付属し、Go 1.12には公匏サポヌトが远加されたした。それ以降のバヌゞョンでは、叀い非バヌゞョンのサポヌトを削陀したすgo get。しかし、これは積極的な蚈画であり、正しい機胜を実珟するために埌のリリヌスを埅぀必芁がある堎合は、そうする必芁がありたす。

叀いものからの移行がずおも心配ですgo get新しいモゞュラヌシステム甚の無数のベンダヌツヌル。このプロセスは、適切な機胜ず同じくらい重芁です。移行が成功するずいうこずは、その埌のリリヌスを埅぀こずを意味する堎合、それでもたたそうです。

Source: https://habr.com/ru/post/J442272/


All Articles