Как Go обновляет сторонние пакеты?

190

Смотря насколько активно растут и улучшаются пакеты golang, интересно, как решается проблема с версиями пакетов?

Я вижу, что один из способов - хранить сторонние пакеты в папке проекта.

Но что, если я установлю его с go get?

Шалахин
источник

Ответы:

311

go getустановит пакет в первый каталог, указанный в GOPATH(переменная среды, которая может содержать разделенный двоеточиями список каталогов). Вы можете использовать go get -uдля обновления существующих пакетов.

Вы также можете использовать go get -u allдля обновления всех пакетов в вашемGOPATH

Для более крупных проектов может быть целесообразно создать разные GOPATH для каждого проекта, чтобы обновление библиотеки в проекте A не вызывало проблем в проекте B.

Введите, go help gopathчтобы узнать больше о GOPATHпеременной среды.

tux21b
источник
2
Можно ли обновить все пакеты до последней версии, вроде обновления пакета?
Хуробин
73
просто go get -u all извините за воскресение, но на всякий случай кто-то еще искал.
Дэн Андерсон
go get -u allбольше не работает! Выполнение этой команды в GOPATH, по крайней мере для Go 1.13, выдаст предупреждение: «warning» all «matched no package»
Contrapak
Работает с Go 1.12.9
fviktor
61

Ответ @tux хорош, просто хотел добавить, что вы можете использовать go get для обновления определенного пакета:

go get -u full_package_name
Сальвадор Дали
источник
18

Поскольку в этом вопросе упоминаются сторонние библиотеки, а не все пакеты, вы, вероятно, захотите использовать групповые символы.

Вариант использования: я просто хочу обновить все свои пакеты, полученные из Github VCS, тогда вы просто скажете:

go get -u github.com/... // ('...' being the wildcard). 

Это приведет к обновлению только ваших пакетов github в текущем $GOPATH

То же самое относится и к VCS, скажем, вы хотите обновить только все пакеты из репозитория ogranizaiton A, поскольку они выпустили исправление, от которого вы зависите:

go get -u github.com/orgA/...
DTX
источник
11

Вышеуказанные ответы имеют следующие проблемы:

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

Чтобы избежать этого, сделайте следующее:

  1. Удалите сторонние папки, которые вы хотите обновить.
  2. перейдите в папку приложения и запустите go get -d
Aus
источник
2

перейти 1.13

(exec из корневого каталога модуля)

Обновить указанные зависимости:

go get -u <package-name>

Обновите все прямые и косвенные зависимости до последних незначительных или исправлений (предварительные выпуски игнорируются):

go get -u ./...
# or
go get -u=patch ./...

Ссылка:

https://github.com/golang/go/wiki/Modules#daily-workflow

go help get

F566
источник
-2

Перейти к пути и введите

go get -u ./..

Это обновит все требуемые пакеты.

kiki_ygn
источник
Это буквальное толкование не работает. Еще немного контекста будет полезно.
Contrapak
2
Я верю, что он имел в виду go get -u ./...(3 точки)
Брайан Лейшман