Your SlideShare is downloading. ×

Dependency Management in Go

3,102

Published on

Golang Taipei Gathering #2

Golang Taipei Gathering #2

Published in: Technology
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,102
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
18
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Dependency Management in Go Poga
  • 2. A KickStarter
  • 3. Haunts • Open Source • https://github.com/runningwild/haunts • Written in Go • https://github.com/go-gl/gl • Screwed by dependency hell
  • 4. import "github.com/go-gl/gl" go get "github.com/go-gl/gl"
  • 5. • $GOPATH/ • src/ • github.com/ • go-gl/ • gl/ • ... • pkg/ • bin/ import "github.com/go-gl/gl"
  • 6. import path • 3 in 1 • remote repo url • local package install path • package name
  • 7. go get go get "github.com/go-gl/gl"
  • 8. go get git clone go install += go get "github.com/go-gl/gl"
  • 9. 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
  • 10. 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
  • 11. go 對你的 package 有所期待
  • 12. expectation of go • green master policy • always backward compatible • remote repo url = local install path = package name
  • 13. 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
  • 14. Haunts • dependency renamed • dependency becomes backward incompatible • developer lost local installed version • developer make local changes and didn’t push upstream
  • 15. Solutions • Manage Dependencies by yourself • ... or with some tools • centralized package management
  • 16. DIY • $GOPATH/ • src/ • github.com/ • USER/ • PROJECT/ • ... • vender/ • github.com/ • go-gl/ • gl • $GOPATH/ • src/ • github.com/ • USER/ • PROJECT/ • ... • go-gl/ • gl/ • ...
  • 17. import "github.com/USER/PROJECT/vendor/github.com/go-gl/gl" http://camlistore.org/ use this solution rewrite import path with a python script
  • 18. 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
  • 19. Tools • Goven • https://github.com/kr/goven • copy local packages into project path • and remove .git/ • rewrite import paths
  • 20. Tools • Gopin • https://github.com/laher/gopin • download specified version
  • 21. 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
  • 22. Centralized Package Management • Go Nuts • gonuts.io • import “gonuts.io/vendor/nut” • import “gonuts.io/vendor/nut/version” • currently host 11 package only
  • 23. 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
  • 24. Thank you Q&A?

×