Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Goのローカル開発をWorkspacesではじめよう

uhzz
September 16, 2022

 Goのローカル開発をWorkspacesではじめよう

uhzz

September 16, 2022
Tweet

More Decks by uhzz

Other Decks in Programming

Transcript

  1. go.modファイルのあるディレクトリ以下の すべてのパッケージがモジュールの対象となる。 複数のモジュールが含まれるリポジトリのことです . ├── hello │ ├── go.mod │

    ├── go.sum │ └── hello.go └── world ├── go.mod ├── go.sum └── world.go モジュールについては拙スライド参照 https://speakerdeck.com/uhzz/go-patukeziguan-li-depkarago-moduleshe?slide=13 1つのリポジトリに、helloモジュールとworldモジュール が含まれる =multi-module repositories
  2. すべてのモジュールをメインモジュールとして扱います . ├── hello │ ├── go.mod │ ├── go.sum

    │ └── hello.go └── world ├── go.mod ├── go.sum └── world.go . ├── go.work ├── hello │ ├── go.mod │ ├── go.sum │ └── hello.go └── world ├── go.mod ├── go.sum └── world.go Workspacesをつかうと 同じディレクトリに2つのモジュール 1つのメインモジュールとして扱う (実際は2モジュール)
  3. Workspacesなし(single-moduleの場合) . ├── hello │ ├── go.mod │ ├── go.sum

    │ ├── greet │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum └── world.go 同じモジュール内のパッケージであれば、GitHubにリリースしていなくても問題なく実行できる! greet.go hello.go
  4. Workspacesなし(multi-moduleの場合) . ├── hello │ ├── go.mod │ ├── greet

    │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go まだGitHubにリリースしていない、異なるモジュールのパッケージを使おうとするとエラーになる greet.go hello.go
  5. エラーになる理由 GOPATH mode module-aware mode 拙スライドより https://speakerdeck.com/uhzz/go-patukeziguan-li-depkarago-moduleshe?slide=14 違うモジュールのパッケージの場合、go.modに記載されているパッケージ を参照します。 go.modにパッケージの記載がない場合は、go

    getコマンドを実行して、 go.modを更新する必要があります。 例えば、ローカルで開発している共通モジュールをGitHubにリリースして いない場合、共通モジュールを使う側でgo mod tidyコマンドをすると、 フェッチが失敗します
  6. Workspacesあり(multi-moduleの場合) . ├── go.work ├── hello │ ├── go.mod │

    ├── greet │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go Workspacesを導入すると、同じモジュール内のパッケージのように扱うことができるので、実行できる!
  7. replaceディレクティブをつかっていた . ├── hello │ ├── go.mod │ ├── greet

    │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go go.modにreplaceディレクティブを用意することで、ローカルにある別モジュールを参照することができる! このパッケージのモジュールをreplaceディレクティブで指定する
  8. replaceディレクティブの問題点 . ├── hello │ ├── go.mod │ ├── greet

    │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go replaceディレクティブによって設定されたバージョンは、 ローカルのモジュールを参照しているため、プッシュするときに go getコマンドでgo.modを更新する必要がある
  9. go work initコマンドを実行 . ├── go.work ├── hello │ ├──

    go.mod │ ├── greet │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go go work initコマンドでgo.workファイルを生成することでWorkspacesを利用できるようになります コマンドで指定したモジュールが登録される
  10. Workspacesあり(multi-moduleの場合) . ├── go.work ├── hello │ ├── go.mod │

    ├── greet │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go Workspacesを利用することで、replaceディレクティブが不要になる! リポジトリ内のモジュールをすべてgo.workで管理することができる(べんり) module名とバージョンのみ
  11. リリースタグはセマンティックバージョニングで! リリースタグをつけよう require ( github.com/uh-zz/hogefuga v0.0.0-20220119194325-abc123 github.com/uh-zz/fugafuga/config v1.14.0 github.com/uh-zz/nyaooon/service/v2 v1.12.0

    ) モジュールの実体は、「パッケージ(s)+リビジョン(バージョン)」であるから、 リリースタグをつけることには意義がある 補足: タグを付けていない場合も、「v0.0.0-hogehogefugafuaga-hogehoge」 のようにコミット情報から生成されますが、いまいちカッコがつかない (ので、タグをつけた方がイイデスネ) https://semver.org/lang/ja/ 拙スライドより https://speakerdeck.com/uhzz/go-patukeziguan-li-depkarago-moduleshe?slide=18
  12. - Go 1.18集中連載 Workspacesモードを試してみた https://future-architect.github.io/articles/20220216a/#fn:1 - Go Modules Reference -

    Workspaces https://go.dev/ref/mod#workspaces - 手を動かして学ぶ Go1.18の新機能 https://docs.google.com/presentation/d/1uyslEAHd6qLOn7Q9BqjMl3lB6UQ9vLyR2FYORXso0Iw/edit#slide=id.g1195179066c_0_263 - Go1.18からのWorkspace modeをさっそく使ってみた https://zenn.dev/kimuson13/articles/go-workspace-mode-impressions#%E6%B0%97%E3%82%92%E4%BB%98%E3%81%91%E3%81%AA%E3%81%84%E3%81 %A8%E3%81%84%E3%81%91%E3%81%AA%E3%81%84%E7%82%B9 - Proposal: Multi-Module Workspaces in cmd/go  https://go.googlesource.com/proposal/+/master/design/45713-workspace.md#preventing-files-from-being-checked-in-to-repositories - 参考