Go工作区问题:如何将本地软件包与远程软件包区分开?


Go workspace issue: how to differ local packages from remote packages?

我的gopath指向$HOME/go目录。 我有一些我不想在github或其他任何地方共享的个人软件包。 但是,当我尝试使用go get -u all更新远程软件包时,我得到:

1
2
3
4
5
6
7
8
# cd /home/go/src/marcio/somePackage; git pull --ff-only
fatal: No remote repository specified.  Please, specify either a URL or a
remote name from which new revisions should be fetched.
package code.google.com/p/go.tools/astutil
        ...
        long list of dependencies
        ...
        imports marcio/somePackage: exit status 1

这非常令人困惑。 如何告诉go get将我维护的软件包与用作依赖项的软件包区分开? 为什么go工具认为所有内容都必须从远程来源获取?

更新:

看起来Go工作区迫使您将依赖项与用户维护的代码混合在一起。 这看起来pre可危。 有时,有些人想擦拭未使用的垃圾程序包,并冒着擦错文件夹或未提交内容的风险,还有许多其他问题……是否有办法使用户维护的程序包与远程获取的依赖项分开?


go get -u用于通过VCS获取更新。 如果要有选择地更新软件包,则必须使用更具体的标识符。 您还可以使用...通配符。

例如,这将尝试更新github.com中的所有软件包:

1
go get -u github.com/...

但是总的来说,我会避免盲目更新所有内容,因为这会使跟踪依赖项破坏某些东西时更加困难,因为您当前不使用的无关项目也会对其依赖项进行更新。

更新答案:

尽管可以使用多个GOPATH(它们与PATH一样用冒号分隔),但是不要这样做。 它将导致更多的问题,而不是帮助。 使用单个GOPATH,甚至更好的是,每个项目使用单个GOPATH。 这样,您可以更新依赖关系而不会影响其他项目。 有一些供应商工具可以帮助您解决此问题(例如godep)