如何处理 go import 绝对路径和 github forks?

2023-12-19

围绕这个有很多问题,包括为什么你不应该使用import "./my/path"以及为什么它只能工作,因为一些遗留的 go 代码需要它。

如果这是正确的,您如何处理项目的封装以及扩展的 github forks?在每一个其他语言中,我可以做一个项目的 github fork,或者 git clone,所有的东西都封装在那里。如何从 go 项目中获得相同的行为?

使用 go“hello world”示例的简单示例。

hello.go

package main

import ("fmt"
    "github.com/golang/examples/stringutil")

func main() {
    fmt.Printf(stringutil.Reverse("hello, world")+"\n")
}

上面的效果很好。但是,如果我想使用自己的 stringutil(位于子目录中并将编译为单个二进制文件),我still需要完整路径:

package main

import ("fmt"
    "github.com/myrepo/examples/util/stringutil")

func main() {
    fmt.Printf(stringutil.Reverse("hello, world")+"\n")
}

现在,如果有人复制或分叉我的存储库,它会直接依赖于“github.com/myrepo/”,即使这完全是内部使用的!

如果导入 20 个不同的文件怎么办utils/?每次有人分叉时我都需要改变每一个吗?这是很多无关的更改和无意义的 git 提交。

我在这里缺少什么?为什么相对路径这么糟糕?如何在不更改数十个文件的情况下分叉一个引用其自己的子目录(及其包)的项目?


至于不允许相对导入背后的原因,您可以阅读此讨论以了解一些观点:https://groups.google.com/forum/#!msg/golang-nuts/n9d8RzVnadk/07f9RDlwLsYJ https://groups.google.com/forum/#!msg/golang-nuts/n9d8RzVnadk/07f9RDlwLsYJ

就我个人而言,我宁愿启用它们,至少对于内部导入来说,正是出于您所描述的原因。

现在,遇到这种情况该如何处理呢?

  1. 如果您的分叉只是另一个项目的一个小修复,可能很快就会被接受为 PR - 只需手动编辑 git 遥控器,使其引用您自己的 git 存储库,而不是原始的。如果您使用像 godep 这样的供应商解决方案,它将顺利工作,因为保存它只会供应您的分叉代码,并且go get从来不直接使用。

  2. 如果您的分叉是一个很大的变化并且您打算保持分叉,请重写所有导入路径。您可以使用以下命令将其自动化sed或者你可以使用gofmt -r支持重写正在格式化的代码。

[编辑]我还发现了这个工具,旨在帮助解决这种情况:https://github.com/rogpeppe/govers https://github.com/rogpeppe/govers

我已经完成了 1 和 2 - 当我刚刚对某个库进行了一个小错误修复时,我只是更改了遥控器并对其进行了修改。当我实际上分叉了一个库而不打算合并我的更改时,我更改了所有导入路径并继续仅使用我的存储库。

