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.