dependency management in go
DESCRIPTION
Golang Taipei Gathering #2TRANSCRIPT
![Page 1: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/1.jpg)
Dependency Management in Go
Poga
![Page 2: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/2.jpg)
A KickStarter
![Page 3: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/3.jpg)
Haunts
• Open Source• https://github.com/runningwild/haunts
• Written in Go• https://github.com/go-gl/gl
• Screwed by dependency hell
![Page 4: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/4.jpg)
import "github.com/go-gl/gl"
go get "github.com/go-gl/gl"
![Page 5: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/5.jpg)
• $GOPATH/
• src/
• github.com/
• go-gl/
• gl/
• ...
• pkg/
• bin/
import "github.com/go-gl/gl"
![Page 6: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/6.jpg)
import path
• 3 in 1
• remote repo url
• local package install path
• package name
![Page 7: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/7.jpg)
go get
go get "github.com/go-gl/gl"
![Page 8: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/8.jpg)
go get
git clone
go install
+=
go get "github.com/go-gl/gl"
![Page 9: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/9.jpg)
go get (the git clone part)
• can’t specify version
• looks for tag/branch name matching your go version
• if no such exist, it goes for the most recent version/master branch
• won’t update cloned repo by default
• use -u
![Page 10: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/10.jpg)
go get (the go install part)
• build/install to $GOPATH
• first path in $GOPATH if it contains multiple paths
• weird behavior when package names conflict
![Page 11: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/11.jpg)
go 對你的 package 有所期待
![Page 12: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/12.jpg)
expectation of go
• green master policy
• always backward compatible
• remote repo url = local install path = package name
![Page 13: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/13.jpg)
BUT• People make mistakes
• repos may change their name/location, or removed
• same package, different import paths
• Dependency Hell
• what if your project depends on version A and a dependency needs version B?
• different versions, same import paths
![Page 14: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/14.jpg)
Haunts
• dependency renamed
• dependency becomes backward incompatible
• developer lost local installed version
• developer make local changes and didn’t push upstream
![Page 15: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/15.jpg)
Solutions
• Manage Dependencies by yourself
• ... or with some tools
• centralized package management
![Page 16: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/16.jpg)
DIY• $GOPATH/
• src/
• github.com/
• USER/
• PROJECT/
• ...
• vender/
• github.com/
• go-gl/• gl
• $GOPATH/
• src/
• github.com/
• USER/
• PROJECT/
• ...
• go-gl/
• gl/
• ...
![Page 17: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/17.jpg)
import "github.com/USER/PROJECT/vendor/github.com/go-gl/gl"
http://camlistore.org/ use this solutionrewrite import path with a python script
![Page 18: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/18.jpg)
DIY Update
• git submodule
• http://git-scm.com/book/en/Git-Tools-Submodules
• git subtree merge
• http://git-scm.com/book/en/Git-Tools-Subtree-Merging
![Page 19: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/19.jpg)
Tools
• Goven
• https://github.com/kr/goven
• copy local packages into project path
• and remove .git/
• rewrite import paths
![Page 20: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/20.jpg)
Tools
• Gopin
• https://github.com/laher/gopin
• download specified version
![Page 21: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/21.jpg)
Tools
• Rx
• https://github.com/kylelemons/rx
• track repos and their tags
• update to a specified tag
• automatically run tests for dependents
• rollback if something is broken
• save current versioning setup as a config
• share this config with your team
![Page 22: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/22.jpg)
Centralized Package Management
• Go Nuts
• gonuts.io
• import “gonuts.io/vendor/nut”
• import “gonuts.io/vendor/nut/version”
• currently host 11 package only
![Page 23: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/23.jpg)
My Conclusion
• No perfect way (now)
• use Camlistore way
• vender 3rd-party dependencies
• rewrite import path with makefile/scripts/goven
• go/parser will be helpful
![Page 24: Dependency Management in Go](https://reader034.vdocuments.site/reader034/viewer/2022042714/54c845a04a7959c51c8b4578/html5/thumbnails/24.jpg)
Thank you
Q&A?