Я смог выполнить вендорную сборку инструментов для protoc (и плагинов типа Twirp ), следуя рекомендациям Go Modules для инструментов , плюс небольшой Makefile-Fu для protoc бинарный.
Полный рабочий пример можно найти в Aspiration Labs pyggpot repo .Ниже приведены основные детали.Стоит отметить: правильное определение пути импорта для некоторых инструментов было очень сложным, но в конечном итоге успешным.
Для самого protoc
я продаю двоичный выпуск в Makefile и устанавливаю его в tools/bin
dir:
TOOLS_DIR := ./tools
TOOLS_BIN := $(TOOLS_DIR)/bin
# protoc
PROTOC_VERSION := 3.7.1
PROTOC_PLATFORM := osx-x86_64
PROTOC_RELEASES_PATH := https://github.com/protocolbuffers/protobuf/releases/download
PROTOC_ZIP := protoc-$(PROTOC_VERSION)-$(PROTOC_PLATFORM).zip
PROTOC_DOWNLOAD := $(PROTOC_RELEASES_PATH)/v$(PROTOC_VERSION)/$(PROTOC_ZIP)
PROTOC := $(TOOLS_BIN)/protoc
# protoc
$(PROTOC): $(TOOLS_DIR)/$(PROTOC_ZIP)
unzip -o -d "$(TOOLS_DIR)" $< && touch $@ # avoid Prerequisite is newer than target `tools/bin/protoc'.
$(TOOLS_DIR)/$(PROTOC_ZIP):
curl --location $(PROTOC_DOWNLOAD) --output $@
Строка PROTOC_PLATFORM
может быть автоматизирована с помощью чего-то вроде OS, обнаруживающего make-файл .Версия, которую мы используем в https://github.com/aspiration-labs/pyggpot/blob/master/build/makefiles/osvars.mk.
On для сборки инструментов go.Создайте tools.go
что-то вроде
// +build tools
package tools
import (
// protocol buffer compiler plugins
_ "github.com/golang/protobuf/protoc-gen-go"
_ "github.com/twitchtv/twirp/protoc-gen-twirp"
_ "github.com/twitchtv/twirp/protoc-gen-twirp_python"
_ "github.com/thechriswalker/protoc-gen-twirp_js"
)
Примечание: тег // +build tools
сохранит go build
от импорта дополнительных инструментов в вашей окончательной сборке.
Наконец, некоторые создают коддля создания инструментов go:
# go installed tools.go
GO_TOOLS := github.com/golang/protobuf/protoc-gen-go \
github.com/twitchtv/twirp/protoc-gen-twirp \
github.com/twitchtv/twirp/protoc-gen-twirp_python \
github.com/thechriswalker/protoc-gen-twirp_js \
# tools
GO_TOOLS_BIN := $(addprefix $(TOOLS_BIN), $(notdir $(GO_TOOLS)))
GO_TOOLS_VENDOR := $(addprefix vendor/, $(GO_TOOLS))
setup_tools: $(GO_TOOLS_BIN)
$(GO_TOOLS_BIN): $(GO_TOOLS_VENDOR)
GOBIN="$(PWD)/$(TOOLS_BIN)" go install -mod=vendor $(GO_TOOLS)
И, наконец, цель make setup
для запуска go mod vendor
и обработки указанных выше целей.
setup: setup_vendor $(TOOLS_DIR) $(PROTOC) setup_tools
# vendor
setup_vendor:
go mod vendor
$(TOOLS_DIR):
mkdir -v -p $@