исходящий из Node
среды, которую я использовал для установки определенной версии библиотеки поставщика в папку проекта ( 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
Но тогда как я могу изменить ситуацию во время импорта?
go get
это неподходящий инструмент, если вы хотите такого поведения. Вы можете найти решения вашей конкретной проблемы в Google.Ответы:
Go 1.11 будет иметь функцию, называемую модулями go, и вы можете просто добавить зависимость с версией. Следуй этим шагам:
Дополнительная информация по этой теме - https://github.com/golang/go/wiki/Modules
источник
go get github.com/wilk/uuid@0.0.1
(сGO111MODULE=on
)go get
, а не в томgo mod
.Действительно удивлен, что никто не упомянул gopkg.in .
gopkg.in
- это служба, которая предоставляет оболочку (перенаправление), которая позволяет выражать версии в виде URL-адресов репо без фактического создания репозиториев. Напримерgopkg.in/yaml.v1
противgopkg.in/yaml.v2
, хотя они оба живут вhttps://github.com/go-yaml/yaml
Это не идеально, если автор не следует надлежащим методам управления версиями (путем увеличения номера версии при нарушении обратной совместимости), но он работает с ветвями и тегами.
источник
Вы можете использовать его,
git checkout
чтобы получить определенную версию и построить свою программу, используя эту версию.Пример:
источник
Glide - это действительно элегантное средство управления пакетами для Go, особенно если вы работаете с Node npm или Rust.
Он похож на новую функцию поставщика Godep в версии 1.6, но намного проще. Ваши зависимости и версии «заблокированы» внутри каталога projectdir / vendor без использования GOPATH.
Установить с помощью brew (OS X)
Запустите файл glide.yaml (аналог package.json). Это также захватывает существующие импортированные пакеты в вашем проекте из GOPATH и копирует их в каталог vendor / проекта.
Получите новые пакеты
Обновите и заблокируйте версии пакетов. Это создает файл glide.lock в каталоге вашего проекта для блокировки версий.
Я пробовал скольжение и с радостью использую его в своем текущем проекте.
источник
Обновление 18-11-23 : мод Go 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
Старый ответ:
Вы можете установить версию по официальному депо
источник
go get
, а не в томdep
.Начиная с Go 1.5 есть «эксперимент с поставщиками», который помогает управлять зависимостями. Начиная с версии Go 1.6 это больше не эксперимент. Есть также некоторые другие варианты в вики Go..
Изменить: как упоминалось в этом ответе, gopkg.in - хороший вариант для закрепления github-depdencies до 1.5.
источник
dep
это официальный эксперимент по управлению зависимостями для языка Go. Для компиляции требуется Go 1.8 или новее.Чтобы начать управление зависимостями с помощью
dep
, выполните следующую команду из корневого каталога вашего проекта:После выполнения будут сгенерированы два файла:
Gopkg.toml
(«манифест»),Gopkg.lock
и необходимые пакеты будут загружены вvendor
каталог.Предположим, у вас есть проект, использующий
github.com/gorilla/websocket
package.dep
сгенерирует следующие файлы:Gopkg.toml
Gopkg.lock
Есть команды , которые помогут вам обновление / удаление / и т.д. пакетов, пожалуйста , найти более подробную информацию об официальном GitHub репо из
dep
(инструмент управления зависимостями для Go).источник
В настоящее время это можно просто использовать
go get
. Вы можете получить свою зависимость по тегу версии, ветке или даже фиксации.подробнее здесь - Как указать зависимость модуля 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/ )
источник
go get - это менеджер пакетов Go. Он работает полностью децентрализованно, и обнаружение пакетов по-прежнему возможно без центрального хранилища пакетов.
Помимо поиска и загрузки пакетов, другая важная роль диспетчера пакетов - это обработка нескольких версий одного и того же пакета. Go использует самый минималистичный и прагматичный подход из всех менеджеров пакетов. Не существует нескольких версий пакета Go.
go get всегда извлекает из HEAD ветки по умолчанию в репозитории. Всегда. Это имеет два важных следствия:
Как автор пакета вы должны придерживаться философии стабильной HEAD. Ваша ветка по умолчанию всегда должна быть стабильной выпущенной версией вашего пакета. Вы должны работать в функциональных ветках и объединяться только тогда, когда будете готовы к выпуску.
Новые основные версии вашего пакета должны иметь собственный репозиторий. Проще говоря, каждая основная версия вашего пакета (после семантического управления версиями) будет иметь свой собственный репозиторий и, следовательно, свой собственный путь импорта.
например, github.com/jpoehls/gophermail-v1 и github.com/jpoehls/gophermail-v2.
Если вы создаете приложение на Go, у вышеупомянутой философии действительно нет недостатков. Каждый путь импорта - это стабильный API. Нет никаких номеров версий, о которых стоит беспокоиться. Потрясающие!
Для получения дополнительной информации: http://zduck.com/2014/go-and-package-versioning/
источник
go get
кэширование означает, что вы какое-то время не замечаете этого, если только у вас нет сервера сборки, который каждый раз обновляет вас до последней версии. Есть сторонние менеджеры пакетов, но в основном они грубые.Подход, который я нашел работоспособным, - это система подмодулей git . Используя это, вы можете создать подмодуль в данной версии кода, и обновление / понижение версии будет явным и записанным - никогда не случайным.
Структура папок, которую я взял с собой, следующая:
источник
go get
)Это сработало для меня
GO111MODULE=on go get -u github.com/segmentio/aws-okta@v0.22.1
источник
Есть команда go edit -replace, чтобы добавить конкретный коммит (даже из другого разветвленного репозитория) поверх текущей версии пакета. Что круто в этой опции, так это то, что вам не нужно заранее знать точную псевдо-версию , только хэш-идентификатор фиксации .
Например, я использую стабильную версию пакета «github.com/onsi/ginkgo v1.8.0».
Теперь я хочу - не изменяя эту строку необходимого пакета в go.mod - добавить патч из моей вилки поверх версии ginkgo:
После первой сборки или тестирования модуля GO попытается загрузить новую версию, а затем сгенерирует строку «заменить» с правильной псевдо-версией. Например, в моем случае он добавит внизу go.mod:
источник
Маленькая шпаргалка по модульным запросам.
Чтобы проверить все существующие версии: например
go list -m -versions github.com/gorilla/mux
Например
go get github.com/gorilla/mux@v1.7.4
источник