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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
450
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
430
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
200
不確実性下における目的と手段の統合的探索に向けた連続腕バンディットの応用 / iot70_gp_rff_mab
monochromegane
2
300
なめらかなシステムと運用維持の終わらぬ未来 / dicomo2025_coherently_fittable_system
monochromegane
0
8.5k
ベクトル検索システムの気持ち
monochromegane
38
12k
Go言語での実装を通して学ぶ、高速なベクトル検索を支えるクラスタリング技術/fukuokago-kmeans
monochromegane
1
280
Go言語でターミナルフレンドリーなAIコマンド、afaを作った/fukuokago20_afa
monochromegane
2
350
多様かつ継続的に変化する環境に適応する情報システム/thesis-defense-presentation
monochromegane
1
1.2k
Other Decks in Programming
See All in Programming
CSC307 Lecture 14
javiergs
PRO
0
470
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
270
TipKitTips
ktcryomm
0
170
CDIの誤解しがちな仕様とその対処TIPS
futokiyo
0
220
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
180
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
320
モジュラモノリスにおける境界をGoのinternalパッケージで守る
magavel
0
3.6k
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
260
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.1k
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
200
エラーログのマスキングの仕組みづくりに役立ったASTの話
kumoichi
0
230
Vuetify 3 → 4 何が変わった?差分と移行ポイント10分まとめ
koukimiura
0
140
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.1k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
390
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
88
The Mindset for Success: Future Career Progression
greggifford
PRO
0
280
The SEO identity crisis: Don't let AI make you average
varn
0
420
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
52k
For a Future-Friendly Web
brad_frost
183
10k
Docker and Python
trallard
47
3.8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.4k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
180
How STYLIGHT went responsive
nonsquared
100
6k
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