Posted at

【Go言語】パッケージのimportについて整理した


はじめに

こんにちは!2019年8月から株式会社メディアドゥのエンジニアになりました、小川と申します。

配属されて最初、Goのプロジェクトのに参加した時、開発環境の構築でハマったので記事にします。


チーム開発とパッケージ管理

チーム開発においては、チーム内で使用する言語やライブラリを同じ依存関係のバージョンで統一する必要があります。

Goでのパッケージ管理手法はgo1.12から正式にGo Modulesがサポートされており、$GOPATH/srcvendorを使用する必要はなくなりましたが、現場ではgvmdepを使用した開発は結構あります。そこで、改めてパッケージについてまとめました。


Go言語のパッケージimport方法

$GOPATH

└── src
└──github.com
└──hogeProject
|
├── hoge
| └──hoge.go
└── main.go

こんなパッケージ構成になっている時、

Goのパッケージのimportは以下のように行う。


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配下に取り込んで、そっちを参照してしまう。。。


参考にした記事