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

Dependency Management in Go

Poga Po
August 28, 2013

Dependency Management in Go

Golang Taipei Gathering #2

Poga Po

August 28, 2013
Tweet

More Decks by Poga Po

Other Decks in Programming

Transcript

  1. Haunts • Open Source • https://github.com/runningwild/haunts • Written in Go

    • https://github.com/go-gl/gl • Screwed by dependency hell
  2. • $GOPATH/ • src/ • github.com/ • go-gl/ • gl/

    • ... • pkg/ • bin/ import "github.com/go-gl/gl"
  3. import path • 3 in 1 • remote repo url

    • local package install path • package name
  4. 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
  5. 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
  6. expectation of go • green master policy • always backward

    compatible • remote repo url = local install path = package name
  7. 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
  8. Haunts • dependency renamed • dependency becomes backward incompatible •

    developer lost local installed version • developer make local changes and didn’t push upstream
  9. Solutions • Manage Dependencies by yourself • ... or with

    some tools • centralized package management
  10. DIY • $GOPATH/ • src/ • github.com/ • USER/ •

    PROJECT/ • ... • vender/ • github.com/ • go-gl/ • gl • $GOPATH/ • src/ • github.com/ • USER/ • PROJECT/ • ... • go-gl/ • gl/ • ...
  11. 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
  12. Tools • Goven • https://github.com/kr/goven • copy local packages into

    project path • and remove .git/ • rewrite import paths
  13. 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
  14. Centralized Package Management • Go Nuts • gonuts.io • import

    “gonuts.io/vendor/nut” • import “gonuts.io/vendor/nut/version” • currently host 11 package only
  15. 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