围绕此有很多问题,包括为什么不应该使用import "./my/path"以及为什么它只能工作,因为某些传统的go代码需要它。
import "./my/path"
如果这是正确的,那么您如何处理项目的封装,以及如何通过github分支进行封装?在其他每个lang中,我都可以做一个项目的github分支或git clone,所有内容都封装在那里。我如何从go项目中获得相同的行为?
使用go“ hello world”示例的简单示例。
你好
package main import ("fmt" "github.com/golang/examples/stringutil") func main() { fmt.Printf(stringutil.Reverse("hello, world")+"\n") }
上面的作品很棒。但是,如果我想使用自己的stringutil(位于子目录中并将编译为单个二进制文件),则 仍 需要完整路径:
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 commit。
utils/
我在这里想念什么?为什么相对路径这么糟糕?如何在不更改数十个文件的情况下派生引用其自己的子目录(及其包)的项目?
至于不允许相对导入的原因,您可以从某种角度阅读此讨论:https : //groups.google.com/forum/#! msg/ golang- nuts/ n9d8RzVnadk/07f9RDlwLsYJ
就我个人而言,我宁愿至少针对内部导入启用它们,完全出于您所描述的原因。
现在,该如何处理呢?
如果您的fork只是来自另一个项目的一个小修复,可能很快就会被接受为PR-只需手动编辑git remotes,使其引用您自己的git repo,而不是原始的git repo。如果您使用的是Godep之类的供应商解决方案,那么它将顺利运行,因为保存它只会出售您的分叉代码,并且go get永远不会直接使用。
go get
如果您的前叉有很大的变化,并且您打算保留分支,请重写所有导入路径。您可以sed使用来自动化它,也可以使用gofmt -r它来支持重写正在格式化的代码。
sed
gofmt -r
[编辑]我还找到了专门用于解决这种情况的工具:https : //github.com/rogpeppe/govers
我已经完成了1和2的工作- 当我对某个库进行了一个小错误修正时,我只是更改了遥控器并对其进行了授权。当我实际上分叉一个库而不打算将更改合并回去时,我更改了所有导入路径,并继续仅使用我的存储库。
我还可以想到除供应商工具之外的其他工具,这些工具可以自动执行此操作,但我认为目前尚无任何工具支持它。