ハトネコエ Web がくしゅうちょう

プログラミングやサーバー関連、チームマネジメントなど得た技術のまとめ

GOPATH 以下にシンボリックリンクを置いて楽できる!

Go 言語での開発のしんどいところ私的 No. 1 は、
ソースを GOPATH 以下のディレクトリで管理しないといけないところです。

alias cdgo='cd $(echo "$GOPATH" | awk -F "[:]" "{print $1}")'

エイリアスを振ったとしても、(ちなみに上は GOPATH を複数定義している場合にも対応できるよう、複雑にしている)
ふだんの開発用ディレクトリとの行き来は多少めんどくさい。

Go の実行を Docker 内でおこなうというのは一つの手段ですが、
テキストエディタは補完が便利な Visual Studio Code を使いたいな〜、となると、
import が失敗して補完が効かないし import エラーは表示されちゃうしで上手くいきません。

横着する方法の一つとして考えたのが、
GOPATH 下にシンボリックリンクを置くことです!

f:id:nekonenene:20190212022606p:plain

「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