Go 入門したいけど A Tour of Go とかも挫折しまくってる、しかし入門はしたいって会話をして、歯を食いしばって入門している。昔ほど新しいものがすんなり頭に入ってこなくなってしまっている気がする。
インストール方法はどれがいいのかわかっていない。 brew でも入りそうだけど、何かの拍子に .pkg で入れていたので、同じようにして最新の 1.17.8 にした。(後々 Download and install - The Go Programming Language に気づいたけど、見覚えがあるページだったので、これを見てそうしたのかも。)
簡単な cli ツールをつくって入門するつもりでいて、 Go CLIツールを作る とかを見ると GitHub - spf13/cobra: A Commander for modern Go CLI interactions がいいという話が出るので使ってみようと思って、 README を眺めると installing とか usage とかがあって便利。
しかし installing で go get -u
したり usage を一通り読んで main.go と root.go をつくったたりしたところで、 VSCode で何か怒られている感じだった。
could not import github.com/spf13/cobra (cannot find package "github.com/spf13/cobra" in any of /usr/local/go/src/github.com/spf13/cobra (from $GOROOT) /Users/hogashi/go/src/github.com/spf13/cobra (from $GOPATH)) compiler(BrokenImport)
自身の cmd/ も import できないらしかったけど、それは ~/go/src にないからということだったので、 ~/ghq から自身を移して参照できるようになった (ghq.root に ~/go/src を追加したけど ghq list に出なくて困っている)。これでも cobra は引き続き参照できていない。
ところでどうやって実行するのかと思って How To Write Packages in Go | DigitalOcean とかを見ると go run main.go
っぽいことがわかってやってみたけど、 go.mod がないので help を読んでねとのことだった。
$ go run main.go main.go:4:2: no required module provides package github.com/hogashi/trim-head-space-cli/cmd: go.mod file not found in current directory or any parent directory; see 'go help modules' $ go help modules Modules are how Go manages dependencies. A module is a collection of packages that are released, versioned, and distributed together. Modules may be downloaded directly from version control repositories or from module proxy servers. For a series of tutorials on modules, see https://golang.org/doc/tutorial/create-module. (後略)
Tutorial: Get started with Go - The Go Programming Language を見ると、まさに一通りパッケージをつくって動かすチュートリアルが載っていた。 go mod init
すると go mod tidy
してくれって出て便利。しかし cobra は見つけられているものの自身を見つけるのに (というか download に?) 失敗していそう。download しているとすれば github からだと思うけど、まだ何も push してないからかなと思ったけど、ここまでのファイルを push しても (すでにダウンロードしてしまっているからか) ダメだった。
$ go mod tidy go: finding module for package github.com/spf13/cobra go: finding module for package github.com/hogashi/trim-head-space-cli/cmd go: downloading github.com/hogashi/trim-head-space-cli v0.0.0-20220305043848-94d507708df9 go: found github.com/spf13/cobra in github.com/spf13/cobra v1.3.0 go: finding module for package github.com/hogashi/trim-head-space-cli/cmd hogashi/trim-head-space-cli imports github.com/hogashi/trim-head-space-cli/cmd: module github.com/hogashi/trim-head-space-cli@latest found (v0.0.0-20220305043848-94d507708df9), but does not contain package github.com/hogashi/trim-head-space-cli/cmd
go help mod tidy
とかしたけどキャッシュを使わないみたいなオプションはなさそう。 ~/go/pkg/mod/ にあったのを発見したので消してみた (ディレクトリの権限が 555 になってて sudo しないと消せなかったけどそういうものなのかな……) けどダメで、 ~/go/pkg/mod/cache にもあるのを発見して消したけどダメだった。多分こんなことはしないはずだから何か手立てがあると思うんだけどわからない。
十分素朴だろうと思っていたけど、もっと素朴に、自身のパッケージを import しないようなものを書いてみたら良い気はして、一旦全部消して自前でやることにした。
なんとなく書けたし go run .
できたので push して go install
してみようとしたら、 go.mod の path がおかしいと言われていそう。
$ go install github.com/hogashi/replace-head-space-cli@latest go: downloading github.com/hogashi/replace-head-space-cli v0.0.0-20220305065459-102f3c0c0505 go install: github.com/hogashi/replace-head-space-cli@latest: github.com/hogashi/replace-head-space-cli@v0.0.0-20220305065459-102f3c0c0505: parsing go.mod: module declares its path as: hogashi/replace-head-space-cli but was required as: github.com/hogashi/replace-head-space-cli
上のほうで見てたチュートリアルにならって hogashi/replace-head-space-cli ってしてたけど、 go mod init
で勝手に書かれる内容に直して push した。もののまだダメで、 go clean
とかあるらしいことがわかってやってみたけど依然としてダメそう。どこにキャッシュされているのか、あるいは直す場所が違うのかわからない。
バージョン番号をちゃんとつけたらひとまず新しいものを取得できるはずと思って、 Publishing Go Modules - The Go Programming Language を見て git tag をつけて go install
したら、 latest ではダメ (依然として v0.0.0 を取得してそう) だったけど、 v0.1.0 を明に指定したらちゃんとインストールできた。自前の cli ツールがインストールできるようになって便利。
つくったのはこれで、行頭の空白文字 (タブと全角空白) を半角空白にそろえるツール。