2017/08/08

Go開発環境構築(VSCode, gvm, delve, dep)からHello Worldするまで

仕事でGo言語を使う予定ができたので、本腰を入れて学んでみようと思う。当記事では、私が盛大に躓いたgolangの開発環境構築、戸惑った「しきたり」とHello worldするまでをまとめる。

開発環境・バージョン

  • Mac OSX
  • VSCode 1.14.2
    • 拡張機能: go 0.6.63
  • golang 1.8.3
    • gvmでインストールする
  • gvm 1.0.22
    • golangのバージョン管理ツール
    • Pythonでいうpyenv, Node.jsでいうnvm
  • delve 1.0.0-rc.1
    • デバッグツール
    • VSCodeからgolangを実行するために使う
  • dep 0.2.0
    • パッケージ管理・依存関係管理ツール
    • JavaScriptでいうnpm


golangの最新バージョンをインストールする


バージョン管理ツール「gvm」のインストール


goの最新バージョン(執筆時点では1.8.3、betaやrcは除外)をインストールする。

まずはどんな言語を使うときも定番なバージョン管理ツールをインストールする。golangの場合はgvmというツールを使う。
gvmを使わず直接インストールする場合は、homebrewでインストールしてパスを通せば完了。

# gvmのインストール
$ bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

Cloning from https://github.com/moovweb/gvm.git to $HOME/.gvm
No existing Go versions detected
Installed GVM v1.0.22

Please restart your terminal session or to get started right away run
 `source $HOME/.gvm/scripts/gvm`


# 設定ファイルの再読込
$ source $HOME/.gvm/scripts/gvm


# gvmのバージョン確認
$ gvm version
Go Version Manager v1.0.22 installed at $HOME/.gvm

$HOMEと書いている部分は通常は「/User/username」になる。



goのインストール


gvmを使ってgoをインストールする。
ここで注意すべき点は、go1.5以上をインストールするためにはgo1.4が必要だということ。
go1.4がないと「ERROR: Cannot find $HOME/go1.4/bin/go」というエラーが発生する。


追記: 2017/08/09 12:40
詳細は後述するが、「gmv install go.1.8.3 -B」とBオプションを付けることでgo1.4のインストールが不要になる


# 利用できるバージョンの確認
$ gvm listall

# go1.5以上をインストールするために、一旦go1.4をインストールする
$ gvm install go1.4
Installing go1.4...
 * Compiling...
go1.4 successfully installed!

# go1.4をデフォルトに設定
$ gvm use go1.4
Now using version go1.4

# 最新バージョンをインストールする(2017/08/01時点では1.8.3)
$ gvm install go1.8.3
Installing go1.8.3...
 * Compiling...
go1.8.3 successfully installed!

# インストールされたバージョンを確認
$ gvm list
gvm gos (installed)

=> go1.4
   go1.8.3

# go1.8.3を使うようにする
$ gvm use go1.8.3
Now using version go1.8.3

# バージョン確認
$ go version
go version go1.8.3 darwin/amd64

とりあえずコマンドでgoを実行できるようになった。
// main.go
package main

import (
    "fmt"
)

func main () {
    fmt.Println("Hello world!")
}

# 実行する
$ go run main.go
Hello world!



追記: 2017/08/09 12:40
gvm installするときに「-Bオプション」をつけることでバイナリからインストールすることができる。
go1.4がないとgo1.5以上がインストールできないと述べたが、バイナリからインストールすればgo1.4のインストールが不要になる。(そもそもgo1.4は1.5以降をコンパイルするためだけに使っていたので)
$ gvm listall

# バイナリからgo1.8.3をインストール(go1.4は不要)
$ gvm install go1.8.3 -B
$ gvm use go1.8.3
$ go version
go version go1.8.3 darwin/amd64



VSCode上からgolangを実行できるようにする


goをインストールしただけではVSCodeから実行したりデバッグしたりできない。
また、開発するにしてもデフォルトでサポートしていないので不便だ。

goの拡張機能をインストールする

コマンドパレットで「install extentions」と入力、またはサイドバーのExtensionsメニューをクリックし、「go」で検索する。
そして「Go: Rich Go language support for Visual Studio Code」という拡張機能をインストールする。



デバッグツール「delve」をインストールする


拡張機能をインストールしただけでは動かせない。
そこでgoのデバッグツールである「delve」をインストールする。

私の環境だと、$GOPATHにアクセスできずdelveもインストールできなかったので、まずは.bash_profileを編集しパスを通す。
# パスを通す
$ cat << EOL >> ~/.bash_profile
## go
if [ -x "`which go`" ]; then
  export GOPATH=\$HOME/go
  export PATH=\$GOPATH/bin:\$PATH
fi
EOL

# .bash_profileの反映
$ source ~/.bash_profile

viエディタなどで直接.bash_profileを編集する場合は、$の前にある\(バックスラッシュ)を削除してください。コマンドで実行するためにエスケープしているだけなので。


ちなみに$GOPATH配下で開発したり、go getでインストールしたパッケージが格納されたりする。


