Go
fish
Ghq
DEP

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

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