プログラミング

[GO言語] Depはもう古い GoModulesへ移行しよう

概要

フリーランスエンジニア スリーネクスト

GO言語依存管理ツール depはもう古いので使わない方がいいです。

golangのバージョンが1.13からはgomodが標準として使われています。gomodはGo Modulesのことです。まだ知らないでDepを使い続けている人もいるので記事にしました。

Go言語の依存管理ツールのとある話

Eさん
DepはGolangの開発したメインストリームだからこれを変えるのはナンセンスですよ

GoModulesもGolangが開発した新しいメインストリームです(すでに)
Gさん

Eさん
えっいつから

Go言語のバージョンが1.11以降ですね
Gさん

Eさん
結構前じゃん

つい最近までDepが主流だったのですがもう主流ではありません。今も主流だと思っている人もいるかもしれません。

GoLangのプロジェクトを作るときに「GOPATHを設定しないといけない」といっている人はもう古い人です。

なぜ、Depを辞める必要があるのか

Go 1.14からはモジュールサポートは実稼働で使用できる状態にあると見なされ、すべてのユーザーは他の依存関係管理システムからモジュールに移行することが推奨されます。とGoオフィシャルチームが言っています。

参考Go Modules説明Github (英語)

実際、Go言語のフレームワークでるEchoのバージョンが4ですがDepではバージョン3までしか対応していないためです。今後も対応する予定はなさそうです。

Go言語フレームワークのGinも同様にアップデートしようとするとエラーになって最新版は使えないようです。その他のフレームワークまでは確かめてないですが更新していかない可能性があります。

早めの移行をお勧めします。

go getはglideやdepが主流だった頃は使ってはいけないぐらいな言われ方してましたが今では普通に使います。なんならもうdep ensureはもう古いのでもう使ってはいけないです。

Go Modulesの使い方

step
1
環境変数設定

$ export GO11MODULE=on

現状、環境変数 GO11MODULE で GOPATHモードとモジュールモードを切り替える仕様になっているので、モジュールモードになるように設定します。
常時この設定にするには.bash_profileファイルに書き込んでください。

Goバージョン1.12までは環境変数にGO111MODULE=onを追加する。1.13ではデフォルトでonになってるので設定の必要はありません。モジュールモードではGOPATHは必要なくなります。つまり、今後はGOPATHは必要なくなるということです。

この設定について説明

GO111MODULE=on // モジュールモード(GOPATHは使用しない)
GO111MODULE=off // 今まで通りのGOPATHモード

step
2
初期化

$ go mod init

レポジトリのルートディレクトリで初期化コマンドを実行します。これで go.mod ファイルが作成されます。

step
3
go mod tidy で依存関係を今のプロジェクト内から抽出します。

$ go mod tidy

step
4
明示的な依存パッケージのダウンロードコマンド

$ go mod download

step
5
依存パッケージの追加


Modules では,go.mod が存在するディレクトリで go get をするだけで適切にバージョン管理されます.

これは一例です。

$ go get github.com/go-sql-driver/mysql

現プロジェクトのdepからgomodへの移行の考え

depからgo modulesに変更する場合は自分で作ったモジュールのimportパスは全て変わるので重要なバッチ処理やAPI機能を動かしてる場合はリスクが高すぎます。新しいプロジェクトからGo Modulesに変更すべきかと思います。もしくは危険度外視で気合いで変更してください。(おすすめしません)

まとめ

Go言語の需要はますます高まっています。
それによって、Goのバージョンが変わるごとに機能も追加変更されていくので、技術を追っていかないといけません。

技術の進歩が好きな人に向いている技術ですね。著者である私も最新を追い続けるのが好きです。

おすすめの本

昨年の夏に2版が出た本です。かなり参考になる本でしたので紹介します。ユニットテストの詳細な書き方や私も知らなかった機能まで紹介されています。

今回のGo Modulesについての記載は見なかったですが参考になる本です。

-プログラミング