亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用go模塊將retool替換為tools.go,用于多開發人員和CI環境

使用go模塊將retool替換為tools.go,用于多開發人員和CI環境

Go
翻閱古今 2023-06-26 16:25:51
我想用 go?moduletools.go “工具作為依賴項”替換retool。然而,當我的開發人員和 CI 環境都使用不同的操作系統時,我很難理解這是如何工作的。我想確保每個環境使用完全相同版本的工具。舉一個具體的例子,我的應用程序需要 protoc 編譯器通過 github.com/golang/protobuf/protoc-gen-go 生成 go 代碼。我有 3 個操作系統,都需要使用 protoc-gen-go 插件/生成器執行 protoc:Ryan:使用 MacOS喬:Linux(免費)CI:Linux(CentOS)我目前使用 retool 來確保所有環境都鎖定在同一版本的工具上(本例中為 protoc-gen-go):retool?do?build/bin/protoc?-Ibuild/protoc/include?-I.?rpc/platform/platform.proto?--go_out=.我的新 go 模塊/“工具作為依賴項”設置工具.go:// +build toolspackage toolsimport (? ? _ "github.com/golang/protobuf/protoc-gen-go")設置將使用的路徑go install:export?GOBIN=$PWD/bin安裝:go?install?github.com/golang/protobuf/protoc-gen-go如果 Ryan 運行,則會創建go install ..一個bin/protoc-gen-goMacOS 可執行文件。問題:此時,為什么protoc-gen-gogo.mod 中沒有列出工具版本(或 git hash)?當 Joe 克隆應用程序存儲庫時,他如何獲取并編譯 Ryan 使用的相同版本的 protoc-gen-go?如何protoc知道在我的目錄中使用protoc-gen-go可執行文件生成器./bin?
查看完整描述

2 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

我能夠按照Go Modules 工具指南以及用于protoc二進制文件的一點 Makefile-Fu完成 protoc 的供應商工具構建(以及Twirp等插件) 。

完整的工作示例可以在 Aspiration Labs pyggpot repo中找到。以下是基本細節。值得注意的是:為某些工具找到正確的導入路徑非常繁瑣,但最終還是成功的。

對于protoc其本身,我在 Makefile 中提供二進制版本并將其設置到目錄中tools/bin

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字符串可以通過諸如操作系統檢測 makefile之類的東西來自動化。

繼續構建 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 $@


查看完整回答
反對 回復 2023-06-26
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

Go 模塊可與 .go 文件的導入一起使用。如果他們找到導入,他們將自動下載滿足您要求的最新版本。

此時,為什么 go.mod 中沒有列出 protoc-gen-go 工具版本(或 git hash)?

這是因為就 Go 模塊而言,protoc-gen-go 只是一個外部工具。您不導入golang/protobuf/tree/master/protoc-gen-go而是導入它生成的代碼。

當 Joe 克隆應用程序存儲庫時,他如何獲取并編譯 Ryan 使用的相同版本的 protoc-gen-go?

使用:

GIT_TAG="v1.2.0" # change as needed

go get -d -u github.com/golang/protobuf/protoc-gen-go

git -C "$(go env GOPATH)"/src/github.com/golang/protobuf checkout $GIT_TAG

go install github.com/golang/protobuf/protoc-gen-go

在用戶的每臺計算機上安裝特定版本??赡軙帉懸粋€構建腳本來自動化該過程。


protoc 如何知道在我的 ./bin 目錄中使用 protoc-gen-go 可執行文件生成器?


來自 github 文檔:除非設置了 $GOBIN,否則編譯器插件 protoc-gen-go 將安裝在 $GOPATH/bin 中。它必須位于您的 $PATH 中,協議編譯器 protoc 才能找到它。


查看完整回答
反對 回復 2023-06-26
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號