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
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
970
Goで実現するGraceful Shutdown ~実運用での課題と解決策~ / Go Conference 2025
uhzz
2
1.9k
MCP調べてみました! / Exploring MCP
uhzz
2
4.2k
自動生成されたhttpエンドポイントごとにカスタムミドルウェアを挿入したい話
uhzz
1
3k
Enablement Bootcampを終えて -Enablement Bootcamp for Gopherizing 〜業務で使えるGoを学ぼう〜
uhzz
0
370
安全にQAを行える環境が整いました!- Kyash TechTalk #6 - Kyashの開発をチラ見せ
uhzz
0
900
【Go:パッケージ管理】DepからGo Modulesへ
uhzz
0
1.2k
コードレビューで泣かないためのintSize = 32 << (^uint(0) >> 63)
uhzz
0
280
「ウチも、gRPC使えますか?」
uhzz
0
360
Other Decks in Programming
See All in Programming
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
270
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
0
380
Building an Out-of-Order CPU
latte72
0
700
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
160
不幸な GC
chencmd
0
880
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.8k
Go × SIMDで高速化するベクトル検索 ~ルーフラインモデルでSIMDが効く境界を探れ! ~
po3rin
1
100
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
110
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
680
ソフトウェアラスタライザ
fadis
1
790
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
360
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
270
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
560
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Unsuck your backbone
ammeep
672
58k
GitHub's CSS Performance
jonrohan
1033
470k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
490
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
520
Claude Code のすすめ
schroneko
67
230k
Embracing the Ebb and Flow
colly
88
5.2k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
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 - 参考