- Блог/
Как завендорить инструменты в Golang
В Golang используются два подхода работы c зависимостями проекта:
использовать зависимости из общего кеша модулей или из папки vendor проекта.
В первом варианте полагаемся на то, что зависимости будут доступны по сети.
Во втором варианте нужные для сборки проекта зависимости помещены внутрь проекта.
В случае библиотек сначала обновляется список используемых зависимостей в go.mod, а затем из этих зависимостей формируется папка vendor.
Для этого выполните:
go mod tidy
go mod vendor
После выполнения этих двух команд в папке vendor будут скопированы все используемые библиотеки, а команды go ... будут искать зависимости в этой папке.
Причем вендорится только используемая часть кода.
Если в проекте используется vendor, естественными образом возникает желание подобным образом хранить еще и инструменты.
Например, goimports для форматирования импортов.
Этот процесс каверзный.
Для этого создаем файл tools.go. Можно в корне проекта, можно отдельным пакетом.
//go:build tools
// +build tools
package tools
import (
_ golang.org/x/tools/cmd/goimports
)
Начало файла - это build constraint для сборки tools, по умолчанию этот файл не попадет в сборку.
go mod tidy будет работать с любым именем кроме ignore.
Имя пакета либо main, либо по имени директории.
Далее в секции import указываем пути к нужным инструментам.
Важно указать путь к main пакету инструмента, иначе в vendor будет не весь код.
При этом IDE буден сообщать об ошибке импорта пакета main - это ожидаемое.
Далее процесс аналогичен вендорингу библиотек:
go mod tidy
go mod vendor
В конце приятная новость.
В Golang 1.24 в go.mod появится специальная директива tools для указания инструментов и этот трюк уйдет в прошлое.