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

Dependency Management in Go

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Poga Po Poga Po
August 28, 2013

Dependency Management in Go

Golang Taipei Gathering #2

Avatar for Poga Po

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