Управление зависимостями проекта Golang
golang официально предоставляет инструменты управления пакетамиgo get, который помещает загруженные сторонние пакеты в каталог src GOPATH. Проекты обычно состоят из множества пакетов из разных источников, импортированных из GOPATH или стандартной библиотеки.
Для того, чтобы проект мог нормально использовать эти пакеты, нам может понадобиться сделать следующее:
- Скопируйте зависимый пакет в путь к исходному коду проекта и перепишите имя пакета отчета в коде.
- Скопируйте зависимые пакеты в путь исходного кода проекта и добавьте путь проекта в GOPATH.
- Записывается в файл журнала версия, и обновляет существующий пакет GOPATH этой версии.
Хотя между проектами будут различия, общее направление таково.
Vendor
Vendorчто это такое?
Go 1.5 выпустил новый метод обнаружения пакетов, который не требует никаких изменений в коде или компиляторе. Если проект содержит каталог с именем vendor, go будет искать в этом каталоге зависимые пакеты, которые будут найдены перед стандартной библиотекой.
Чтобы включить эту функцию в Go 1.5, вам нужно изменить переменную среды GO15VENDOREXPERIMENT=1, которая включена по умолчанию после версии 1.6.
например, импортировать эти пакеты
import (
"bytes"
"flag"
"io"
"io/ioutil"
"log"
"net/http"
"net/url"
"os"
"path"
"path/filepath"
"strings"
"sync"
"time"
"github.com/andybalholm/cascadia"
"github.com/tdewolff/parse/css"
"golang.org/x/net/html"
)
...
Заглянем в каталог поставщиков
$ tree
.
├── css_test.go
├── main.go
└── vendor
├── github.com
│ ├── andybalholm
│ │ └── cascadia
│ │ ├── LICENSE
│ │ ├── parser.go
│ │ ├── README.md
│ │ └── selector.go
│ └── tdewolff
│ ├── buffer
│ │ ├── buffer.go
│ │ ├── lexer.go
│ │ ├── LICENSE.md
│ │ ├── reader.go
│ │ ├── README.md
│ │ ├── shifter.go
│ │ └── writer.go
│ └── parse
│ ├── common.go
│ ├── css
│ │ ├── hash.go
│ │ ├── lex.go
│ │ ├── parse.go
│ │ ├── README.md
│ │ └── util.go
│ ├── LICENSE.md
│ ├── README.md
│ └── util.go
├── golang.org
│ └── x
│ └── net
│ └── html
│ ├── atom
│ │ ├── atom.go
│ │ ├── gen.go
│ │ └── table.go
│ ├── const.go
│ ├── doc.go
│ ├── doctype.go
│ ├── entity.go
│ ├── escape.go
│ ├── foreign.go
│ ├── node.go
│ ├── parse.go
│ ├── render.go
│ └── token.go
How to use the vendor folder
Есть много способов его использования, большинство из них - стороннее программное обеспечение, обычно используются godep, glide, официальный и только что запущенный dep. Раньше я использовал скольжение, и функция работает. Но сегодня мы в основном говорим об официальной депе.Нативная совместимость должна быть все лучше и лучше.В последнее время некоторые новые проекты тоже пытаются использовать деп.
Dep
dep is a prototype dependency management tool for Go. It requires Go 1.9 or newer to compile. dep is safe for production use.
Install
dep is the official experiment, but not yet the official tool.
Еще не добавлено в последней версии 1.1.10, вам все равно нужно установить его самостоятельно
go get -u github.com/golang/dep/cmd/dep
Purpose
Dep is a tool for managing dependencies for Go projects
Usage: "dep [command]"
Commands:
init Set up a new Go project, or migrate an existing one
status Report the status of the project's dependencies
ensure Ensure a dependency is safely vendored in the project
prune Pruning is now performed automatically by dep ensure.
version Show the dep version information
Examples:
dep init set up a new project
dep ensure install the project's dependencies
dep ensure -update update the locked versions of all dependencies
dep ensure -add github.com/pkg/errors add a dependency to the project
Use "dep help [command]" for more information about a command.
New project
Далее давайте рассмотрим конкретный метод использования в сочетании с проектом. Перед этим нам нужно установить корневой каталог для проекта, обычно используйте \$GOPATH/src
dep init
Выполнить под проектdep init
$ dep init
$ ls
Gopkg.toml Gopkg.lock vendor/
В dep init есть опция -gopath, которая предпочтительно импортирует необходимые пакеты из локального GOPATH, что может в определенной степени увеличить скорость.
Нашел 2 новых файла, Gopkg.lock, Gopkg.toml, как они связаны с вендором?
Gopkg.tomlЭто файл, который мы в основном редактируем, он содержит несколько типов правил для dep.
- Dependency rules:ограничения, переопределения указывают, от какой версии зависеть и где ее получить
- Package graph rules:требуется, игнорируется указать пакеты для импорта или исключения
- metadata:Определяемый пользователем ключ/значение, dep будет игнорировать эти конфигурации.
- prune:Укажите, какие файлы и каталоги не нужны, они будут автоматически удалены из каталога поставщика.
Dependency rules
Большинство объявлений правил в gopkg.toml исходят из[[constraint]]или[[override]]. Они задают одни и те же параметры, но dep интерпретирует их по-разному.
[[constraint]]
# Required: the root import path of the project being constrained.
name = "github.com/user/project"
# Recommended: the version constraint to enforce for the project.
# Note that only one of "branch", "version" or "revision" can be specified.
version = "1.0.0"
branch = "master"
revision = "abc123"
# Optional: an alternate location (URL or import path) for the project's source.
source = "https://github.com/myfork/package.git"
# Optional: metadata about the constraint or override that could be used by other independent systems
[metadata]
key1 = "value that convey data to other systems"
system1-data = "value that is used by a system"
system2-data = "value that is used by another system"
Здесь следует обратить особое внимание, может быть написано только одно из "ветвь", "версия" или "ревизия".
Package graph rules
dep проанализирует операторы импорта в коде и, наконец, сформирует график этих импортированных пакетов.требуется, игнорируетсяРешите, какие пакеты импортировать или удалить
Если проект зависит от пакета, но в отчете он не объявлен, вы можете использовать required
метаданные, обрезатьОбычно он используется меньше, и все чувствуют, что на него можно смотреть.официальное введение
dep ensure
dep ensure— это основная команда dep, она обеспечивает синхронизацию всего проекта.
dep создает файл Gopkg.toml на основе оператора отчета и синхронизирует Gopkg.lock с помощью обеспечения. И убедитесь, что содержимое в окончательном каталоге поставщика соответствует тому, что нам нужно.
Adding a new dependency
$ dep ensure -add github.com/sumaig/glog
В случае успеха он обновляет файл Gopkg.lock и каталог поставщика и выбирает наилучшую версию для записи в Gopkg.toml. Но вы также можете столкнуться со следующей ошибкой:
"github.com/sumaig/glog" is not imported by your project, and has been temporarily added to Gopkg.lock and vendor/.
If you run "dep ensure" again before actually importing it, it will disappear from Gopkg.lock and vendor/.
Это потому, что мы не объявили этот пакет в импорте
Updating dependencies
Обновить указанные зависимости пакета
dep ensure -update github.com/sumaig/glog
обновить все зависимости
dep ensure -update
В следующих двух случаях мы также должны запуститьdep ensureУбедитесь, что проекты синхронизированы
- Объявление добавления и вычитания пакетов в отчете
- Изменены любые правила Gopkg.toml
- Подсказка такая: Gopkg.toml и Gopkg.lock не синхронизированы.
Migrating to Dep
Большинство проектов выполняются напрямуюdep initМиграцию можно завершить, если раньше вы использовали glide, то dep автоматически прочитает зависимости проекта из glide.yml и glide.lock, что тоже очень удобно.