Edited at

ghqで取得したリポジトリ内でdepが実行できない問題の回避策

More than 1 year has passed since last update.


depが動かない


env

GOPATH=~/.go



.gitconfig

[ghq]

root = ~/Projects
root = ~/.go/src

のように設定している場合に、ghq get user/repo && ghq look user/repo && dep initを行うと以下のエラーが発生します。

init failed: unable to detect the containing GOPATH: /Users/xxx/Projects/github.com/user/repo is not within a known GOPATH/src

これは、depがgoのworkspaceである$GOPATH以下で開発を行うことを強制しているためで、depのissueでもworkspace以下で開発するように促しています


でもGHQで管理しているプロジェクトフォルダで開発したいんじゃあ〜〜〜〜

というわけで、これを回避します。

$ mv $GOPATH/src/* ~/Projects/

$ rm -r $GOPATH/src
$ ln -s ~/Projects/ $GOPATH/src

$GOPATH/srcにあるフォルダをすべてプロジェクトフォルダに移動して、$GOPATH/srcからプロジェクトフォルダへシンボリックリンクを張ります。

$ dep init

  Using master as constraint for direct dep github.com/dghubble/go-twitter

Locking in master (c4115fa) for direct dep github.com/dghubble/go-twitter
Locking in v2.0.0 (2ea60e5) for transitive dep github.com/cenkalti/backoff
Using ^0.3.0 as constraint for direct dep github.com/BurntSushi/toml
Locking in v0.3.0 (b26d9c3) for direct dep github.com/BurntSushi/toml
Using ^0.4.0 as constraint for direct dep github.com/dghubble/oauth1
Locking in v0.4.0 (70562a5) for direct dep github.com/dghubble/oauth1
Locking in v1.1.0 (eb56e89) for transitive dep github.com/dghubble/sling
Locking in master (53e6ce1) for transitive dep github.com/google/go-querystring
Locking in master (640f462) for transitive dep golang.org/x/net
Using master as constraint for direct dep github.com/mitchellh/go-homedir
Locking in master (b8bc1bf) for direct dep github.com/mitchellh/go-homedir
Old vendor backed up to /Users/xxx/.go/src/github.com/user/repo/_vendor-20180507234756

やりました。


GHQの名前解決が出来ない

上記をやると$GOPATHとGHQのルートフォルダが同じ場所を指すようになるので、最初の例のような設定をしていると名前解決ができなくなります。その場合、GHQのルートフォルダ指定から$GOPATHのフォルダを含むものを削除してください。(例でいくと~/.go/src)


fish使用時に動作しない

fish-shellを使用している場合、引き続き同じ問題が起こります。fishはシンボリックリンクのパスをすべてオリジナルのパスへ変換するためです。fishかしこい。

以下を~/.config/fish/functionsのフォルダに配置して、$GOPATHのパスでdepを動かすようにします。


dep.fish

function dep --description 'run golang-dep at symlink path instead of origin'

set -l current (pwd)
set -l work $current
set -l ghqroot (git config -l | sed -n /^ghq.root/s/~/(string replace -a / \\/ $HOME)/p | awk -F= '{print $2}')
for x in $ghqroot;
set work (string replace -r "^$x" $GOPATH/src $work);
end
sh -c "cd $work && dep $argv"
end

fishermanな方は

$ fisher https://gist.github.com/c18t/17a9e2d31b39311b4c96a68e5b9b19d6

を実行して関数をインストールできます。

動作確認。

$ dep status

PROJECT                           CONSTRAINT     VERSION        REVISION  LATEST   PKGS USED

github.com/BurntSushi/toml >=0.3.0 v0.3.0 b26d9c3 v0.3.0 1
github.com/cenkalti/backoff v2.0.0 v2.0.0 2ea60e5 v2.0.0 1
github.com/dghubble/go-twitter branch master branch master c4115fa c4115fa 1
github.com/dghubble/oauth1 >=0.4.0 v0.4.0 70562a5 v0.4.0 1
github.com/dghubble/sling v1.1.0 v1.1.0 eb56e89 v1.1.0 1
github.com/google/go-querystring branch master branch master 53e6ce1 53e6ce1 1
github.com/mitchellh/go-homedir branch master branch master b8bc1bf b8bc1bf 1
golang.org/x/net branch master branch master 640f462 640f462 1