转到模块:找出所需包的版本

Pat*_*her 7 go go-modules

我正在尝试Go模块.我的项目需要libarary golang.org/x/net/html,所以我定义了这个go.mod文件:

module github.com/patrickbucher/prettyprint

require golang.org/x/net/html
Run Code Online (Sandbox Code Playgroud)

并编写了这个演示程序来检查编译时是否加载了依赖项:

package main

import (
        "fmt"
        "log"
        "os"

        "golang.org/x/net/html"
)

func main() {
        doc, err := html.Parse(os.Stdin)
        if err != nil {
                log.Fatal(err)
        }
        fmt.Println(doc)
}
Run Code Online (Sandbox Code Playgroud)

当我运行go build时,我收到以下错误消息:

go: errors parsing go.mod:
~/prettyprint/go.mod:3: usage: require module/path v1.2.3
Run Code Online (Sandbox Code Playgroud)

显然,我错过了版本号.但是哪一个拿?我偶然发现了一篇名为Takig Go Modules for Spin的文章,在那里我找到了一个go.mod包含对golang.org/x包的引用的文件示例:

module github.com/davecheney/httpstat

require (
        github.com/fatih/color v1.5.0
        github.com/mattn/go-colorable v0.0.9
        github.com/mattn/go-isatty v0.0.3
        golang.org/x/net v0.0.0-20170922011244-0744d001aa84
        golang.org/x/sys v0.0.0-20170922123423-429f518978ab
        golang.org/x/text v0.0.0-20170915090833-1cbadb444a80
)
Run Code Online (Sandbox Code Playgroud)

作者正在使用版本字符串v0.0.0-20170922011244-0744d001aa84,包括semver indication v0.0.0,时间戳和看起来像git提交ID的东西.

我如何找出那些版本字符串?我猜想那些golang.org/x包裹将按照在某一时刻语义版本进行版本控制,但要真正尝试go mod,我需要找出那些现在.

nic*_*bot 31

更新

这个命令是将replace命令添加到go.mod而不是使用git我最初发布的手动执行的更好的解决方案:

go mod edit -replace github.com/docker/docker=github.com/docker/engine@ea84732a7725
Run Code Online (Sandbox Code Playgroud)

产生类似的结果,但它不是使用伪版本,而是找到标记的引擎版本。

replace github.com/docker/docker => github.com/docker/engine v17.12.0-ce-rc1.0.20191113042239-ea84732a7725+incompatible
Run Code Online (Sandbox Code Playgroud)

或者,包括一个带标签的 docker 版本。

go mod edit -replace github.com/docker/docker@v1.13.1=github.com/docker/engine@ea84732a7725
Run Code Online (Sandbox Code Playgroud)

为了

replace github.com/docker/docker v1.13.1 => github.com/docker/engine v17.12.0-ce-rc1.0.20191113042239-ea84732a7725+incompatible
Run Code Online (Sandbox Code Playgroud)

感谢媒体上的@Shivam010


原始的,已弃用的答案

这是我如何做到的。

在所需的分支/标签上签出存储库。例如

git clone -b v19.03.5 git@github.com:docker/engine.git
Run Code Online (Sandbox Code Playgroud)

然后

cd engine
TZ=UTC git --no-pager show \
  --quiet \
  --abbrev=12 \
  --date='format-local:%Y%m%d%H%M%S' \
  --format="%cd-%h"
Run Code Online (Sandbox Code Playgroud)

我得到

20191113042239-ea84732a7725
Run Code Online (Sandbox Code Playgroud)

用于go.mod作为

replace github.com/docker/docker v1.13.1 => github.com/docker/engine v0.0.0-20191113042239-ea84732a7725
Run Code Online (Sandbox Code Playgroud)


typ*_*182 10

作者使用的是像 v0.0.0-20170922011244-0744d001aa84 这样的版本字符串,由 semver 指示 v0.0.0、时间戳和看起来像 git commit ID 的东西组成。

我如何找出这些版本字符串?

您永远不需要手动找出那些称为伪版本的复杂版本字符串。

日常工作流程

您典型的日常工作流程可以是:

  • .go根据需要将 import 语句添加到您的代码中。
  • 标准命令,如go build, go test, orgo mod tidy将根据需要自动添加新的依赖项以满足导入(更新go.mod和下载新的依赖项)。默认情况下,@latest将使用新的直接依赖项的版本。
  • 需要时,可以使用以下命令选择更具体的依赖项版本:
    • go get foo@v1.2.3
    • go get foo@e3702bed2
    • go get foo@latest
    • go get foo@branch
    • go.mod直接编辑。

请注意,即使在请求特定提交(例如@e3702bed2)或分支上的最新提交(例如)时,您也不需要在任何这些示例中自行提出伪版本@master

go.mod什么时候会在我的.

如果您最终得到的版本解析为有效的semver标签,v例如v1.2.3v1.2.4-beta-1,那么该 semver 标签将记录在您的go.mod文件中。如果版本不具有有效的semver标签,那么它将被改为以记录为一个伪版本在你的go.mod文件,比如v0.0.0-20171006230638-a6e239ea1c69,其中包括一个版本部分,提交时间戳,并提交哈希值。

在您的特定情况下,golang.org/x/net/html没有任何 semver 标签,这意味着如果您在首先包含在您的文件中之后这样做go get golang.org/x/net/html@latestgo get golang.org/x/net/html@0744d001aa84或只是这样做,那么 golang.org/x/net/html 将作为伪版本记录在您的文件中,但请注意,您不需要自己找出复杂的字符串(因为该命令会在需要时将诸如模块查询转换为相应的伪版本,并将结果记录在您的 中)。go buildimport "golang.org/x/net/html".gogo.modgogo get golang.org/x/net/html@0744d001aa84go.mod

为什么选择伪版本格式?

伪版本格式有助于提供基于标准semver排序的所有版本的简单总排序,这使得更容易推断哪些提交将被视为“晚于”另一个提交,或者实际 semver 标签是否被视为“晚”而不是单独的提交。

控制依赖版本

您可以在 Go Modules wiki的“如何升级和降级依赖项”部分中阅读有关上述所有内容的更多信息,该部分还包含指向官方文档的其他链接。


Pat*_*her 5

现在我进一步阅读了文档 ( go help modules) 并偶然发现go mod tidy

“go mod tidy”命令构建该视图,然后添加任何缺少的模块要求并删除不必要的模块要求。

因此,当我放弃要求golang.org/x/net/html并将我的文件修剪go.mod为:

module github.com/patrickbucher/prettyprint
Run Code Online (Sandbox Code Playgroud)

然后运行,然后根据我的源代码中的导入路径go mod tidy正确计算出版本号的要求,从而变为:go.mod

module github.com/patrickbucher/prettyprint

require golang.org/x/net v0.0.0-20180906233101-161cd47e91fd
Run Code Online (Sandbox Code Playgroud)

现在两者都go list可以go build工作。


nij*_*ijm 5

表单的版本v0.0.0-20180906233101-161cd47e91fd意味着git存储库中没有标记的版本。因此,go mod根据最新的提交时间和提交哈希的前缀生成一个。

要获取正确的go.mod文件,请使用以下命令开始(假设转到1.11):

go mod init yourmodulename
Run Code Online (Sandbox Code Playgroud)

或创建一个空的go.mod文件,其中仅包含以下内容:

module yourmodulename
Run Code Online (Sandbox Code Playgroud)

然后运行go mod tidy,它将找到所有依赖项,添加缺少的依赖项并删除未使用的依赖项。