GOPATH 以下にシンボリックリンクを置いて楽できる!
Go 言語での開発のしんどいところ私的 No. 1 は、
ソースを GOPATH 以下のディレクトリで管理しないといけないところです。
alias cdgo='cd $(echo "$GOPATH" | awk -F "[:]" "{print $1}")'
とエイリアスを振ったとしても、(ちなみに上は GOPATH を複数定義している場合にも対応できるよう、複雑にしている)
ふだんの開発用ディレクトリとの行き来は多少めんどくさい。
Go の実行を Docker 内でおこなうというのは一つの手段ですが、
テキストエディタは補完が便利な Visual Studio Code を使いたいな〜、となると、
import が失敗して補完が効かないし import エラーは表示されちゃうしで上手くいきません。
横着する方法の一つとして考えたのが、
GOPATH 下にシンボリックリンクを置くことです!
「test_project」というフォルダを作って、以下のような Makefile を書いてみました。
local_gopath := $(shell echo "${GOPATH}" | awk -F '[:]' '{print ${1}}') .PHONY: init init: mkdir -p $(local_gopath)/src/myprojects ln -sf $(shell pwd) $(local_gopath)/src/myprojects
make init
をおこなうことによって、
この「test_project」ディレクトリへのシンボリックリンクが、
$GOPATH/src/myprojects
ディレクトリに置かれます。
では実験してみます。
「test_project」ディレクトリに「hello」フォルダを作り、その中には以下のような main.go を作成します。
package hello import ( "fmt" ) // PrintHello は Hello!! と出力するだけのメソッド func PrintHello() { fmt.Println("Hello!!") }
保存したら今度は「test_project」ディレクトリに以下のような main.go を作成します。
package main import ( "fmt" "myprojects/test_project/hello" ) func main() { fmt.Println("It's main.") hello.PrintHello() }
保存しましたが、特に golint に怒られもしていないようです。
そして実行します。
go run main.go It's main. Hello!!
無事に Hello!! と出力されましたね。
このように、シンボリックリンクを置くことで、無理やり、GOPATH の呪縛から逃れることが出来ました。
横着しすぎです。
しかしこれも欠点があって、
ライブラリの依存管理をおこなう dep は、「test_project」ディレクトリ下でおこなうことが出来ません。
dep init init failed: unable to detect the containing GOPATH: /Users/nekonenene/Programs/test_project is not within a known GOPATH/src
まあ、そうだよね、うん……。
結論: 横着しない。Go に入っては Go に従え
最初からわかっていた答えですが、いやぁ、それでも横着したいなぁ・・・w