gvm+delveなVisualStudioCodeでのデバッグ環境構築

golangの環境構築時なかなかめんどくさかったのでメモ

対象者： *golangをVisualStudioCodeで実行する環境を欲する人*
前提：　*gvmを使っている人*

## [VisualStudioCode](https://code.visualstudio.com/)の設定

`<ワークスペース>/.setting/setting.json` に`$GOPATH`,`$GOROOT`などを設定する
`gvm` で適切に設定した後に `go env` で出力した値を設定する

VisualStudioCodeのUIに沿って関連プラグインをインストールしようとしても失敗する
ため `setting.json` に設定したら手元で `go get -u -v` して引っ張ってくる必要がある

```プラグインインストール例
go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-find-references
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
```

## [delve](https://github.com/derekparker/delve)のインストール

### Macでインストールする場合

ググると証明書を用意してビルドしている手順があるがこれは鬼門なのであまりやらない方が良い
`gvm` で環境を切り替えている場合は各環境にdelveをインストールする必要が
あるのでその手順を示す

[公式ドキュメント](https://github.com/derekparker/delve/blob/master/Documentation/installation/osx/install.md) にある通り、brew install を用いてインストールする
しかし、これでは各環境にはdelveはインストールされないため、各環境でdelveを
インストールする必要がある

下記のように、brew installすると `dlv-cert` という名称の証明書が生成されるので
その生成された証明書を用いて各環境のビルド＆インストールを行うと楽
(めんどくさい証明書作成をbrew installに任せる)

```
$ git clone https://github.com/derekparker/delve 【まずはビルドするためのソースを引っ張る】
Cloning into 'delve'...
remote: Counting objects: 7964, done.
remote: Total 7964 (delta 0), reused 0 (delta 0), pack-reused 7964
Receiving objects: 100% (7964/7964), 10.85 MiB | 525.00 KiB/s, done.
Resolving deltas: 100% (4749/4749), done.
Checking connectivity... done.
$ brew install go-delve/delve/delve 【brewでインストールする(証明書のインストールをbrewに任す)】
〜〜略〜〜
==> Tapping go-delve/delve
Cloning into '/usr/local/Homebrew/Library/Taps/go-delve/homebrew-delve'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
Checking connectivity... done.
Tapped 1 formula (32 files, 40.8K)
==> Installing delve from go-delve/delve
==> Installing dependencies for go-delve/delve/delve: go
==> Installing go-delve/delve/delve dependency: go
==> Downloading https://homebrew.bintray.com/bottles/go-1.7.4.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring go-1.7.4.el_capitan.bottle.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
🍺  /usr/local/Cellar/go/1.7.4: 6,438 files, 250.7M
==> Installing go-delve/delve/delve
==> Downloading https://github.com/derekparker/delve/archive/v0.11.0-alpha.tar.gz
==> Downloading from https://codeload.github.com/derekparker/delve/tar.gz/v0.11.0-alpha
######################################################################## 100.0%
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
==> Generating dlv-cert
==> openssl req -new -newkey rsa:2048 -x509 -days 3650 -nodes -config dlv-cert.cfg -extensions codesign_reqext -batch -out dlv-cert.cer -keyout dlv-cert.key
==> [SUDO] Installing dlv-cert as root
==> sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain dlv-cert.cer
Password:　【ここで端末のパスワードを入力する】
==> sudo security import dlv-cert.key -A -k /Library/Keychains/System.keychain
==> [SUDO] Killing taskgated
==> sudo pkill -f /usr/libexec/taskgated
==> make build BUILD_SHA=v0.11.0
==> Caveats
If you get "could not launch process: could not fork/exec", you need to try
in a new terminal.

When uninstalling, to remove the dlv-cert certificate, run this command:

    $ sudo security delete-certificate -t -c dlv-cert /Library/Keychains/System.keychain

Alternatively, you may want to delete from the Keychain (with the Imported private key).

==> Summary
🍺  /usr/local/Cellar/delve/0.11.0: 6 files, 7.4M, built in 29 seconds
$ gvm list

gvm gos (installed)

   go1.4
   go1.5
   go1.5.4
   go1.6.3
   go1.7.3
   system
$ gvm use go1.6.3 【各環境に切り替えてインストールしていく】
$ go get github.com/derekparker/delve/cmd/dlv
$ CERT=dlv-cert make install
go install -ldflags="-s -X main.Build=6bff4d19706b46b7bd350212048e4a140caad271" github.com/derekparker/delve/cmd/dlv
codesign -s "dlv-cert"  /Users/okayayohei/.gvm/pkgsets/go1.6.3/global/bin/dlv
```