パスを通したところで、delveをインストールする。
# delveのインストール
$ go get -u -v github.com/derekparker/delve/cmd/dlv

# バージョンの確認
$ dlv version
Delve Debugger
Version: 1.0.0-rc.1
Build: $Id: b6077a6a35c48a31716aad2ad3fdf77bbdf70abd $

$GOPATH/src/github.com/derekparker/delve$GOPATH/bin/dlvにファイルが作られていることを確認する。


拡張機能の関連ツールをインストールする


ここまでできればVSCode上からgoを実行できるのだが、たまに「[Info]The "go-outline" command is not available. Use "go get -v github.com/ramya-rao-a/go-outline" to install.」というメッセージが表示される。

他にもgolintやgo-symbolsなど、有効になってないよーというメッセージがVSCode上部に表示される。

そのときは「Install All」をクリックし、関連ツールを一挙にインストールする。ちなみにOUTPUTには以下のような内容が表示される。
Installing 12 tools
  gocode
  gopkgs
  go-outline
  go-symbols
  guru
  gorename
  gomodifytags
  impl
  godef
  goreturns
  golint
  gotests

Installing github.com/nsf/gocode SUCCEEDED
Installing github.com/tpng/gopkgs SUCCEEDED
Installing github.com/ramya-rao-a/go-outline SUCCEEDED
Installing github.com/acroca/go-symbols SUCCEEDED
Installing golang.org/x/tools/cmd/guru SUCCEEDED
Installing golang.org/x/tools/cmd/gorename SUCCEEDED
Installing github.com/fatih/gomodifytags SUCCEEDED
Installing github.com/josharian/impl SUCCEEDED
Installing github.com/rogpeppe/godef SUCCEEDED
Installing sourcegraph.com/sqs/goreturns SUCCEEDED
Installing github.com/golang/lint/golint SUCCEEDED
Installing github.com/cweill/gotests/... SUCCEEDED

All tools successfully installed. You're ready to Go :).



開発用ディレクトリを作成する


golangでは、一般的に$GOPATH/src/github.com/{user}/{repository}のように、$GOPATH配下で開発を行う。
私の環境だとフルパスでは /User/rikko/go/src/github.com/BcRikko/learning-go のようなディレクトリを掘っている。
$GOPATH
└── src
    └── github.com
        └── BcRikko
           └── learning-go
             └── hello.go

このときに$GOPATHが定義されていなかったり、違うディレクトリで開発しているとVSCodeから実行できなくなるので注意が必要だ。



Hello World!!

Hello worldするためにテキトーにコードを書く。
// hello.go
package main

import (
    "fmt"
)

func main () {
    fmt.Println("Hello world!!")
}

コードが書けたらhello.goを開いた状態で[F5]、またはコマンドパレットから[Debug: Start Debugging]を実行する。

初回だけ次のようなダイアログが表示され、パスワードを求められる。


パスワードを入力して[続ける]をクリックすると、プログラムがコンパイルされ実行される。
VSCodeのDEBUG CONSOLEには以下のように出力される。
2017/08/01 15:22:04 server.go:73: Using API v1
2017/08/01 15:22:04 debugger.go:97: launching process with args: [$GOPATH/src/github.com/BcRikko/learning-go/debug]
API server listening at: 127.0.0.1:2345
2017/08/01 15:22:04 debugger.go:505: continuing
Hello world!!


以上で、開発環境構築〜Hello worldまで完了!



おまけ: パッケージの依存関係管理ツール「dep」をインストールする


前述のとおり、go getしたパッケージはすべて$GOPATH/src/github.comなどに入ってしまう。すべてが共用になってしまうので、depという公式ツールでのパッケージ依存関係を管理する。

glideという3rdパーティ製もあるのだが、公式が出しているのならそれに越したことはない。ということでglideについては触れない。

まずdelve同様go getでインストールする。
# depのインストール
$ go get -u github.com/golang/dep/cmd/dep


続いて、プロジェクトディレクトリに移動して初期化を行う。npmでいうnpm init。
$ cd /path/to/project

# 初期化
$ dep init

# 以下のファイル・ディレクトリがつくられる
.
├── Gopkg.lock
├── Gopkg.toml
└── vendor


試しにgolangのBDDフレームワーク「ginkgo」をインストールしてみる。
まず、importを書く。
package main

import {
    . "github.com/onsi/gomega"
}

// 以下略

# 依存関係にあるパッケージのインストール
$ dep ensure

# ディレクトリ
.
├── Gopkg.lock
├── Gopkg.toml
└── vendor
    ├── github.com
    ├── golang.org
    └── gopkg.in

このようにプロジェクトディレクトリ内のvendorディレクトリに、パッケージがインストールされる。このときGopkg.lockの内容が書き換わっていることを確認してほしい。



参考サイト





盛大に躓いて開発環境構築に半日ほど費やしてしまった。
$GOPATHの意味をちゃんと調べていなかったのが原因だろう。
今後は、golangについてまなんだこともブログに書こうと思う。


以上

written by @bc_rikko

0 件のコメント :

コメントを投稿