【发布时间】:2015-08-23 12:27:57
【问题描述】:
有很多关于这个的问题,包括为什么你不应该使用import "./my/path" 以及为什么它只工作因为一些遗留的 go 代码需要它。
如果这是正确的,您如何处理项目的封装以及扩展 github 分叉?在所有其他语言中,我可以做一个项目的 github fork 或 git clone,所有东西都封装在那里。如何从 go 项目中获得相同的行为?
使用 go "hello world" 示例的简单示例。
你好.go
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")
}
现在,如果有人复制或分叉我的 repo,它直接依赖于“github.com/myrepo/”,即使这完全在内部使用!
如果有 20 个不同的文件导入 utils/ 怎么办?每次有人分叉时我都需要更换吗?这是很多无关的更改和无意义的 git 提交。
我在这里缺少什么?为什么相对路径如此糟糕?如何在不更改数十个文件的情况下分叉一个引用其自己的子目录(及其包)的项目?
【问题讨论】:
-
刚接触 golang 的新人发现了同样的发现。知道 2018 年有什么变化吗?
-
一些已经改变。如果您不在
GOPATH或设置 env varGO111MODULE=on,现在支持 Go 模块(从 1.11 开始)。它仍然没有解决根本问题,并且是我对 Go 的主要抱怨之一。忽略语言,我一直强烈认为节点打包是正确的:包中文件内的任意名称,以及映射到绝对位置的“映射文件”(package.json或其他)。哦,好吧。 -
我看了看 Go 模块,直到看到“实验”这个词。解决方案似乎是克隆到与上游存储库命名相同的存储库中,同时推送到源(分叉)以进行私有更改。这一切都很蹩脚。
-
Golang 的模块结构相当蹩脚。尽管存在弱点,但它的采用仍然存在。 :-(
标签: go