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


выйдя из Node среда я использовал для установки конкретной версии поставщика lib в папку проекта (node_modules), сказав npm чтобы установить эту версию этой библиотеки из 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 64

9 ответов:

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

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

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

gopkg.in это служба, которая предоставляет оболочку (перенаправление), которая позволяет выражать версии как URL-адреса РЕПО, фактически не создавая РЕПО. например gopkg.in/yaml.v1 vs 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 узла или груза ржавчины.

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

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

$ brew install glide

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

$ glide init

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

$ glide get vcs/namespace/package

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

$ glide up

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

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

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

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

  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.in является хорошим вариантом для закрепления 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.замок

# 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

есть команды, которые помогут вам обновить/удалить / etc пакеты, пожалуйста, найдите дополнительную информацию о официальное РЕПО github на 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