Как импортировать определенную версию пакета с помощью 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 ответов:
вы можете установить версию по 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
- gopkg.in/yaml.v1 перенаправляет на https://github.com/go-yaml/yaml/tree/v1
- gopkg.in/yaml.v2 перенаправляет на https://github.com/go-yaml/yaml/tree/v2
Это не идеально, если автор не соблюдает правильную практику управления версиями (увеличивая номер версии при нарушении обратной совместимости), но он работает с ветвями и тегами.
можно использовать
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 всегда тянет из головы ветки по умолчанию в репозитории. Всегда. Это имеет два важных следствия:
Как автор пакета, вы должны придерживаться философии стабильной головы. Ваша ветвь по умолчанию всегда должна быть стабильной, выпущенной версией вашего пакета. Вы должны работать в ветвях функций и объединяться только тогда, когда готовы к выпуску.
новые основные версии вашего пакета должно есть свой собственный репозиторий. Проще говоря, каждая основная версия вашего пакета (после семантического управления версиями) будет иметь свой собственный репозиторий и, следовательно, свой собственный путь импорта.
например 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.