この記事について
対象:Go言語初学者向け
Go言語に自作ライブラリをimportするときに新旧の情報が混ざっていて結局どういうやり方がいいのかよくわからなかったので調べた。
バージョンが変わって色々と変わっているらしく、今後も変わりそう。
実行環境
MacOS Mojave 10.14
Go言語(Golang) 1.13
VisualStudioCode 1.40
結論
Go1.11からはGo Modulesを使いましょう。
Go1.10以前は$GOPATH配下に全て置くしかなさそう。
相対パスも環境によっては実行できるが非推奨。
やりたいこと
下記の構成で自作のライブラリをmainからimportしたい。
ディレクトリ構成
newmod/
├── lib
│ └── lib.go
└── main.go
テスト用ソース
package main
import (
"fmt"
"newmod/lib"
)
func main() {
s1 := "abc123-~アイウ|"
s2 := "abc123-~アイウ|"
fmt.Println(s1)
ns := lib.Convert(s2)
fmt.Println(ns)
}
package lib
import "golang.org/x/text/width"
func Convert(s string) string {
return width.Narrow.String(s)
}
このままだとimportエラーが発生するのでGo Modeluesを設定する。
やったこと
下記の記事を参考にGo Modeluesを設定。
https://techblog.asahi-net.co.jp/entry/2019/03/11/122341#Modules%E3%81%AE%E5%B0%8E%E5%85%A5
$ cd newmod
$ go mod init newmod
上記のコマンドを実行するだけ。
実行するディレクトリに注意する。(ここを間違ってハマった...)
結果
go.modができてここでライブラリ(モジュール)を管理するようになる。
GOPATHを設定しなくてもgo.modがあるディレクトリにパスが通るようになって自作ライブラリもnewmodディレクトリからのパス指定でimportできるようになった。
newmod/
├── go.mod
├── go.sum
├── lib
│ └── lib.go
└── main.go
module newmod
go 1.13
require golang.org/x/text v0.3.2
Goのライブラリ管理についてわかったこと
Go1.11からライブラリ管理方法として、Go Modeulesというものが導入されていて、現バージョンのGo1.13ではGo Modulesが推奨されているらしい。
Go1.10以前のバージョンではGOPATHという環境変数を設定して$GOPATH/srcの配下で開発することが前提になっていたが色々問題があった模様。
現状、新旧のGoバージョンでの情報が混在しているのでGOPATHを設定しろ、みたいなことが書かれているが、最新のGo言語はそもそもGOPATHがデフォルトで設定されないのでこれからはGoModulesで管理するのが無難かなと。
#参考記事
Go Modules
https://qiita.com/propella/items/e49bccc88f3cc2407745
The Go Blog - Using Go Modules / Go Modulesを使う(和訳)
https://qiita.com/pokeh/items/139d0f1fe56e358ba597