Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Goのローカル開発をWorkspacesではじめよう
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
uhzz
September 16, 2022
Programming
1.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goのローカル開発をWorkspacesではじめよう
uhzz
September 16, 2022
More Decks by uhzz
See All by uhzz
DI コンテナ自動生成ツールを実装してみた / intro-autodi
uhzz
0
920
Goで実現するGraceful Shutdown ~実運用での課題と解決策~ / Go Conference 2025
uhzz
2
1.8k
MCP調べてみました! / Exploring MCP
uhzz
2
4.1k
自動生成されたhttpエンドポイントごとにカスタムミドルウェアを挿入したい話
uhzz
1
3k
Enablement Bootcampを終えて -Enablement Bootcamp for Gopherizing 〜業務で使えるGoを学ぼう〜
uhzz
0
350
安全にQAを行える環境が整いました!- Kyash TechTalk #6 - Kyashの開発をチラ見せ
uhzz
0
880
【Go:パッケージ管理】DepからGo Modulesへ
uhzz
0
1.2k
コードレビューで泣かないためのintSize = 32 << (^uint(0) >> 63)
uhzz
0
280
「ウチも、gRPC使えますか?」
uhzz
0
340
Other Decks in Programming
See All in Programming
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
2.9k
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.6k
スマートグラスで並列バイブコーディング
hyshu
0
280
これからAgentCoreを触る方へトレンドはGatewayです
har1101
6
470
自作OSでスライド発表する
uyuki234
1
3.6k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
290
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
8.6k
Webフレームワークの ベンチマークについて
yusukebe
0
190
フィードバックで育てるAI開発
kotaminato
1
100
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
120
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
190
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
120
Featured
See All Featured
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
180
We Have a Design System, Now What?
morganepeng
55
8.2k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Chasing Engaging Ingredients in Design
codingconduct
0
230
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Paper Plane (Part 1)
katiecoart
PRO
0
9.5k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
170
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Between Models and Reality
mayunak
4
360
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Transcript
Goのローカル開発をWorkspacesではじめよう @_uhzz_
- multi-module repositoriesとは - Workspacesとは - これまでのローカル開発(multi-module) - Workspacesをつかったローカル開発(multi-module) -
私たちがやること 目次
multi-module repositoriesとは
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
Workspacesとは
すべてのモジュールをメインモジュールとして扱います . ├── 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モジュール)
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
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
エラーになる理由 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コマンドをすると、 フェッチが失敗します
Workspacesあり(multi-moduleの場合) . ├── go.work ├── hello │ ├── go.mod │
├── greet │ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go Workspacesを導入すると、同じモジュール内のパッケージのように扱うことができるので、実行できる!
これまでのローカル開発(multi-module)
replaceディレクティブをつかっていた . ├── hello │ ├── go.mod │ ├── greet
│ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go go.modにreplaceディレクティブを用意することで、ローカルにある別モジュールを参照することができる! このパッケージのモジュールをreplaceディレクティブで指定する
replaceディレクティブの問題点 . ├── hello │ ├── go.mod │ ├── greet
│ │ └── greet.go │ └── hello.go └── world ├── go.mod ├── go.sum ├── greet │ └── greet.go └── world.go replaceディレクティブによって設定されたバージョンは、 ローカルのモジュールを参照しているため、プッシュするときに go getコマンドでgo.modを更新する必要がある
Workspacesをつかったローカル開発 (multi-module)
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を利用できるようになります コマンドで指定したモジュールが登録される
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名とバージョンのみ
私たちがやること
go.workは.gitignoreに追加しておこう go.modのreplaceディレクティブと同じく、go.workがあることによってビルド設定が変わってしまい、 モジュールを使用するユーザーにやさしくない https://go.googlesource.com/proposal/+/master/design/45713-workspace.md#prev enting-files-from-being-checked-in-to-repositories go.workを含むリポジトリに対して警告を出す必要がある、とのことなので.gitignoreに追加しておくとよさそう
go.workをプッシュしてしまったときのため CIでビルドコマンドを設定している場合は、GOWORK=offを追加する go.workがある場合でもWorkspacesを利用しないモードになり、ビルドできなくなる
プッシュするときはgo.modを更新しておく 参照しているモジュールをGitHubにリリースして、go getコマンドでgo.modを更新しよう go.modを更新しない場合は、別のモジュールをインポートできないのでわすれずに
リリースタグはセマンティックバージョニングで! リリースタグをつけよう 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
- 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 - 参考