Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
2k
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
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
140
iOSDC2026登壇資料.pdf
riofujimon
0
110
Building an Out-of-Order CPU
latte72
1
750
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
0
190
Swift愛好会100回記念 第1回を振り返る
jollyjoester
0
120
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
100
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
220
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
ALB ログから Trace を気合で繋げる技術
fohte
7
890
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
Deep dive into the select statement (GopherCon UK)
jespino
0
180
Featured
See All Featured
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
A designer walks into a library…
pauljervisheath
211
25k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
900
Un-Boring Meetings
codingconduct
0
410
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
Heart Work Chapter 1 - Part 1
lfama
PRO
9
36k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The agentic SEO stack - context over prompts
schlessera
0
930
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 - 参考