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
990
Goで実現するGraceful Shutdown ~実運用での課題と解決策~ / Go Conference 2025
uhzz
2
2k
MCP調べてみました! / Exploring MCP
uhzz
2
4.2k
自動生成されたhttpエンドポイントごとにカスタムミドルウェアを挿入したい話
uhzz
1
3.1k
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
ジョジョの世界をXRで再現する
mofurune
0
130
Jetpack Compose Mechanisms
skydoves
2
520
Are APIs Still Relevant in the AI Era?
soyuka
0
430
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
350
Workers Cache を知る
syumai
0
340
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
1
900
Simple Storage Service(S3) is not simple
iwatsukayura
0
210
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
7.7k
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
160
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
350
contenteditable と日本語入力に向き合う
colorful12
0
160
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
550
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.7k
Evolving SEO for Evolving Search Engines
ryanjones
0
310
How to make the Groovebox
asonas
2
2.5k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
510
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
460
Raft: Consensus for Rubyists
vanstee
142
7.7k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
510
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
840
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
450
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
490
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 - 参考