我正在尝试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)
原始的,已弃用的答案
这是我如何做到的。
在所需的分支/标签上签出存储库。例如
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.3go get foo@e3702bed2go get foo@latestgo get foo@branchgo.mod直接编辑。请注意,即使在请求特定提交(例如@e3702bed2)或分支上的最新提交(例如)时,您也不需要在任何这些示例中自行提出伪版本@master。
go.mod什么时候会在我的.如果您最终得到的版本解析为有效的semver标签,v例如v1.2.3或v1.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@latest,go 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的“如何升级和降级依赖项”部分中阅读有关上述所有内容的更多信息,该部分还包含指向官方文档的其他链接。
现在我进一步阅读了文档 ( 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工作。
表单的版本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,它将找到所有依赖项,添加缺少的依赖项并删除未使用的依赖项。
| 归档时间: |
|
| 查看次数: |
4663 次 |
| 最近记录: |