• Like
Dependency Management in Go
Upcoming SlideShare
Loading in...5
×

Dependency Management in Go

  • 2,505 views
Uploaded on

Golang Taipei Gathering #2

Golang Taipei Gathering #2

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
2,505
On Slideshare
0
From Embeds
0
Number of Embeds
10

Actions

Shares
Downloads
16
Comments
0
Likes
4

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?