golang 引入 本地自定义包问题

项目结构

-bin
-pkg
-src
 -test
  -message
   message.go
  main.go

main.go 中 使用 import "./message"
执行go run main.go可以执行
但是go build 提示 local import "./message" in non-local package

使用 import "test/message" 才行

如果我test目录托管在git
项目中使用 import "test/message"
在其他机子上clone下来存在文件夹 testother 中就会导致依赖路径错误...
这个本地自定义包该如何引用?保证随意clone下来的都可以正常编译?

肯定是我姿势错了,请指教

阅读 48.6k
4 个回答

通常情况下,import的包都是相对$GOPATH/src目录引入的,比如从github上面clone下来的项目,直接放到$GOPATH/src目录下,就可以直接import。例如:
如果项目的import路径是这样写的:
import "github.com/yourname/projectname"
需要将项目代码放置在:
$GOAPTH/src/github.com/yourname/projectname/

如果项目的import是这样写的:
import "message"
则将message.go放到:
$GOAPTH/src/message/目录下即可。

现在的项目基本都是:

$GOPATH
|-- bin
|-- pkg
|-- src
|  |-- github.com
|  |  |-- username
|  |  |  |-- project
|  |  |  |  |-- subpackage
|  |  |  |  |-- main.go 
  • ide 直接打开project目录

  • git 上传的也是projcet目录

  • 引包是import github.com/username/project/subpackage

  • 其它人go get下载代码 或 先创建GOPATH的目录再用git下载代码

  • 其它人也是直接用ide打开项目, go build 编译

PS:其实你看看项目依赖的第三方包就知道了。 $GOPATH/src/github.com/下边

补充:
201717251102-u.png

这些都是第三方包,包括官方的golang.org下边的

LZ问的应该是如何处理非开源包路径的问题

不管开源闭源
都应该放到gopath/src下
如果不在gopath/src下,才可以使用相对导入,而相对导入有时不被接收

比如你的开源项目可能为gopath/src/github.com/tom/myproject
闭源项目可能为gopath/src/myproject

如果clone,也应该clone到gopath/src下

简单,所有项目都放在GOPATH的src下面。

推荐问题
宣传栏