一尘不染

如何处理go导入绝对路径和github分支?

go

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

如果这是正确的,那么您如何处理项目的封装,以及如何通过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。

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


阅读 803

收藏
2020-07-02

共1个答案

一尘不染

至于不允许相对导入的原因,您可以从某种角度阅读此讨论:https :
//groups.google.com/forum/#! msg/
golang- nuts/
n9d8RzVnadk/07f9RDlwLsYJ

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

现在,该如何处理呢?

  1. 如果您的fork只是来自另一个项目的一个小修复,可能很快就会被接受为PR-只需手动编辑git remotes,使其引用您自己的git repo,而不是原始的git repo。如果您使用的是Godep之类的供应商解决方案,那么它将顺利运行,因为保存它只会出售您的分叉代码,并且go get永远不会直接使用。

  2. 如果您的前叉有很大的变化,并且您打算保留分支,请重写所有导入路径。您可以sed使用来自动化它,也可以使用gofmt -r它来支持重写正在格式化的代码。

[编辑]我还找到了专门用于解决这种情况的工具:https :
//github.com/rogpeppe/govers

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

我还可以想到除供应商工具之外的其他工具,这些工具可以自动执行此操作,但我认为目前尚无任何工具支持它。

2020-07-02