Как модули go работают с устанавливаемыми командами? - PullRequest
0 голосов
/ 20 сентября 2018

Я недавно начал с Go 1.11 и люблю модули.Помимо зависимостей во время выполнения, мне нужно работать с модулями go во время сборки, например, во время go generate.

Как установить конкретную зависимость сборки (например, github.com/aprice/embed/cmd/embed) изапустить этот конкретный инструмент из какой папки?go get правильный инструмент для этого?

Ответы [ 5 ]

0 голосов
/ 01 мая 2019

tools.go - отличное решение, если вы создаете приложение или сервис.Но если вы создаете библиотеку, tools.go все еще пропускает зависимости к вещам, потребляющим вашу библиотеку (ваши инструменты по-прежнему существуют как indirect зависимости, и go mod tidy извлечет их, поскольку она учитывает каждую возможную цель ).Это не конец света, так как эти модули никогда не оказываются в реальных встроенных двоичных файлах потребителя, но они все еще беспорядочные.

https://github.com/myitcv/gobin/issues/44, вероятно, является наиболее многообещающим подходом к исправлению этой долгосрочной перспективы., но в краткосрочной перспективе я использовал комбинацию подхода «внутреннего модуля», объясненного там вместе с https://github.com/izumin5210/gex.

Сначала я установил gex глобально:

GO111MODULE=off go get github.com/izumin5210/gex/cmd/gex

Затем перед фактическим использованием gex я создаю такую ​​структуру:

myproject/
\
  - go.mod: module github.com/ysamlan/myproject
  \
    internal/
    \
      tools/
       - go.mod: module github.com/ysamlan/myproject/tools

Чтобы установить инструмент только для сборки, я просто cd internal/tools и запускаю gex --add (sometool), что переводит этот инструмент в internal/tools/bin.Сценарии CI и другие люди, которые хотят создавать мои вещи локально, просто должны запустить cd internal/tools && gex --build, чтобы надежно и воспроизводимо заполнить двоичные файлы инструментов, но go.mod верхнего уровня не изменилась.

Ключевой элемент тамсоздание этого internal/tools/go.mod файла с отличным от пути к модулю, чем тот, который используется корневым проектом, и затем запуск только gex из этого каталога.

0 голосов
/ 05 января 2019

https://github.com/golang/go/issues/25922 оказался полезным для меня, особенно

при использовании зависимостей только для сборки с модулями, главное - выбор версии (не устанавливая их!)

Чтобы избежать установки, вы можете изменить директиву // go: generate на что-то вроде:

//go:generate go run golang.org/x/tools/cmd/stringer ARGS

Также есть репозиторий с лучшими практиками: https://github.com/go-modules-by-example/index/blob/master/010_tools/README.md

0 голосов
/ 20 сентября 2018

Соглашение заключается в добавлении файла с именем "tools.go", который защищен ограничением сборки и импортирует все необходимые инструменты:

// +build tools

package tools

import (
    _ "github.com/aprice/embed/cmd/embed"
)

https://github.com/golang/go/issues/25922#issuecomment-412992431

Инструментызатем устанавливается как обычно в один из

  • $ GOBIN
  • $ GOPATH / bin
  • $ HOME / go / bin

Youможет также захотеть следовать https://github.com/golang/go/issues/27653,, в котором обсуждается будущая явная поддержка инструментов.

0 голосов
/ 03 января 2019

Если вы получаете сообщение об ошибке

Я не вижу зависимости, которую я хотел добавить в go.mod, и получаю эту ошибку:

tools/tools.go:6:5: import "github.com/UnnoTed/fileb0x" is a program, not an importable package

(fileb0x - вещьЯ пытаюсь добавить)

Я не на 100% уверен в последовательности событий, которые это исправили, но я сделал все эти вещи:

Использование пакета "tools"

Я создал каталог 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 сам по себе достаточно хорош.

vendoring

Для того, чтобы на самом деле воспользоваться кешем модулей в проекте, вам необходимо скопировать исходный код

go mod vendor

Это захватит все зависимости от go.mod

Вам также нужно изменить почти все ваши команды go, чтобы использовать -mod=vendor в любых Makefile s, Dockerfile s или другихсценарии.

go fmt -mod=vendor ./...
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

// ...
0 голосов
/ 20 сентября 2018

Да, go get github.com/aprice/embed следует

  • загрузить исходные файлы
  • собрать двоичные файлы
  • установить их в $GOPATH/bin (что должно быть на вашем PATH, верно?)

см. go help get для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...