はじめに
こんにちは!2019年8月から株式会社メディアドゥのエンジニアになりました、小川と申します。
配属されて最初、Goのプロジェクトのに参加した時、開発環境の構築でハマったので記事にします。
チーム開発とパッケージ管理
チーム開発においては、チーム内で使用する言語やライブラリを同じ依存関係のバージョンで統一する必要があります。
Goでのパッケージ管理手法はgo1.12から正式にGo Modulesがサポートされており、$GOPATH/src
や vendor
を使用する必要はなくなりましたが、現場ではgvm、depを使用した開発は結構あります。そこで、改めてパッケージについてまとめました。
Go言語のパッケージimport方法
$GOPATH
└── src
└──github.com
└──hogeProject
|
├── hoge
| └──hoge.go
└── main.go
こんなパッケージ構成になっている時、
Goのパッケージのimportは以下のように行う。
package main
import (
// 標準パッケージのimport・・・1
"fmt"
// プロジェクト内の他パッケージを相対パスでimport・・・2
"./hoge"
// github上の外部パッケージのimoprt・・・3
"github.com/fsnotify/fsnotify"
// プロジェクト内の他パッケージを絶対パスでimport・・・4
"github.com/hogeProject/hoge"
)
func main() {
//処理…
}
【1】. 標準パッケージのimport
標準パッケージは、シンプルにパッケージ名を記載することでimportできる。
【2】. プロジェクト内の他パッケージを相対パスでimport
プロジェクト内の自作パッケージは相対パスでimportできるが、go buildでコンパイルを実行するとエラーになる。コードの曖昧さ回避のために公式で推奨されていないようです。
【3】. github上の外部パッケージをimoprt
github上の外部パッケージを使用する場合は、おなじみ、go get
コマンドで$GOPATH/bin
配下にインストールする。また、参加したプロジェクトがdep
を使用している場合はdep ensure
コマンドで、使用している外部パッケージをプロジェクトディレクトリ内のvendor
配下にインストールされます。
【4】. プログラム内の他パッケージを絶対パスでimport
【2】では相対パスだが、基本的には絶対パスで指定する。個人開発するときには特に問題にならないが、チーム開発などでgit clone ~
する場合はcloneする場所を注意しないといけない。Goは$GOPATH/src
より下をパスとして認識するため、ソース内のパッケージのimportパスと同じディレクトリ構成にしないといけない。
今回の例だと、内部パッケージのパスが、github.com/hogeProject/hoge
となっているので、$GOPATH/src/github.com
内にhogeProjectをgit clone
する必要がある。
これに気をつけないと、depでパッケージ管理をしてるプロジェクトでは、dep ensure
した際に内部パッケージとして認識せず、外部パッケージとしてvendor
配下に取り込んで、そっちを参照してしまう。。。