Управление зависимостями проекта Golang

Go

Управление зависимостями проекта 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, что тоже очень удобно.