Как импортировать определенную версию пакета с помощью go get?

выйдя из Node среда, которую я использовал для установки определенной версии lib поставщика в папку проекта (node_modules), сказав npm чтобы установить эту версию этого lib из package.json или даже прямо с консоли, например:

$ npm install express@4.0.0

затем я использовал для импорта этой версии этого пакета в моем проекте только с:

var express = require('express');

теперь я хочу сделать то же самое с go. Как я могу это сделать? Можно ли установить определенную версию посылку? Если да, то с помощью централизованного $GOPATH, как я могу импортировать одну версию вместо другой?

Я бы сделал что-то вроде этого:

$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2

но тогда, как я могу изменить ситуацию во время импорта?

9 ответов


вы можете установить версию offical dep

dep ensure --add github.com/gorilla/websocket@1.2.0

очень удивлена, что никто не упомянул gopkg.в.

gopkg.in-это служба, которая предоставляет оболочку (перенаправление), которая позволяет выражать версии как URL-адреса РЕПО, фактически не создавая РЕПО. например, gopkg.in / yaml.v1 против gopkg.in / yaml.v2, хотя они оба живут в https://github.com/go-yaml/yaml

Это не идеально, если автор не следует надлежащей практике управления версиями (путем увеличения номера версии при нарушении обратной совместимости), но он работает с ветвями и тегами.


можно использовать git checkout чтобы получить определенную версию и построить программу с помощью этой версии.

пример:

export GOPATH=~/
go get github.com/whateveruser/whateverrepo
cd ~/src/github.com/whateveruser/whateverrepo
git tag -l
# supose tag v0.0.2 is correct version
git checkout tags/v0.0.2
go run whateverpackage/main.go

скольжения это действительно элегантное управление пакетами для Go, особенно если вы пришли из npm узла или груза Rust.

он ведет себя близко к новой функции поставщика Godep в 1.6, но намного проще. Ваши зависимости и версии "заблокированы" внутри вашего каталога projectdir/vendor, не полагаясь на GOPATH.

установить с brew (OS X)

$ brew install glide

Init скольжения.файл yaml (сродни пакету.формат JSON.) Это также захватывает существующее импортированные пакеты в вашем проекте из GOPATH и скопируйте их в каталог поставщика / проекта.

$ glide init

получить новые пакеты

$ glide get vcs/namespace/package

обновление и блокировка версий пакетов. Это создает скольжение.заблокируйте файл в каталоге проекта, чтобы заблокировать версии.

$ glide up

я попробовал glide и с удовольствием использовал его для моего текущего проекта.


go get является менеджером пакетов Go. Он работает полностью децентрализованным образом и как обнаружение пакетов все еще возможно без центрального репозитория размещения пакетов.

помимо поиска и загрузки пакетов, другая большая роль менеджера пакетов-обработка нескольких версий одного и того же пакета. Go использует самый минимальный и прагматичный подход любого менеджера пакетов. Нет такой вещи, как несколько версий Go пакет.

go get всегда тянет из головы ветки по умолчанию в репозитории. Всегда. Это имеет два важных следствия:--3-->

  1. Как автор пакета, вы должны придерживаться философии стабильной головы. Ветвь по умолчанию всегда должна быть стабильной, выпущенной версией пакета. Вы должны работать в ветвях функций и объединяться только тогда, когда готовы к выпуску.

  2. новые основные версии вашего пакета должно иметь собственный репозиторий. Проще говоря, каждая основная версия вашего пакета (после семантического управления версиями) будет иметь свой собственный репозиторий и, следовательно, свой собственный путь импорта.

    например github.com/jpoehls/gophermail-v1 и github.com/jpoehls/gophermail-v2.

Как кто-то строит приложение в Go, вышеуказанная философия действительно не имеет обратной стороны. Каждый путь импорта-это стабильный API. Нет номеров версий, о которых стоит беспокоиться. Потрясающе!

для больше деталей:http://zduck.com/2014/go-and-package-versioning/


от Go 1.5 есть "эксперимента поставщика" это помогает вам управлять зависимостями. С Go 1.6 это больше не эксперимент. Там же некоторые другие параметры на Go wiki..

Edit: как указано в ответ gopkg.в является хорошим вариантом для закрепления GitHub-depdencies pre-1.5.


dep является официальным экспериментом по управлению зависимостями для языка Go. Для компиляции требуется Go 1.8 или новее.

начать управление зависимостями с помощью dep выполните следующую команду из корневого каталога Вашего проекта:

dep init

после выполнения будут сгенерированы два файла:Gopkg.toml ("манифест"), Gopkg.lock и необходимые пакеты будут загружены на .

давайте предположим, что у вас есть проект, который использует . dep генерирует следующие файлы:

Gopkg.томл

# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
#   name = "github.com/user/project"
#   version = "1.0.0"
#
# [[constraint]]
#   name = "github.com/user/project2"
#   branch = "dev"
#   source = "github.com/myfork/project2"
#
# [[override]]
#  name = "github.com/x/y"
#  version = "2.4.0"


[[constraint]]
  name = "github.com/gorilla/websocket"
  version = "1.2.0"

Gopkg.lock

# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.


[[projects]]
  name = "github.com/gorilla/websocket"
  packages = ["."]
  revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b"
  version = "v1.2.0"

[solve-meta]
  analyzer-name = "dep"
  analyzer-version = 1
  inputs-digest = "941e8dbe52e16e8a7dff4068b7ba53ae69a5748b29fbf2bcb5df3a063ac52261"
  solver-name = "gps-cdcl"
  solver-version = 1

есть команды, которые помогут вам получить обновление/удаление/и т. д. пакеты, пожалуйста, найти более подробную информацию о официальный GitHub РЕПО of dep (инструмент управления зависимостями для Go).


подход я нашел выполнимая система подмодулей git. Пользуясь тем, что вы можете подмодуль в данной версии кода и повысить/понизить явным и записал - не случайность.

структура папок, которую я взял с этим:

+ myproject
++ src
+++ myproject
+++ github.com
++++ submoduled_project of some kind.

Go 1.11 будет иметь функцию go modules, и вы можете просто добавить зависимость с версией.

шаги

  1. go mod init .
  2. go mod edit -require github.com/wilk/uuid@0.0.1