围绕这个有很多问题,包括为什么你不应该使用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
就我个人而言,我宁愿启用它们,至少对于内部导入来说,正是出于您所描述的原因。
现在,遇到这种情况该如何处理呢?
如果您的分叉只是另一个项目的一个小修复,可能很快就会被接受为 PR - 只需手动编辑 git 遥控器,使其引用您自己的 git 存储库,而不是原始的。如果您使用像 godep 这样的供应商解决方案,它将顺利工作,因为保存它只会供应您的分叉代码,并且go get
从来不直接使用。
如果您的分叉是一个很大的变化并且您打算保持分叉,请重写所有导入路径。您可以使用以下命令将其自动化sed
或者你可以使用gofmt -r
支持重写正在格式化的代码。
[编辑]我还发现了这个工具,旨在帮助解决这种情况:https://github.com/rogpeppe/govers https://github.com/rogpeppe/govers
我已经完成了 1 和 2 - 当我刚刚对某个库进行了一个小错误修复时,我只是更改了遥控器并对其进行了修改。当我实际上分叉了一个库而不打算合并我的更改时,我更改了所有导入路径并继续仅使用我的存储库。
我还可以考虑添加一个允许这些东西自动化的供应商工具,但我认为目前没有任何一个支持它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)