golangでコマンドラインツールを作る #1 gcliをインストールする

なぜ作ろうと思ったか

Go Tourは昔ちょっとやったことあったけどほとんど覚えてないってレベル。でも、これで発表することになったからやるぞってなった。

んで、題材が思いつかなかったけど最近iOSでxcodeproj/project.pbxprojがよくコンフリクトしてるから、あれをコマンドラインでさらっとパースできないかなと思ったので作ることにしてみた。

f:id:masato47744:20150816150451p:plain

何から調べるか

なんか、go getとかGOHOMEとか色々後戻りできない感じがあったようななかったような感じがしたがなんかその辺調べるのめんどくなってきた。とりあえずコマンドラインツールが作れればいいのでと思ってこれを見つけた。

そういえば社内の勉強会でcodegangsta/cli · GitHubよりよさそうみたいなこと言ってた気がするのでこれでやってみるかということに。

まずはGitHubレポジトリを作る

雰囲気出るし。xocdeprojとGolangを組み合わせて、xgodeprojにしてみた。ダサいw

そしたらこれで作ってみる

tcnksm/gcli · GitHub

どうやってインストールすればいいのか。ってかGo入ってんのか?俺の環境。

$ go
zsh: command not found: go

多分入ってない?

Goをインストールする

$ brew install go
==> Downloading https://homebrew.bintray.com/bottles/go-1.4.2.yosemite.bottle.2.
######################################################################## 100.0%
==> Pouring go-1.4.2.yosemite.bottle.2.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.4.2: 4566 files, 155M
$ go version
go version go1.4.2 darwin/amd64

多分これでいいのかな。

gcliを取り込む

よくわからないけど多分、go getみたいのすればよさそう。READMEを読もう。Installationで説明してくれてる素晴らしい。 GOPATHとか設定されてないけどとりあえずやってみよう。

$  echo $GOPATH

$  echo $GOROOT

とりあえずなんも入ってない。go get してみると、

$ go get -d github.com/tcnksm/gcli
package github.com/tcnksm/gcli: cannot download, $GOPATH not set. For more details see: go help gopath

go help gopathって書いてある。読んでもすっと頭に入ってこない。 gopath調べるとよさそうな記事発見。

GOPATH は適当に決めて問題ない - Qiita

$HOME/go$HOME/.goが多いようだ。$HOME/.goにしよう。

zshrcの追加。

export GOPATH=$HOME/.go

そして、go getしてみる。が、エラー。

$ go get -d github.com/tcnksm/gcli
# github.com/tcnksm/gcli/skeleton
/Users/mpon/.go/src/github.com/tcnksm/gcli/skeleton/template.go:34: undefined: Asset

GOPATHの下を見ると、何かができてる感は感じられる。

$ ll $GOPATH/*
/Users/mpon/.go/pkg:
total 0
drwxr-xr-x  4 mpon  staff   136B  8 13 18:19 darwin_amd64

/Users/mpon/.go/src:
total 0
drwxr-xr-x  7 mpon  staff   238B  8 13 18:19 github.com
drwxr-xr-x  3 mpon  staff   102B  8 13 18:19 golang.org

Go言語 + cli-init でコマンドラインツールを作る | Developers.IOを真似して、

$ cd $GOPATH
$ go get -d github.com/tcnksm/cli-init
$ make install

をやってみた。けど、make installでこけた。

cd skeleton; go-bindata -pkg="skeleton" resource/...
/bin/sh: go-bindata: command not found
make: *** [install] Error 127

エラーメッセージでググって、go-bindataはなんか別のライブラリかな?

jteeuwen/go-bindata · GitHub

Installしてみる。-uってなんだろう。まぁいいか。

$ go get -u github.com/jteeuwen/go-bindata/

これをやったあともやっぱり、make installでこける。これは、issueないかなと思ったらあったw

/bin/sh: go-bindata: command not found · Issue #23 · tcnksm/gcli · GitHub

$GOPATH/binを$PATHに追加したらいけた!

$ make install
go get -v golang.org/x/tools/cmd/vet
go get -v github.com/golang/lint/golint
go get -v github.com/jteeuwen/go-bindata/...
go get -v -d -t ./...
cd skeleton; go-bindata -pkg="skeleton" resource/...
go install -ldflags "-X main.GitCommit \"$(git describe --always)\""

そして、この$GOPATHの下はgithub.comとかなってて、gcliのREADME読んでて、この$GOPATH/srcの下にに自分のソースコードを作るみたいなことが分かった。

gcliを実行してみる

cd $GOHOME/src/github.com/mpon/xcodeprojに移動して、READMEに沿ってコマンドをたたく。 なんか、codegangstaとかFrameworkが選べるってやつはよく分からなかったから指定しなかった。

gcli new -c list xgodeproj
  Created xgodeproj/version.go
  Created xgodeproj/command/list.go
  Created xgodeproj/CHANGELOG.md
  Created xgodeproj/commands.go
  Created xgodeproj/command/list_test.go
  Created xgodeproj/main.go
  Created xgodeproj/README.md
====> Successfully generated xgodeproj

そしたらxgodeprojがまるまる出来てしまった。そうか、こっちが先だったっぽい。なので、直下にファイルが来るようにmvでせっせと移動する。

出来上がったファイルをmain.goみてみたら、github.com/codegangsta/cliが書いてあるから、何も指定しないとこれになるんだね。あと、READMEとかcommands.goの自分のGitHub名が本名になっててgit configのuser.nameとかみてるのかな?その辺を直した。

テンプレで出来たコマンドが実行できるか確認してみる

$ go build github.com/mpon/xgodeproj
../.go/src/github.com/mpon/xgodeproj/commands.go:7:2: cannot find package "github.com/codegangsta/cli" in any of:
    /usr/local/Cellar/go/1.4.2/libexec/src/github.com/codegangsta/cli (from $GOROOT)
    /Users/mpon/.go/src/github.com/codegangsta/cli (from $GOPATH)
$ go get github.com/codegangsta/cli

go buildしてみるとcodegangsta/cliがないっぽいのでgo getする。 再びgo build するとディレクトリが出来上がった。 そしてコマンドを実行。

$ ./xgodeproj
NAME:
   xgodeproj -

USAGE:
   xgodeproj [global options] command [command options] [arguments...]

VERSION:
   0.1.0

AUTHOR(S):
   Masato Ohshima

COMMANDS:
   list
   help, h  Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --help, -h       show help
   --version, -v    print the version

なんか、よさそう。

その2