我正在编写一个Golang应用程序,并希望利用现有的库. 但是该库缺少一些功能,所以我决定派生repo并添加我的新功能.

为了能够在我的应用程序中使用派生/扩展库,我使用了Golang的"工作区"特性.

我的应用程序回购中的go.work看起来像

go 1.21.4

use (
    .
    ../go-git-cmd-wrapper // this is the local path to the forked/edited lib repo
)

只要我只在派生的lib中扩展现有的包,就可以很好地工作. 也就是说,一旦我开始在派生的库中创建一个新的包,我就会得到如下的构建错误:

我在forked/cloned lib go-git-cmd-wrapper/log/log.go中添加了一个新的包,

package log

.... // my new functionality 

例如,在我的应用程序中,我导入了库的现有包和新包

package main

import (
    ....
    // the following three work as expected, i.e. I can add new functionality
    // to those packages and use them in my application
    gwbranch "github.com/ldez/go-git-cmd-wrapper/v2/branch"
    gwconfig "github.com/ldez/go-git-cmd-wrapper/v2/config"
    gw "github.com/ldez/go-git-cmd-wrapper/v2/git"
    // the following doesn't work, I get import error on build
    gwlog "github.com/ldez/go-git-cmd-wrapper/v2/log"
    ....
)    
 go: finding module for package github.com/ldez/go-git-cmd-wrapper/v2/log
          go: changeme imports
                github.com/ldez/go-git-cmd-wrapper/v2/log: module github.com/ldez/go-git-cmd-wrapper/v2@latest found (v2.6.0), but does not contain package github.com/ldez/go-git-cmd-wrapper/v2/log
          exit status 1

我如何修复这样的错误?我在工作空间和/或分支库方面做错了什么?

推荐答案

您不能仅使用工作区功能来完成您想要做的事情.这是因为读取主导入中的模块路径的Go工具将调用远程存储库,即原始模块.请参阅:https://go.dev/ref/mod#vcs-find 相反,您应该使用Go模块的replace特性,它是为这个用例而设计的.将fork 保留在Go工作区中,但在go.mod中添加以下内容:

module your-module

go 1.21.4

require github.com/ldez/go-git-cmd-wrapper v2.6.0

replace github.com/ldez/go-git-cmd-wrapper v2.6.0 => ../go-git-cmd-wrapper

点击此处查看更多信息:https://go.dev/doc/modules/managing-dependencies#local_directory

Go相关问答推荐

GORM没有从 struct 创建完整的表,如何修复?

错误.如果它包含切片,则返回FALSE

使用GO从RDPMC获得价值

为什么要立即调用内联函数,而不仅仅是调用其包含的函数?

如何在出现错误时停止从通道读取?

我可以扫描表中每个项目的最高范围键值吗?

Global Thread-local Storage 在 Go 中的可行性和最佳实践

下载和合并时输出文件已损坏

如何判断范围内的字段?

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

拆分文本并按空格获取字符串数组,如果文本长度超过 500,则获取字符串数组

速率限制特定端点

从动态输入中提取字符串,其中部分字符串可能不存在

Golang:隐式 struct 匹配

在 docker kill --signal=SIGX 上以这种方式关闭容器内运行的 go 应用程序是否安全?

在 golang 中联合一个接口和类型

如何在 Unmarshal 中使用泛型(转到 1.18)

Golang 有类似 C++ 的 decltype 的东西吗?

(如何)我可以基于接口抽象地实现Stringer吗?

Golang LinkedList 删除第一个元素