Исправление версий инструментов, используемых go
Я ищу для создания воспроизводимых сборок с Go. Для индивидуальных проектов мы используем Glide.
Так, например, я использую:
glide get github.com/stretchr/testify
исправить версию пакета "testify". Это не работает для инструментов, однако. Например:
glide install github.com/tebeka/go2xunit
возвращает успех, но на самом деле не устанавливает go2xunit, поэтому я должен использовать:
go get github.com/tebeka/go2xunit
который устанавливает go2xunit в $ GOPATH / bin.
В Как я могу исправить версию таких инструментов, как go2xunit?
Я также отмечаю, что glide говорит, что вместо этого используйте dep, а dep говорит, что golang отошел от своей реализации и, вероятно, в конечном итоге будет использовать что-то на основе vgo. Существует множество инструментов управления зависимостями для go, может быть, один из менее известных поддерживает это?
В случае необходимости я использую go 1.7.4, как это предусмотрено Debian9.
1 ответ
Решением для go1.11 с использованием модулей go является создание пакета поддельных инструментов. Вы создаете файл tools.go следующим образом:
// +build tools
package tools
import (
_ "github.com/tebeka/go2xunit"
)
+ build tools - это волшебный комментарий, который предотвращает сборку пакета.
>go mod init tools
Создаст файл go.mod для пакета поддельных инструментов
>go install github.com/tebeka/go2xunit
Установит go2xunit и обновит go.mod следующим образом.
module tools
require github.com/tebeka/go2xunit v1.4.8 // indirect
Теперь, если вы запустите go, установите github.com/tebeka/go2xunit в будущем (скажем, для чистой сборки), его версия будет исправлена до версии 1.4 с помощью go.mod
Для версий go до 1.11 используемым инструментом является retool. Это работает так:
самонастройки:
go get github.com/twitchtv/retool
добавить инструмент:
retool add github.com/jteeuwen/go-bindata/go-bindata origin/master
использовать инструмент:
retool do go-bindata -pkg testdata -o ./testdata/testdata.go ./testdata/data.json
Добавление поддержки для этого может быть в дорожной карте для целевого перехода 1.12 ( https://github.com/golang/go/issues/27653)
Я сделал это очень похоже, но достаточно по-другому, так что, думаю, стоит поделиться еще раз:
Если вы получите ошибку
Я не видел зависимости, которую хотел добавить в go.mod, и получал эту ошибку:
tools/tools.go:6:5: import "github.com/UnnoTed/fileb0x" is a program, not an importable package
(fileb0x - это то, что я пытаюсь добавить)
Я не на 100% понимаю последовательность событий, которые его исправили, но я сделал все следующее:
Использование пакета "инструментов"
я сделал tools
каталог:
mkdir -p tools
Я помещаю в него пакет инструментов (как упоминалось выше):
// +build tools
package tools
import (
_ "github.com/UnnoTed/fileb0x"
)
Обратите внимание, что тег в основном не важен. Вы можете использовать foo:
// +build foo
Однако вы не можете использовать ignore
. Это специальный предопределенный тег.
// +build ignore
// NO NO NO NO NO
// `ignore` is a special keyword which (surprise) will cause
// the file to be ignore, even for dependencies
Обновление go.mod
Лучший способ, вероятно, бежатьgo mod tidy
:
go mod tidy
Однако, прежде чем я это сделал, я выполнил несколько команд, пытаясь выяснить, какая из них заставит его перейти в go.mod
:
go install github.com/UnnoTed/fileb0x # didn't seem to do the trick
go get
go generate ./...
go build ./...
go install ./...
go mod vendor
Позже я сделал git reset
а также rm -rf ~/go/pkg/mod; mkdir ~/go/pkg/mod
и обнаружил, что go mod tidy
сделал достаточно хорошо сам по себе.
торговля
Чтобы реально использовать кеш модулей в проекте, вам необходимо скопировать исходный код.
go mod vendor
Это захватит все зависимости из go.mod
Вам также необходимо изменить почти все ваши команды go, чтобы использовать -mod=vendor
в любой Makefile
с, Dockerfile
s или другие скрипты.
go fmt -mod=vendor ./... # has a bug which should be fixed in go1.15
go generate -mod=vendor ./...
go build -mod=vendor ./...
Это включает go build
, go get
, go install
, и любые go run
вызванный go generate
(и даже go generate
сам)
//go:generate go run -mod=vendor github.com/UnnoTed/fileb0x b0x.toml
package main
// ...