cmd/go: document how to get 'go mod tidy' to keep an unused dependency

vhmi4jdf  于 6个月前  发布在  Go
关注(0)|答案(9)|浏览(46)

你正在使用的Go版本是什么( go version )?

$ go version
go version go1.13.8 linux/amd64

这个问题在最新版本的发布中是否重现?

是的

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/user/.cache/go-build"
GOENV="/home/user/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/user/go"
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/home/user/.local/share/umake/go/go-lang"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/home/user/.local/share/umake/go/go-lang/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/tmp/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build847180785=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

鉴于最近的 golang.org/x/crypto 修复,我尝试强制让我的模块使用 v0.0.0-20200220183623-bac4c82f6975 :

// /tmp/go.mod
module tmp

go 1.13

require (
        golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 // indirect
        lib v0.0.0-00010101000000-000000000000
)

replace lib => ./lib

golang.org/x/crypto 被列在我的项目中,因为我依赖的一个模块使用了它:

// /tmp/go.sum
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
// /tmp/main.go
package main

import _ "lib"

func main() {}

假设我不控制 lib 模块:

// /tmp/lib/go.mod
module lib
  
go 1.13

require golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
// /tmp/lib/lib.go
package lib
// /tmp/lib/sub/sub.go
package sub

import _ "golang.org/x/crypto/acme"

然而,在构建过程中并不需要它,这可以从 go mod why 中看出。因此,当我执行 go mod tidy 时,它会被删除:

[user@localhost tmp]$ go mod why -m golang.org/x/crypto
# golang.org/x/crypto
(main module does not need module golang.org/x/crypto)
[user@localhost tmp]$ go mod tidy
[user@localhost tmp]$ cat go.mod

你期望看到什么?

// /tmp/go.mod
module test

go 1.13

require (
        golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 // indirect
        lib v0.0.0-00010101000000-000000000000
)

replace lib => ./lib

你看到了什么?

// /tmp/go.mod
module test

go 1.13

require lib v0.0.0-00010101000000-000000000000

replace lib => ./lib
4sup72z8

4sup72z81#

它不需要构建,这可以从 go mod why 的证据中看出。因此,当我执行 go mod tidy 时,它会被删除。
这正是 go mod tidy 文档中所描述的操作(https://tip.golang.org/cmd/go/#hdr-Add_missing_and_remove_unused_modules):
它会移除不提供任何相关包的未使用模块。
你能提供更多关于为什么想要升级一个不提供任何导入包的模块的详细信息吗?

xfyts7mz

xfyts7mz2#

这正是 go mod tidy 文档中所记录的操作(https://tip.golang.org/cmd/go/#hdr-Add_missing_and_remove_unused_modules):

这不仅仅是在 tip;感谢指正。

您能提供更多关于为什么想要升级一个没有提供任何导入包的模块的详细信息吗?

  1. 我有一些工具可以检测到 go.sumgo.mod 中正在使用的易受攻击的模块。它将我的 go.sum 标记为易受攻击,因为它看起来就像是实际用于构建的模块。
  • 由于 crypto 是一个传递依赖项,因此其他开发人员很容易在不意识到他们引入了易受攻击版本的情况下引入对 sub 的依赖关系。
  • 这在不同的模块中也具有技术上的真实性,但由于我们知道 lib 依赖于易受攻击的版本,我希望有一种方法来标记/升级它。
6yjfywim

6yjfywim3#

它标记了我的 go.sum ,因为它看起来与实际用于构建的模块相同。
啊,#33008 可能与之相关。对于不贡献导入包的模块,go.sum 文件仅应包含 go.mod 文件的校验和(而不是完整的源代码),但 go mod tidy 中的一个错误导致它在存在源代码的情况下也保留了源代码的校验和。

svgewumm

svgewumm4#

由于crypto是一个传递依赖,其他开发者很容易在不知情的情况下引入对sub的依赖,从而引入了易受攻击的版本。
确实如此,但我们应该提供一些方法来标记这些依赖项,无论它们是如何引入的(这是#24031)。

0wi1tuuw

0wi1tuuw5#

既然我们知道lib依赖于易受攻击的版本,我希望有一种方法来标记/升级它。请注意,如果你真的想要这样做,你可以引入某个包的虚拟导入,以便说服go mod tidy保留它。(参见http://golang.org/wiki/Modules#how-can-i-track-tool-dependencies-for-a-module.)

gzszwxb4

gzszwxb46#

既然我们已经为其他两个部分提出了问题,让我们将重点放在第三个:你有理由想要保留一个未使用的要求的文档,我们有一个机制来实现这一点(一个虚拟的导入),所以我们应该使这个机制的文档更容易被发现。

h5qlskok

h5qlskok7#

在此处有一个 hugo modulerequire 但未在任何 .go 文件中使用(因为我只是提取内容),这是一个有效的用例吗?我可以让它正常工作,但我必须忍受在 vscode 问题选项卡中的 "在此模块中未使用" 警告。

vbkedwbf

vbkedwbf8#

Hugo对模块的使用不受Go项目的支持——我们专注于使用go buildgo test等构建和运行Go二进制文件的用例。
(我们也没有积极地试图破坏它,但你需要与Hugo维护者讨论任何特定的Hugo问题。)

tgabmvqs

tgabmvqs9#

@bcmills 很好。谢谢:)

相关问题