Go
Vendoring
Поиск…
замечания
Vendoring - это метод обеспечения того, чтобы все ваши сторонние пакеты, которые вы используете в проекте Go, были согласованы для всех, кто разрабатывает для вашего приложения.
Когда ваш пакет Go импортирует другой пакет, компилятор обычно проверяет $GOPATH/src/
путь к импортированному проекту. Однако, если ваш пакет содержит папку с именем vendor
, компилятор сначала проверит эту папку. Это означает, что вы можете импортировать пакеты сторонних сторон в свой собственный репозиторий кода, не изменяя их код.
Vendoring - стандартная функция в Go 1.6 и выше. В Go 1.5 вам нужно установить переменную окружения GO15VENDOREXPERIMENT=1
чтобы включить распространение.
Использовать govendor для добавления внешних пакетов
Govendor - это инструмент, который используется для импорта сторонних пакетов в ваш репозиторий кода таким образом, который совместим с поставщиком golang.
Скажем, например, что вы используете сторонний пакет bosun.org/slog
:
package main
import "bosun.org/slog"
func main() {
slog.Infof("Hello World")
}
Структура вашего каталога может выглядеть так:
$GOPATH/src/
├── github.com/me/helloworld/
| ├── hello.go
├── bosun.org/slog/
| ├── ... (slog files)
Однако у кого-то, кто клонирует github.com/me/helloworld
может не быть $GOPATH/src/bosun.org/slog/
, что приведет к сбою их сборки из-за отсутствия пакетов.
Выполнение следующей команды в командной строке будет захватывать все внешние пакеты из вашего пакета Go и упаковывать необходимые биты в папку поставщика:
govendor add +e
Это дает команду govendor добавить все внешние пакеты в ваш текущий репозиторий.
Структура каталогов вашего приложения теперь будет выглядеть так:
$GOPATH/src/
├── github.com/me/helloworld/
| ├── vendor/
| | ├── bosun.org/slog/
| | | ├── ... (slog files)
| ├── hello.go
и те, кто клонирует ваш репозиторий, также захватят требуемые сторонние пакеты.
Использование корзины для управления ./vendor
trash
- это минималистический инструмент для вендоров, который вы настраиваете с vendor.conf
файла vendor.conf
. Этот пример предназначен для trash
:
# package
github.com/rancher/trash
github.com/Sirupsen/logrus v0.10.0
github.com/urfave/cli v1.18.0
github.com/cloudfoundry-incubator/candiedyaml 99c3df8 https://github.com/imikushin/candiedyaml.git
github.com/stretchr/testify v1.1.3
github.com/davecgh/go-spew 5215b55
github.com/pmezard/go-difflib 792786c
golang.org/x/sys a408501
Первая строка без комментариев - это пакет, в котором мы управляем ./vendor (примечание: это может быть буквально любой пакет в вашем проекте, а не только корневой).
Прокомментированные строки начинаются с #
.
В каждой непустой строке и без комментария отображается одна зависимость. Необходимо указать только «корневой» пакет зависимости.
После имени пакета идет версия (фиксация, тег или ветка) и, возможно, URL-адрес репозитория пакета (по умолчанию он выводится из имени пакета).
Чтобы заполнить ваш каталог ./vendor, вам необходимо иметь файл vendor.conf
в текущем vendor.conf
и просто запустить:
$ trash
Trash будет клонировать имеющиеся библиотеки в ~/.trash-cache
(по умолчанию), проверять запрошенные версии, копировать файлы в ./vendor
и обрезать не импортированные пакеты и тестовые файлы . Этот последний шаг позволяет вашему ./vendor быть скудным и средним и помогает экономить место в репозитории проекта.
Примечание: с v0.2.5 мусор доступен для Linux и macOS и поддерживает только git для извлечения пакетов, поскольку git является самым популярным, но мы работаем над добавлением всех остальных, которые go get
поддержку.
Использовать golang / dep
golang / dep - это инструмент для управления зависимостями прототипа. Скоро станет официальным инструментом управления версиями. Текущее состояние Alpha .
использование
Получить инструмент через
$ go get -u github.com/golang/dep/...
Типичное использование нового репо может быть
$ dep init $ dep ensure -update
Чтобы обновить зависимость от новой версии, вы можете запустить
$ dep ensure github.com/pkg/errors@^0.8.0
Обратите внимание, что форматы файлов манифеста и блокировки теперь завершены . Они будут совместимы даже с изменением инструмента.
vendor.json с помощью инструмента Govendor
# It creates vendor folder and vendor.json inside it
govendor init
# Add dependencies in vendor.json
govendor fetch <dependency>
# Usage on new repository
# fetch depenencies in vendor.json
govendor sync
Пример vendor.json
{
"comment": "",
"ignore": "test",
"package": [
{
"checksumSHA1": "kBeNcaKk56FguvPSUCEaH6AxpRc=",
"path": "github.com/golang/protobuf/proto",
"revision": "2bba0603135d7d7f5cb73b2125beeda19c09f4ef",
"revisionTime": "2017-03-31T03:19:02Z"
},
{
"checksumSHA1": "1DRAxdlWzS4U0xKN/yQ/fdNN7f0=",
"path": "github.com/syndtr/goleveldb/leveldb/errors",
"revision": "8c81ea47d4c41a385645e133e15510fc6a2a74b4",
"revisionTime": "2017-04-09T01:48:31Z"
}
],
"rootPath": "github.com/sample"
}