Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dependency Management in Go

94575b73a05d48e567423d7d6ca8273c?s=47 Poga Po
August 28, 2013

Dependency Management in Go

Golang Taipei Gathering #2

94575b73a05d48e567423d7d6ca8273c?s=128

Poga Po

August 28, 2013
Tweet

More Decks by Poga Po

Other Decks in Programming

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?