我还可以考虑添加一个允许这些东西自动化的供应商工具,但我认为目前没有任何一个支持它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何处理 go import 绝对路径和 github forks? 的相关文章

  • 是否可以在 C/C++ 中模仿 Go 接口?

    在 Go 中 如果类型具有接口定义的所有方法 则可以将其分配给该接口变量 而无需显式继承它 是否可以在 C C 中模仿此功能 是的 您可以使用纯抽象类 并使用模板类来包装 实现 抽象类的类型 以便它们扩展抽象类 这是一个简单的示例 incl
  • Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

    对于下面的RSA加密代码 每次对同一条消息进行加密时 结果都会不同 我发现这是由于rand Reader in the rsa EncryptOAEP功能使其更加安全doc https pkg go dev crypto rsa Encry
  • Go客户端程序生成大量TIME_WAIT状态的socket

    我有一个 Go 程序 它从多个 goroutine 生成大量 HTTP 请求 运行一段时间后 程序报错 connect cannot allocaterequestedaddress 当检查时netstat 我得到大量 28229 个连接T
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 有没有办法从另一个包访问结构体的私有字段?

    我在一个包中有一个具有私有字段的结构 package foo type Foo struct x int y Foo 另一个包 例如 白盒测试包 需要访问它们 package bar import foo func change foo f
  • 如何拥有在标准输出上更新的就地字符串

    我想输出到标准输出并让输出 覆盖 以前的输出 例如 如果我输出On 1 10 我想要下一个输出On 2 10覆盖On 1 10 我怎样才能做到这一点 stdout是一个流 io Writer 您无法修改已写入其中的内容 什么can更改的是该
  • 关于编写惯用的 Golang 的建议

    我正在掌握 Golang 的做事方式 首先是一些示例代码 package main import log os func logIt s string f os OpenFile errors log os O RDWR os O CREA
  • “http:多个response.WriteHeader调用”有什么不好的影响?

    尽管我发现 http 多个响应 WriteHeader 调用 例外 但我的服务器表现良好 此异常不会导致我的服务器出现恐慌或行为异常 我进行了很多搜索 但只找到了如何解决这个问题 没有文档描述异常的不良影响 有人可以帮我找出为什么 http
  • 为什么 DER ASN.1 大整数的解组在 Golang 中仅限于 SEQUENCE?

    我希望能够使用encoding asn1 包从 DER 文件中解组一个大整数 但它看起来只适用于整数序列 例如 这不起作用 这很奇怪 因为 Big Int 的编组效果很好 https play golang org p Wkj0jAA6bp
  • 如何对结构切片而不是切片结构进行范围调整

    稍微玩了一下 Go HTML 模板后 我发现的所有循环模板中对象的示例都是将切片结构传递给模板 有点像这个示例 type UserList struct Id int Name string var templates template M
  • 管理多租户 ArangoDB 连接

    我使用 ArangoDB Go 使用 go driver 并且需要实现多租户 这意味着每个客户都将在单独的数据库中拥有他的数据 我想要弄清楚的是如何使这种多租户发挥作用 我知道为每个请求创建一个新的数据库连接是不可持续的 这意味着我必须维护
  • 仅导出嵌入结构实现的方法子集

    是否可以仅导出嵌入结构实现的方法的子集 这是一种与减少代码复制和粘贴非常不同的方法吗 还有更惯用的方法吗 type A struct func a A Hello fmt Println Hello func a A World fmt P
  • 多个生产者,单个消费者:所有 goroutine 都在睡觉 - 死锁

    在继续工作之前 我一直遵循检查通道中是否有任何内容的模式 func consume msg lt chan message for if m ok lt msg ok fmt Println More messages m else bre
  • 如何在GO中执行HEAD请求?

    我想使用 GO net http 获取页面的内容长度 我可以在终端中使用curl i X HEAD https golang org然后检查内容长度字段 use http Head https golang org pkg net http
  • 可执行文件不在路径中 - GO

    我正在尝试调用命令提示符的内置命令 但出现了我不明白的错误 func main cmd exec Command del C trial now txt Reboot if needed cmd Stdout os Stdout if er
  • Golang http 写入响应,无需等待完成

    我正在构建一个应用程序 该应用程序构建 pdf 文件并在收到请求时将其返回给客户端 由于其中一些 pdf 文件可能需要一些时间才能生成 我想在客户端运行时定期将某种状态更新发送回客户端 当完成 pdf 文件的构建后 它也应该返回给客户 类似
  • 为什么 Go 中不允许在包级别声明短变量?

    这是允许的 package main var a 3 但这不是 package main a 3 为什么不 为什么不能将函数外部的短变量声明视为没有类型的常规声明 只是为了简化解析 根据伊恩 兰斯 泰勒的说法这个线程 https group
  • 不支持的 Perl 语法:`(?<`

    我想解析 cmd gpg list keys 的结果以将其显示在浏览器上 cmd输出是这样的 pub rsa3072 2021 08 03 SC expires 2023 08 03 07C47E284765D5593171C18F00B1
  • 如何覆盖 go 模块中的依赖项?

    In dep您可以选择覆盖依赖项并使其指向不同的存储库 例如以下内容https github com kubermatic glog logrus https github com kubermatic glog logrus库一需要将以下

随机推荐