我目前正在使用Golang进行一个私人项目(这是我的新手)。

但是我有一个问题,我不知道为本地软件包定义import path的正确方法是什么。

通过此链接,我与作者有相同的感觉https://medium.com/@c9s/golang-the-annoying-remote-import-path-c6c7e76517e5

简而言之,如果我在Github中托管项目foo。 使用github.com/levin/foo作为导入路径而不只是foo感到奇怪。 如果将代码移至Bitbucket或在AWS中托管自己的git服务器,是否会造成大量返工?

更糟糕的是,我可以重写代码来更改导入路径,但是在我的代码中使用代码的人将如何通知存储库更改? 我觉得没有必要要求其他人更新他们的代码。

我是Golang的新手,所以随时可以说"您的问题甚至无效"之类的内容。

您问题的答案:

I don't know what is the proper way to define the import path for local packages.

正如@JimB所说:

If you want to use the Go tools you need to follow the conventions. If you want go get to work, then you need to import it with the full name, otherwise put it wherever you want in GOPATH

因此,如果要使go get工作,则需要使用完整的导入路径github.com/levin/foo,如果希望其他人使用您的程序包,则应该使用这种方式。

您的第二个问题的答案:

Wouldn't it cause much rework if I move my codes to Bitbucket or I host my own git server in AWS?

有一种方法可以使用自定义域名作为导入路径,并且仍然在需要的地方托管代码,我认为这就是虚荣导入路径。您只需要向使用的导入文件中提供的html文件中添加一些元标记即可。

本文介绍了如何执行此操作,但总而言之,在访问自定义导入路径时在自定义域中提供的文件中,您需要添加一个go-import元标记,该标记指向托管代码的位置。本文使用github.com/foo/bar作为托管代码的位置的示例,并使用foo.com/bar作为实际的导入路径。

因此,在访问foo.com/bar时提供服务的文件中,应该有一个像这样的元标记:

然后,您继续将代码托管在github中。然后,如果将托管位置更改为代码,则只需更改meta标记的值,但是使用该软件包的所有代码将继续使用完全相同的导入路径"foo.com/bar

唯一的问题是,现在您的项目可以通过2个不同的路径导入:foo.com/bargithub.com/foo/bar。为了解决这个问题,他们有规范的导入方式,只允许使用自定义路径而不是github路径导入软件包,它只是在每个软件包文件的软件包名称旁边添加一个注释:

这是避免出现问题的唯一方法。如果您正在使用仅在本地使用的软件包,则可以使用@srxf答案,只要知道go工具不会与该代码一起使用即可(例如go get)。如果您希望代码按预期工作,那么这就是方法。

作为评论,我知道为本地软件包导入github.com/levin/foo感觉很愚蠢,但是如果您在另一个软件包(例如foo2)中使用该软件包,而其他人又导入了foo2,这将使编译器确切地知道在哪里获取foo2的依赖项,因为代码中的所有导入都包括整个路径,而不是本地文件的名称。这样,人们始终可以获取他们需要的软件包依赖关系,而不必在回购中包含这些文件,也无需配置任何文件即可正常工作。它不是完美的,但这是可行的方式,他们称其为配置之上的约定或类似的东西。

从Go 1.11开始,随着Go模块的引入,可能会重新回答这个问题。模块可用于解决此"本地路径"难题以及GOPATH范围之外的讨厌项目。
您现在可以通过以下方式初始化您的项目:

然后,您可以通过本地软件包的软件包名称来引用它们。
像这样...

然后(假设您有另一个名为"模型"的本地包)在文件中进行引用

参考:

https://github.com/golang/go/wiki/Modules

访问go模块中的本地包(go 1.11)

我们也正在(私下)开发一个项目,并将其托管在GitLab上,我很清楚go get在私有存储库上效果不佳(至少据我所知)。

我们要做的是创建一个文件夹,让我们说$GOPATH/src/theproject并克隆该文件夹中的所有存储库。

到目前为止,它对我们来说效果很好,但是您可能还认为这样做很乏味,确实如此,但是我们没有其他方法可以做到。我们使用git pull手动更新代码。