blob: 9e6313477bd289da9634f2b1a03680c68715c197 [file] [log] [blame] [view]
# gvt, the go vendoring tool
[![GoDoc](https://godoc.org/github.com/FiloSottile/gvt?status.svg)](https://godoc.org/github.com/FiloSottile/gvt)
[![Build Status](https://travis-ci.org/FiloSottile/gvt.svg?branch=master)](https://travis-ci.org/FiloSottile/gvt)
`gvt` is a simple Go vendoring tool made for the
[GO15VENDOREXPERIMENT](https://docs.google.com/document/d/1Bz5-UB7g2uPBdOx-rw5t9MxJwkfpx90cqG9AFL0JAYo/edit),
based on [gb-vendor](https://github.com/constabulary/gb).
It lets you easily and "idiomatically" include external dependencies in your repository to get
reproducible builds.
* No need to learn a new tool or format!
You already know how to use `gvt`: just run `gvt fetch` when and like you would run `go get`.
You can imagine what `gvt update` and `gvt delete` do.
* No need to change how you build your project!
`gvt` downloads packages to `./vendor/...`. With `GO15VENDOREXPERIMENT=1` the stock Go compiler
will find and use those dependencies automatically (without import path or GOPATH changes).
* No need to manually chase, copy or cleanup dependencies!
`gvt` works recursively as you would expect, and lets you update vendored dependencies. It also
writes a manifest to `./vendor/manifest` and never touches your system GOPATH. Finally, it
strips the VCS metadata so that you can commit the vendored source cleanly.
* No need for your users and occasional contributors to install **or even know about** gvt!
Packages whose dependencies are vendored with `gvt` are `go build`-able and `go get`-able out of
the box by Go 1.5 with `GO15VENDOREXPERIMENT=1` set.
*Note that projects must live within the GOPATH tree in order to be go buildable with the
GO15VENDOREXPERIMENT flag.*
If you use and like (or dislike!) `gvt`, it would definitely make my day better if you dropped a
line at `gvt -at- filippo.io` :)
## Installation
With a [correctly configured](https://golang.org/doc/code.html#GOPATH) Go installation:
```
GO15VENDOREXPERIMENT=1 go get -u github.com/FiloSottile/gvt
```
## Usage
You know how to use `go get`? That's how you use `gvt fetch`.
```
# This will fetch the dependency into the ./vendor folder.
$ gvt fetch github.com/fatih/color
2015/09/05 02:38:06 fetching recursive dependency github.com/mattn/go-isatty
2015/09/05 02:38:07 fetching recursive dependency github.com/shiena/ansicolor
$ tree -d
.
└── vendor
└── github.com
├── fatih
│ └── color
├── mattn
│ └── go-isatty
└── shiena
└── ansicolor
└── ansicolor
9 directories
$ cat > main.go
package main
import "github.com/fatih/color"
func main() {
color.Red("Hello, world!")
}
$ export GO15VENDOREXPERIMENT=1
$ go build .
$ ./hello
Hello, world!
$ git add main.go vendor/ && git commit
```
A full set of example usage can be found on [GoDoc](https://godoc.org/github.com/FiloSottile/gvt).
## Alternative: not checking in vendored source
Some developers prefer not to check in the source of the vendored dependencies. In that case you can
add lines like these to e.g. your `.gitignore`
vendor/**
!vendor/manifest
When you check out the source again, you can then run `gvt restore` to fetch all the dependencies at
the revisions specified in the `vendor/manifest` file.
Please consider that this approach has the following consequences:
* the package consumer will need gvt to fetch the dependencies
* the dependencies will need to remain available from the source repositories: if the original
repository goes down or rewrites history, build reproducibility is lost
* `go get` won't work on your package
## Troubleshooting
### `error: tag 'fetch' not found.`
This error can occur because you have an alias for `gvt` pointing to `git verify-tag` (common if
using oh-my-zsh).
Run this, or add it to your `~/.bashrc` / `~/.zshrc`:
```
unalias gvt
```
### `go build` can't find the vendored package
Make sure you set `GO15VENDOREXPERIMENT=1`.
Also note that GO15VENDOREXPERIMENT does not apply when outside the GOPATH tree. That is, your
project must be somewhere in a subfolder of `$GOPATH`.
## License
MIT licensed. See the LICENSE file for details.