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
dragon-importsで爆速goimports生活 - プロジェクト Go module...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
monochromegane
February 12, 2019
Programming
1
590
dragon-importsで爆速goimports生活 - プロジェクト Go modules -/dragon-imports
Fukuoka.go#13+Okayama.go #fukuokago
https://fukuokago.connpass.com/event/112073/
monochromegane
February 12, 2019
Tweet
Share
More Decks by monochromegane
See All by monochromegane
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
180
不確実性下における目的と手段の統合的探索に向けた連続腕バンディットの応用 / iot70_gp_rff_mab
monochromegane
2
280
なめらかなシステムと運用維持の終わらぬ未来 / dicomo2025_coherently_fittable_system
monochromegane
0
7.4k
ベクトル検索システムの気持ち
monochromegane
38
12k
Go言語での実装を通して学ぶ、高速なベクトル検索を支えるクラスタリング技術/fukuokago-kmeans
monochromegane
1
260
Go言語でターミナルフレンドリーなAIコマンド、afaを作った/fukuokago20_afa
monochromegane
2
330
多様かつ継続的に変化する環境に適応する情報システム/thesis-defense-presentation
monochromegane
1
1.1k
Online Nonstationary and Nonlinear Bandits with Recursive Weighted Gaussian Process
monochromegane
0
800
AIを前提とした体験の実現に向けて/toward_ai_based_experiences
monochromegane
2
1.1k
Other Decks in Programming
See All in Programming
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
130
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
690
CSC307 Lecture 05
javiergs
PRO
0
500
余白を設計しフロントエンド開発を 加速させる
tsukuha
7
2.1k
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
300
SourceGeneratorのススメ
htkym
0
200
登壇資料を作る時に意識していること #登壇資料_findy
konifar
4
1.2k
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.5k
ノイジーネイバー問題を解決する 公平なキューイング
occhi
0
100
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
AIによる開発の民主化を支える コンテキスト管理のこれまでとこれから
mulyu
3
300
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
BBQ
matthewcrist
89
10k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
Exploring anti-patterns in Rails
aemeredith
2
250
AI Search: Where Are We & What Can We Do About It?
aleyda
0
6.9k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
The SEO identity crisis: Don't let AI make you average
varn
0
240
Designing Powerful Visuals for Engaging Learning
tmiket
0
230
エンジニアに許された特別な時間の終わり
watany
106
230k
The Language of Interfaces
destraynor
162
26k
AI: The stuff that nobody shows you
jnunemaker
PRO
2
260
Transcript
- ϓϩδΣΫτ Go modules - ࡾ༔հ / Pepabo R&D Institute,
GMO Pepabo, Inc. 2019.02.12 Fukuoka.go#13+Okayama.go dragon-importsͰ രgoimportsੜ׆
ϓϦϯγύϧΤϯδχΞ ࡾ༔հ!NPOPDISPNFHBOF (.0ϖύϘגࣜձࣾϖύϘݚڀॴ IUUQTCMPHNPOPDISPNFHBOFDPN
1. Motivation 2. Problem of goimports 3. Approach by dragon-imports
4. Evalution 5. Discussion about Go modules 3 ࣍
1. Motivation
͓·͑ ࠓ·ͰΠϯϙʔτͨ͠ ίʔυͷΛ ͓΅͍͑ͯΔͷ͔ʁ
• goimportsimportߦͷߋ৽ΛࣗಈͰߦͬͯ͘ΕΔͨΊඇৗʹศར • goimports։ൃதɼԿ࣮ߦ͞ΕΔ • ୳ࡧରͷύοέʔδ͕૿͑Δͱ࣮ߦ͕͘ͳΓੜ࢈ੑ͕Լ͕Δ • ಛʹghq+pecoͰϩʔΧϧϦϙδτϦΛ౷Ұཧ͍ͯ͠Δ߹ʹݦஶ • ͦ͜Ͱ୳ࡧରͷύοέʔδ͕૿࣮͑ͯߦ͕มΘΒͳ͍άϨʔτͳ
goimports͕ٻΊΒΕΔ 6 goimportsͷԽΛղܾ͍ͨ͠
2. Problem of goimports
• ରͷίʔυΛASTʹม͠importߦΛߋ৽ɼՃɼআɽͦͷޙɼϑΥʔ ϚοτࡁΈίʔυΛग़ྗ͢Δ • ୳ࡧରͷύοέʔδʹඪ४ϥΠϒϥϦͱ֎෦ύοέʔδ͕͋Δ • $GOPATH/src, $GOPATH/pkg/mod • ରͷೖྗதͷύοέʔδ໊ɼγϯϘϧ໊ͷΈ߹ΘͤΛશͯຬͨ͢Πϯϙʔ
τύεΛղܾ͢Δ • math/rand (import path), rand (package name), Int (symbol) 8 goimportsͷجຊ
9 goimportsͷ࣮ߦྫ $ cat imp.txt package imp func hoge() {
fmt.Println("hello.") kaburaya.Recorder } $ goimports imp.txt package imp import ( "fmt" "github.com/monochromegane/kaburaya" ) func hoge() { fmt.Println("hello.") kaburaya.Recorder }
• ΑΓਖ਼͘͠୳ࡧରͱͳΔʮ֎෦ʯύοέʔδ͕૿Ճͨ͠߹ʹ͘ͳΔ • ΫϥΠΞϯτڥ࣌ؒܦաʹΑͬͯ֎෦ύοέʔδҰཡมԽ͢Δ͜ͱ͔Βɼ୳ࡧ ରͷσΟϨΫτϦ୳ࡧɼߏจղੳɼϦϑΝϨϯεͷநग़Λߦ͏ඞཁ͕͋ΔͨΊɽ • ରʹɼύοέʔδҰཡ͕ڥʹΑͬͯมԽ͠ͳ͍ඪ४ύοέʔδΠϯϙʔ τύεɼύοέʔδ໊ɼγϯϘϧͷϦετΛࣄલʹղੳ͞Ε͍ͯΔ 10 ͳͥgoimports͕͘ͳΔͷ͔
goimportsඪ४ύοέʔδ 11 package imports var stdlib = map[string]map[string]bool{ "archive/tar": map[string]bool{
"ErrFieldTooLong": true, "ErrHeader": true, "ErrWriteAfterClose": true, "ErrWriteTooLong": true, $GOROOT/api/go1.*txt golang.org/x/tools/imports/mkstdlib.go golang.org/x/tools/imports/zstdlib.go golang.org/x/tools/cmd/goimports.go#main golang.org/x/tools/imports/imports.go#Process golang.org/x/tools/imports/fix.go#addStdlibCandidates pkg crypto/rsa, method (*PrivateKey) Size() int pkg crypto/rsa, method (*PublicKey) Size() int
• First pass (Πϯϙʔτ͕ඞཁ͔ௐΔ) • ରͷϦϑΝϨϯεҰཡͱimportߦ͕߹க͢Δ͔֬ೝ • Second pass (ඪ४ύοέʔδ·ͨطimportߦ͔Βղܾ)
• var stdlib·ͨଞϑΝΠϧͰimportࡁΈͷߦΛީิͱͯ͠߹க͢Δ͔֬ೝ • Third pass (֎෦ύοέʔδ͔Βղܾ) • $GOPATH/src͘͠$GOPATH/pkg/mod͔ΒϦϑΝϨϯεʹࣅͨσΟϨΫτϦΛߜΓࠐ ΈɼީิϑΝΠϧΛղੳͯ֬͠ೝ 12 goimportsͷߴԽͷ
13 ஈ֊͝ͱͷ࣮ߦ TUQBTT ЖT OEQBTT ЖT SEQBTT ЖT Πϯϙʔτෆཁ
ඪ४ϥΠϒϥϦͷΤΫεϙʔτΛࢀর ଞϑΝΠϧͷΠϯϙʔτΛࢀর ֎෦ύοέʔδͷΤΫεϙʔτΛࢀর $ tree !"" imp.txt !"" other.go #"" other2.go $ find . -type d | wc -l 120840 Original goimports
3. Approach by dragon-imports
• ΫϥΠΞϯτڥ͝ͱʹ୳ࡧରͷύοέʔδҰཡਓؒ࣌ؒͰ͔͠มԽ͠ ͳ͍ • ࣄલղੳͷ݁Ռ͕ݱঢ়ʹԊΘͳ͚Εશ୳ࡧΛߦ͏ϑΥʔϧόοΫ͕Մೳ • ͞ΒʹΠϯϙʔτߦʹޡΓ͕͋ͬͯϏϧυͰࣦഊ͢Δ • ͜ΕΒͷલఏ͔Β֤ΫϥΠΞϯτڥ͝ͱʹ୳ࡧରͷύοέʔδΛҙͷλ ΠϛϯάͰࣄલղੳ͓ͯ͘͜͠ͱͰgoimportsͷߴԽ͕Մೳ
15 ఏҊख๏ͷண؟
• monochromegane/dragon-imports • A tool for speedup go imports command
• https://github.com/monochromegane/dragon-imports • ඪ४ύοέʔδͱ$GOPATH/srcΛղੳ͠ɼzstdlib.goΛ࠶ੜɼgoimportsͷ ࠶Πϯετʔϧ·Ͱߦ͏ • zstdlib.go(=var stdlib)ͷͷߴ͞ʹΑΓैੑ൚༻ੑ͕ߴ·Δ 16 ఏҊख๏ͷ࣮ $ go get github.com/monochromegane/dragon-imports/... $ dragon-imports
dragon-imports 17 package imports var stdlib = map[string]map[string]bool{ "archive/tar": map[string]bool{
"ErrFieldTooLong": true, "ErrHeader": true, "ErrWriteAfterClose": true, "ErrWriteTooLong": true, $GOROOT/api/go1.*txt dragon-imports golang.org/x/tools/imports/zstdlib.go golang.org/x/tools/cmd/goimports.go#main golang.org/x/tools/imports/imports.go#Process golang.org/x/tools/imports/fix.go#addStdlibCandidates $GOPATH/**/*.go
4. Evalution
19 ࣮ߦ࣌ؒͷൺֱ TUQBTT ЖT OEQBTT ЖT SEQBTT ЖT Πϯϙʔτෆཁ
ඪ४ϥΠϒϥϦͷΤΫεϙʔτΛࢀর ଞϑΝΠϧͷΠϯϙʔτΛࢀর ֎෦ύοέʔδͷΤΫεϙʔτΛࢀর Original goimports TUQBTT ЖT OEQBTT ЖT SEQBTT ЖT Πϯϙʔτෆཁ ඪ४ϥΠϒϥϦͷΤΫεϙʔτΛࢀর ଞϑΝΠϧͷΠϯϙʔτΛࢀর ֎෦ύοέʔδͷΤΫεϙʔτΛࢀর Dragonize goimports
5. Discussion about Go modules
• Go modulesΛ༗ޮʹ͢Δͱ$GOPATH/srcͰͳ͘$GOPATH/pkg/modԼ ͷόʔδϣχϯάཧ͞Εͨύοέʔδ͕ར༻͞ΕΔ • goimportsͰ୳ࡧରΛಉ͡Α͏ʹΓସ͍͑ͯΔ • ֎෦ύοέʔδʹόʔδϣχϯάͷ֓೦͕ಋೖ͞ΕΔͨΊɼಉҰΠϯϙʔτύ εͰ͋ͬͯγϯϘϧϦετ͕ҟͳΔՄೳੑ͕͋Δʢͨͩ͠ϝδϟʔόʔδϣ ϯ͕ҟͳΔͱ/v2ͷΑ͏ʹผͱͯ͠ѻ͑Δʣ
• ඪ४ύοέʔδόʔδϣχϯάͷ֓೦͕·ͩͳ͍ͨΊzstdlib.goෳόʔ δϣϯͷγϯϘϧΛѻ͏ߏʹͳ͍ͬͯͳ͍ 21 Go modulesΛͲ͏ѻ͏͔
• Go modulesཧͷ֎෦ύοέʔδΛࣄલղੳ͢Δ • ΦϓγϣϯʹΑͬͯղੳରΛGOPATH/pkg/modʹมߋ͢ΔɽGO111MODULES=autoͷ ڍಈաظͰ͋Δ͜ͱɼzstdlib.goWorkingDirΛΕͳ͍͜ͱ͔ΒରԠ͠ͳ͍ • ֎෦ύοέʔδ֤ϝδϟʔόʔδϣϯͷ࠷৽ͷΈΛࣄલղੳ͢Δ • ϚΠφʔόʔδϣϯҎԼͷෳόʔδϣϯ͕ଘࡏ͢Δ߹ɼbreaking
changeͳ͍લఏͰ ඪ४ύοέʔδͱಉ༷ʹ࠷৽ͷΈରԠɽsemverະରԠͳ֎෦ύοέʔδʹ͓͍ͯຊํ ʹΑͬͯޡఆࢭɼ࠷৽Խͷಈػ͚ͱ͢Δ • vendoringࣄલղੳ͠ͳ͍ • ͦͦڞ௨Խ͞Εͨύοέʔδ܈͕૿େ͢Δ͜ͱͰҾ͖ى͜͞ΕΔԆͰ͋ΓɼϓϩδΣ Ϋτ͝ͱͷ࠷খͷύοέʔδ୳ࡧʹΑΔԆߟ͑ʹ͍ͨ͘Ί 22 Go modulesΛͲ͏ѻ͏͔
23 dragon-imports $ go get -u github.com/monochromegane/dragon-imports/... $ dragon-imports --gomodules
• gomodulesΦϓγϣϯΛ࣮ݧతʹఏڙ • Go1.12ͷਖ਼ࣜαϙʔτͷঢ়گΛݟͯΦϓγϣϯॳظΛtrueͱ͢Δ༧ఆ • ܅ࠓ͙͢go get -u !!!
• Go modulesͰv2Ҏ߱ͷϝδϟʔόʔδϣϯ͝ͱʹΠϯϙʔτύε͕ҟͳΔ • ͔͠͠ύοέʔδύεϝδϟʔόʔδϣϯΛؚ·ͳ͍ 24 v2ͱ͍͏٬ $ tree !""
hellomod $ #""
[email protected]
#""
[email protected]
package main import "github.com/donvito/hellomod/v2" func main() { hellomod.SayHello("Melvin") } • ඪ४ϥΠϒϥϦόʔδϣϯΛߟྀ͠ͳ͍ͨΊ “v2”ͱ“hellomod”Λൺֱ͞Ε ͯ͠·͍ɼ֎෦ύοέʔδ୳ࡧ͕࢝·ͬͯ͠·͏……………………………!!!
R.I.P.
• dragon-importsͷΈΛհͨ͠ • UsefulͳΕͲGo modules࣌ʹશରԠݫͦ͠͏ • ७ਮʹύοέʔδ͚ͩͷσΟϨΫτϦͱͳΔͷͰԆൃੜ͠ͳ͍ͱࢥΘΕ Δɽ͠Β͘ӡ༻ͯ͠ࠔͬͨΒdragon-import.v2Λߟ͑Δɽ • Go
modules࣌ͷศརπʔϧ࡞͍ͬͯ͜͏ • ͱΓ͋͑ͣGo modulesʹدͤΔʹͨͬͯҰཡΛऔಘ͢ΔͨΊͷ ’mole(ཽ)’Λ࡞ͬͯΔ https://github.com/monochromegane/mole 26 ·ͱΊ
None