【问题标题】:How to use a forked module, with versioned Go Modules (v1.11+, GO111MODULE=on)如何使用带有版本化 Go 模块的分叉模块(v1.11+,GO111MODULE=on)
【发布时间】:2019-11-02 09:33:06
【问题描述】:

forked 是一个 go 模块,并且想在我的项目中使用通过 v1.12 使用 versioned modules 的 fork。我的代码不在我的GOPATH 中。

我的项目go.mod

module github.com/me/myproj

go 1.12

require (   
    go.larrymyers.com/protoc-gen-twirp_typescript v0.0.0-20190605194555-ffbfe407b60f
)

replace go.larrymyers.com/protoc-gen-twirp_typescript => github.com/rynop/protoc-gen-twirp_typescript master

protoc-gen-twirp_typescript 是protoc 的工具,所以这里是我的tools.go

// +build tools

package tools

import (
    // protocol buffer compiler plugins
    _ "github.com/golang/protobuf/protoc-gen-go"
    _ "github.com/mwitkow/go-proto-validators/protoc-gen-govalidators"
    _ "github.com/twitchtv/twirp/protoc-gen-twirp"
    _ "github.com/rynop/protoc-gen-twirp_typescript"
)

当我运行go mod tidy 下载我的依赖项时,我收到了这个错误:

go: finding github.com/rynop/protoc-gen-twirp_typescript master
go: finding github.com/rynop/protoc-gen-twirp_typescript latest
go: github.com/rynop/protoc-gen-twirp_typescript@v0.0.0-20190618203538-a346b5d9c8fb: parsing go.mod: unexpected module path "go.larrymyers.com/protoc-gen-twirp_typescript"

为什么会出现此错误?我认为go.mod 中的replace 指令允许forked modules go.mod 保持不变。

【问题讨论】:

    标签: go protocol-buffers protoc go-modules


    【解决方案1】:

    你有以下replace

    replace go.larrymyers.com/protoc-gen-twirp_typescript => github.com/rynop/protoc-gen-twirp_typescript master

    如果我遵循的话,实际上是replace originalname => forkname

    我认为问题在于您使用 fork 的名称而不是原始名称进行导入:

    import (
        // protocol buffer compiler plugins
        _ "github.com/golang/protobuf/protoc-gen-go"
        _ "github.com/mwitkow/go-proto-validators/protoc-gen-govalidators"
        _ "github.com/twitchtv/twirp/protoc-gen-twirp"
        _ "github.com/rynop/protoc-gen-twirp_typescript"   <<<< PROBLEM, using fork name
    )
    

    您看到的错误消息似乎是抱怨该问题的 go 命令。

    我怀疑如果您在导入语句中使用原始名称,它会起作用:

    import (
        ...
        _ "go.larrymyers.com/protoc-gen-twirp_typescript"   <<<< original name
    )
    

    您还应该运行go list -m all 来查看最终选定的版本,包括它显示任何replaceexclude 指令的结果。

    【讨论】:

    • 谢谢!我很困惑为什么自述文件似乎声明 go 开发团队明确计划了这个案例。对我来说这是多么愚蠢的错误。
    【解决方案2】:

    如何使用分叉模块 [?]

    你不能。 Github fork 生成一个不相关的包,很可能甚至无法构建。

    不要分叉,克隆。然后推送到不同的遥控器(可以是分叉)。

    【讨论】:

    • 如果我克隆和推送不是和fork一样吗?你确定你不能? github.com/golang/go/wiki/… 似乎明确说明了我的用例:“replace 还允许使用分叉的依赖项,例如...”
    • 一切取决于细节。如果您使用单个包分叉一个项目,该包不固定其导入路径并且不使用反射来获取其导入路径,那么您当然可以在没有问题的情况下分叉并使用分叉。 github fork 创建了一个新的包,这是一个坏主意。
    • 我是一个 golang 菜鸟,但我认为您的 cmets 在“旧”非版本化 go 模块方式中是正确的(当所有代码都在 GOPATH 内时),这在 @987654322 中有所介绍@ 有了新的 go 模块支持(v1.11+),我很确定这个痛点已经得到解决。
    • 你是对的。 replace 仅用于本地开发,在您自己的模块之外没有任何影响(也就是 Q 中的外部工具)。详情@github.com/golang/go/issues/30354
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多