Исправление версий инструментов, используемых 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с, Dockerfiles или другие скрипты.

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

// ...
Другие вопросы по тегам