3 回答

TA貢獻1802條經驗 獲得超6個贊
轉到 1.16 及以上
Go 1.16(2021 年 2 月發(fā)布)包含一項更改,可以在不影響go.mod
.
問題 40276跟蹤該提案:
cmd/go:“go install”應該在模塊外部以模塊模式安裝可執(zhí)行文件
這已在CL 254365中實現(xiàn)。作為此更改的一部分,您可以運行例如:
go?install?golang.org/x/tools/cmd/goimports@latest
安裝二進制文件而不影響go.mod
.
要安裝特定版本,請?zhí)鎿Q@latest
為例如@v0.1.5
。

TA貢獻1798條經驗 獲得超3個贊
希望 Go 1.14 中會有一個新標志可以go get
完全滿足您的要求。這在問題#30515?“cmd/go:提供一致的全局安裝命令”中進行了跟蹤。
在此之前,您有幾個不同的選擇。
Go 1.12 和 1.13:更改目錄
go.mod
如果您使用的是 Go 1.12 或更高版本,最簡單的解決方案可能是在執(zhí)行 之前將當前模塊移出到一個目錄go get
,例如:
$ cd /tmp? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
$ go get github.com/foo/bar@v1.2.3
$ cd -? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # return to prior directory
圍棋 1.11、1.12、1.13+:哥賓
gobin是一個模塊感知命令,用于安裝或運行二進制文件,它提供了額外的靈活性,包括無需更改當前模塊的go.mod
.?
Go 1.11:臨時模塊
如果您使用帶模塊的 Go 1.11,第一步可能是升級到 Go 1.12 或 1.13,因為模塊有很多改進。如果您需要使用 Go 1.11 并且希望使用@version
語法而不更新當前模塊的go.mod
,那么一種方法是創(chuàng)建一個臨時模塊:
cd?$(mktemp?-d)?&&?go?mod?init?tempmod?&&?go?get?github.com/foo/bar@v1.2.3
@version
這是因為在 Go 1.11 中,除非在模塊中,否則無法使用該語法,而在 Go 1.12 中則放寬了這一點。這種方法已通過@rogpeppe的簡單 shell 腳本實現(xiàn)了自動化。
額外細節(jié)
一般來說,go
module-module 中的命令始終確定它“位于”哪個模塊,這基于調用該go
命令時的當前工作目錄。(您可以類比如何在make
沒有任何參數(shù)的情況下在當前工作目錄中查找 makefile,或者歷史上go build
沒有任何參數(shù)將如何構建當前工作目錄等)。
對于模塊,在當前工作目錄或其任何父目錄中go get
查找文件,并將使用任何中列出的約束作為解決版本的一部分,并根據(jù)需要更新.?這就是為什么如果您從現(xiàn)有模塊中運行,您的文件會被更新。go.mod
go get
go.mod
go.mod
go get
go.mod
go get
另一方面,從 Go 1.12 開始,如果您所在的目錄不屬于任何模塊(即該目錄沒有 ,其父目錄也沒有go.mod
),則無需go.mod
更新,但是該go
命令仍然能夠在模塊模式下運行并使用@version
語法。
來自Go 1.12 發(fā)行說明:
當 GO111MODULE 設置為 on 時,go 命令現(xiàn)在支持模塊目錄之外的模塊感知操作,前提是這些操作不需要解析相對于當前目錄的導入路徑或顯式編輯 go.mod 文件。go get、go list 和 go mod download 等命令的行為就像在具有初始為空要求的模塊中一樣。在此模式下, go env GOMOD 報告系統(tǒng)的空設備(/dev/null 或 NUL)。

TA貢獻1898條經驗 獲得超8個贊
每go help build
:
-mod 構建標志提供了對 go.mod 的更新和使用的額外控制。
如果使用 -mod=readonly 調用,則不允許 go 命令隱式自動更新 go.mod
- 3 回答
- 0 關注
- 317 瀏覽
添加回答
舉報