emahiro/b.log

Drastically Repeat Yourself !!!!

gonew コマンドを試してみた

Overview

gonew コマンドを触ってみたので備忘録です。

go.dev

gonew とは?

既存の Go のプロジェクトからコピペで作らずに、そのプロジェクトをテンプレートとして新規の Go プロジェクトを始める事ができるツールです。
既存プロジェクトの中身をいちいちコピペしなくて良くなります。Git から Clone する必要もないので Git の履歴等も参照してくる必要もありません(クレデンシャル消した履歴等を意図せず漏らしたりすることはない)

できること

既存のプロジェクトをテンプレートとして新しいプロジェクトを作る。

できないこと

go.mod を持っていないプロジェクトはテンプレートとして指定できない。(module 名をテンプレート名として指定するため)
このため、特定の実装をコピペする、もしくは Go のファイルをコピーする、といったことはできない。

たとえば go.mod が存在しないプロジェクトの package を追加しようとしても以下のようなエラーが発生する。

gonew github.com/emahiro/qrurl/tree/main/server/service github.com/il/gonewSample/samples/myserver3
gonew: go mod download -json github.com/emahiro/qrurl/tree/main/server/service@latest: exit status 1
{
    "Path": "github.com/emahiro/qrurl/tree/main/server/service",
    "Version": "latest",
    "Error": "module github.com/emahiro/qrurl/tree/main/server/service: no matching versions for query \"latest\"",
    "Origin": {
        "VCS": "git",
        "URL": "https://github.com/emahiro/qrurl",
        "Subdir": "tree/main/server/service",
        "TagPrefix": "tree/main/server/service/",
        "TagSum": "t1:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="
    }
}

gonew を使う

インストール方法は公式のドキュメント通りです。

go install golang.org/x/tools/cmd/gonew@latest
gonew --help
usage: gonew srcmod[@version] [dstmod [dir]]
See https://pkg.go.dev/golang.org/x/tools/cmd/gonew.

基本的な使い方は以下です。

gonew $TemplateModulePath $modulePath

Sample1: あるプロジェクトをテンプレートとして新しいプロジェクトを生成する

新しいプロジェクトを生成するときは例えば以下のようにします。

gonew github.com/emahiro/il/gonewSample emahiro.dev/myserver

Sample2: あるプロジェクトの特定のコミットをテンプレートとして新しいプロジェクトを生成する

テンプレートには latest だけでなく、特定に revision を指定することも可能です。

gonew github.com/emahiro/il/gonewSample@$revisionHash emahiro.dev/myserver

go.mod 以外にも go.mod のあるディレクトリ配下にあるファイルは丸っとコピーしてきてくれるので yaml ファイルや env ファイルと言った config 系のファイルも取ってこれます。環境変数等をいちいち設定しなくて良くなりそうです。

まとめ

まだ試験段階のツールなのでもうちょっと便利になることを期待。
今のままでも、ハンズオンとかを提供するときのテンプレートを配ったり、マイクロサービスのモジュールのテンプレート用意してチームに展開したりと行ったユースケースでは使えそうではありますが、もっと多様なユースケースに対応してほしいなと思います。

See Also

cloud.google.com