关于包引用的问题(与github也有关系)

249 views
Skip to first unread message

hyper-carrot

unread,
Nov 22, 2012, 3:51:44 AM11/22/12
to golang...@googlegroups.com
各位,我有个疑问:

比如说我的项目里有两个包server和utils。

我把这个项目push到github然后再另一台机器上get下来之后,这个包名其实就变了,变为github.com/<我的github用户名>/<我的项目名>/ utils了。

这时候我再run那个server包中代码,如果server包中的代码import了utils这个包就会出现问题,因为utils的包名变了,import "utils"不再起作用了,会提示找不到这个包。这个问题大家遇到过么?怎么解决?

我这两天在看这个老外的MQ项目:https://github.com/bitly/nsq。他们处理这个问题的方式是用相对路径引用,比如‘import "../nsq"’,但是我run例子的时候还是会出现这个错误提示。

我和他们的讨论见这里:https://github.com/bitly/nsq/issues/97

steve wang

unread,
Nov 22, 2012, 4:19:25 AM11/22/12
to golang...@googlegroups.com
用go get吗?
go get本来就是会按照“website/proj/item”这样来建本地目录的。
用git clone就不会。

hyper-carrot

unread,
Nov 22, 2012, 4:53:21 AM11/22/12
to golang...@googlegroups.com
我刚才看了几个github上的Go项目,项目中代码import自己项目其他包的时候有两种方式:

1. import "github.com/<github用户名>/<项目名>/<包名>"
2. import "../<包名>"。

这两种import方式会影响到使用它们的方式的不同:

1. 当被使用的项目代码中有第一种import方式时:git clone代码之后,运行被使用项目的某个包的例子的时候就会出错,因为GOPATH中没有相应的包。
2.  当被使用的项目代码中有第二种import方式时:go get代码之后,如果将被使用项目的例子mv到其他地方运行的话也会报错(即时将这个例子中的import方式改为第一种也会是这样),提示找不到相应的包或者local import " ../<包名 " in non-local package。

貌似,领悟了:

1. 如果是可独立运行的项目代码(仅需git clone然后运行的代码),不要使用第一种引用方式,而应该使用本地引用方式(上面出现过的local import)。因为GOPATH中没有相应的包和代码,而且即使将这些项目代码go get进GOPATH也没有什么意义。

2. 如果是提供给他人使用的工具代码,不要出现任何使用本地引用方式,而应该使用全限定名的引用方式,因为这些代码别人是会go get到GOPATH然后使用的。但是在push到github前可能还不能确定这个以github.com开头的全限定包名,我觉得这是“push to github -> go get to local”这个流程中的一个坑。

3. 依据以上两点,可独立运行的项目中的工具类代码,如果可以尽量拆出来形成小项目以方便自己和他人使用。从另一个角度来说,在可独立运行的项目中不要出现使用者需要在外部调用的代码,原因我在上面试图说明了。

steve wang

unread,
Nov 22, 2012, 7:45:10 AM11/22/12
to golang...@googlegroups.com
是两种处理GOPATH的方式
1.独立的目录,需要添加进GOPATH全局变量。
这种import语句不需要包含github.com或者code.google.com路径。
2.加入到当前GOPATH的子目录里,GOPATH不许修改。
这种import语句包需要包含github.com或者code.google.com路径。

hyper-carrot

unread,
Nov 22, 2012, 10:37:38 PM11/22/12
to golang...@googlegroups.com
恩,非常同意,和我说的一个意思:)
Reply all
Reply to author
Forward
0 new messages