Modules(vgo)環境で利用する3つの方法Goこんにちは、アプリ部の門多です。1.11から利用可能な公式の依存性管理ツールです。これはgo.modファイルにモジュールとバージョンを記録しておき、ビルド結果を固定するために使いますが、通常は、参照するモジュールのバージョンが公開されている必要があります。v1.0.0)のような依存関係を持つ場合、2つのモジュールは適切な形で参照できる状態でなければいけません。存在していたとしても参照されないので、リポジトリで公開され、適切なタグが必要です。いう場合には、モジュールを公開するまでビルドが行えなくなってしまって、問題となります。場合にも同じ問題が発生します。今回困ったのは後者で、具体的には、いま担当しているプロダクトではgRPCのプロトコル定義を公開していますが、これに新しいフィールドを追加することになりました。製品リリース前にアップデートすると「フィールドがあったので使ったけど使われていない」みたいな問題が発生するため、なるべくリリースよりも先に公開したくありません。すると、開発中に、開発者やCIが取得するモジュールはまだフィールドが追加される前のものなので、新しいフィールドを使ったコードのビルドがエラーになってしまいます。ディレクティブを使う方法が良いと思いますが、いくつか方法があったので調べた内容をまとめました。ディレクトリはGoモジュール環境でも使えます。ディレクトリへコピーします。使ったビルドを行います。1.11以前の環境でも同じ成果物が保証できるなど状況によっては便利です。GOPROXY経由で参照するこれは本来、モジュールをキャッシュするために用意された仕組みのようです。環境変数を設定しておくと、そこからモジュールをダウンロードさせることができます。環境変数で参照した先は決まった構造を持っている必要があります。モジュールの場合はこのようになります。バージョンを1行に1つ書いたテキストファイルです。バージョンやコミットハッシュなどを含んだJSONファイルです。モジュールのソースコードをzipしたものです。以下がこの構造になっています。GOPROXY=file:///$GOPATH/pkg/mod/cache/downloadとすればそのまま使えます。この方法は、キャッシュの管理がとてもめんどくさい開発中のバージョンもなんらかの方法でキャッシュに入れておく必要があるなどの課題もありますが、以下のメリットもあります。ディレクティブを使うと、リポジトリの参照先を異なるリポジトリまたはローカルファイルへ切り替えることができます。書き方はこのようになります。ディレクティブが意図せず残り続ける可能性がある(消し忘れなど)など、運用で気をつけなければならない点はあります。まとめ未公開のモジュールまたはバージョンを使ってビルドするための方法をいくつか調べました。それぞれが解決しようとしている問題はそもそも別のもので、何を解決したいのかを正しく判断しないといけないなと感じました。使えるかもしれません。ディレクティブについては、一時的な置き換えならいいと思いますが、オリジナルの作者が不在で更新されなくなってしまった場合はimportするモジュールを変更した方が良い場合もあるでしょう。1.11の時点で、モジュールは導入されたばかりでExperimentalなので、なるべく積極的に共有していきたいなと思います。公式のWikiが情報量多くて素晴らしい。Modules(vgo)環境で利用する3つの方法Tweet関連記事2018-11-12Goのnet/httpクライアントで大量のリクエストを高速に行う方法こんにちは、門多です。»このブログについてフェンリルのエンジニアが開発技術に関する様々なトピックをお送りします。(7)スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。