Подтвердить что ты не робот

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

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

$ npm install [email protected]

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

var express = require('express');

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

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

$ go get github.com/wilk/[email protected]
$ go get github.com/wilk/[email protected]

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

4b9b3361

Ответ 1

Обновление 18-11-23: мод Go From 1.11 - официальный эксперимент. Пожалуйста, смотрите @krish ответ.
Обновление 19-01-01: мод Go 1.12 по-прежнему является официальным экспериментом. Начиная с Go 1.13, режим модуля будет использоваться по умолчанию для всех разработок.
Обновление 19-10-17: мод Go 1.13 - официальный менеджер пакетов.
https://blog.golang.org/using-go-modules

  Старый ответ:

Вы можете установить версию с помощью официального dep

dep ensure --add github.com/gorilla/[email protected]

Ответ 2

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

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

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

Ответ 3

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

шаги

  1. go mod init .
  2. go mod edit -require github.com/wilk/[email protected]
  3. иди возьми -v -т./...
  4. иди строить
  5. иди установи

Здесь больше информации по этой теме:https://github.com/golang/go/wiki/Modules

Ответ 4

Вы можете использовать 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

Ответ 5

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

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

Установить с помощью brew (OS X)

$ brew install glide

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

$ glide init

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

$ glide get vcs/namespace/package

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

$ glide up

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

Ответ 6

От Go 1.5 там эксперимент поставщика, который помогает вам управлять зависимостями. Начиная с Go 1.6, это уже не эксперимент. Theres также некоторые другие параметры в вики Go..

Изменить: как упоминалось в этом ответе gopkg.in является хорошим вариант для закрепления github-depdencies до 1.5.

Ответ 7

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

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

dep init

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

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

Gopkg.toml

# 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

Есть команды, которые помогут вам обновить/удалить пакеты /etc, пожалуйста, найдите больше информации об официальном репозитории github для dep (инструмент управления зависимостями для Go).

Ответ 8

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

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

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

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

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

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

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

Для получения более подробной информации: http://zduck.com/2014/go-and-package-versioning/

Ответ 9

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

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

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

Ответ 10

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

go get github.com/someone/[email protected]
go get github.com/someone/[email protected]
go get github.com/someone/[email protected]_hash

подробнее здесь - Как указать зависимость модуля Go в go.mod на последний коммит в репо?

Go get также установит бинарный файл, как сказано в документации -

Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.

(из https://golang.org/cmd/go/)

Ответ 11

Существует команда go edit -replace для добавления определенного коммита (даже из другого разветвленного репозитория) поверх текущей версии пакета. Что здорово в этой опции, так это то, что вам не нужно заранее знать точную псевдо версию, просто идентификатор хеша коммитов.

Например, я использую стабильную версию пакета "github.com/onsi/ginkgo v1.8.0".

Теперь я хочу - без изменения этой строки необходимого пакета в go.mod - добавить патч из моей ветки поверх версии ginkgo:

$ GO111MODULE="on"  go mod edit -replace=github.com/onsi/ginkgo=github.com/manosnoam/[email protected]

После того, как вы в первый раз соберете или протестируете свой модуль, GO попытается получить новую версию, а затем сгенерирует строку "заменить" правильной псевдо версией. Например, в моем случае это добавит внизу go.mod:

replace github.com/onsi/ginkgo => github.com/manosnoam/ginkgo v0.0.0-20190902135631-1995eead7451

Ответ 12

Это сработало для меня

GO111MODULE=on go get -u github.com/segmentio/[email protected]