Use govendor to implement vendoring
The meaning of vendoring in Go is squeezing a project's all dependencies into its vendor directory. Since Go 1.6, if there is a vendor directory in current package or its parent's directory, the dependency will be searched in vendor directory first. Govendor is such a tool to help you make use of the vendor feature. In the following example, I will demonstrate how to use govendor step by step:
(1) To be more clear, I clean $GOPATH folder first:
# tree
.
0 directories, 0 files
(2) I still use playstack project to do a demo, download it:
# go get github.com/NanXiao/playstack/play
# tree
.
├── bin
│ └── play
├── pkg
│ └── linux_amd64
│ └── github.com
│ └── NanXiao
│ └── stack.a
└── src
└── github.com
└── NanXiao
├── playstack
│ ├── LICENSE
│ └── play
│ └── main.go
└── stack
├── LICENSE
├── README.md
├── stack.go
└── stack_test.go
11 directories, 8 files
The playstack depends on another 3rd-party package: stack.
(3) Install govendor:
# go get -u github.com/kardianos/govendor
(4) Change to playstack directory, and run "govendor init" command:
# cd src/github.com/NanXiao/playstack/
# govendor init
# tree
.
├── LICENSE
├── play
│ └── main.go
└── vendor
└── vendor.json
2 directories, 3 files
You can see there is an additional vendor folder which contains vendor.json file:
# cat vendor/vendor.json
{
"comment": "",
"ignore": "test",
"package": [],
"rootPath": "github.com/NanXiao/playstack"
}
(5) Execute "govendor add +external" command:
# govendor add +external
# tree
.
├── LICENSE
├── play
│ └── main.go
└── vendor
├── github.com
│ └── NanXiao
│ └── stack
│ ├── LICENSE
│ ├── README.md
│ └── stack.go
└── vendor.json
Yeah, the stack project is copied to vendor directory now. Look at vendor/vendor.json file again:
# cat vendor/vendor.json
{
"comment": "",
"ignore": "test",
"package": [
{
"checksumSHA1": "3v5ClsvqF5lU/3E3c+1gf/zVeK0=",
"path": "github.com/NanXiao/stack",
"revision": "bfb214dbdb387d1c561b3b6f305ee0d8444c864b",
"revisionTime": "2016-04-01T05:28:44Z"
}
],
"rootPath": "github.com/NanXiao/playstack"
}
The stack package info has been updated in vendor/vendor.json file.
Notice: "govendor add" copies packages from $GOPATH, and you can use "govendor fetch" to download packages from network. You can verify it through removing stack package in $GOPATH, and execute "govendor fetch github.com/NanXiao/stack" command.
(6) Update playstack in github:
This time, clean $GOPATH folder and run "go get github.com/NanXiao/playstack/play" again:
# go get github.com/NanXiao/playstack/play
# tree
.
├── bin
│ └── play
├── pkg
│ └── linux_amd64
│ └── github.com
│ └── NanXiao
│ └── playstack
│ └── vendor
│ └── github.com
│ └── NanXiao
│ └── stack.a
└── src
└── github.com
└── NanXiao
└── playstack
├── LICENSE
├── play
│ └── main.go
└── vendor
├── github.com
│ └── NanXiao
│ └── stack
│ ├── LICENSE
│ ├── README.md
│ └── stack.go
└── vendor.json
18 directories, 8 files
Compared to previous case, it is no need to store stack in $GOPATH/src/github.com/NanXiao directory, since playstack has embedded it in its vendor folder.
This is just a simple intro of govendor, for more commands' usages, you should visit its project home page.
Reference:
What does the term “vendoring” or “to vendor” mean for Ruby on Rails?;
Understanding and using the vendor folder;
Go Vendoring Beginner Tutorial.