Перейти к основному
  1. Блог/

Как завендорить инструменты в Golang

·250 слов(а)·2 минут(ы)

В 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 для указания инструментов и этот трюк уйдет в прошлое.