重命名后使用Golang相对包导入

3

我的 $GOPATH 是

"/Users/peter/goworkspace"

我的当前 golang 版本:

go version go1.6 darwin/amd64

我在这个工作区下有多个Golang项目,以下是目录结构:

+/goworkspace  
  +---/bin  
  +---/pkg  
  +---/src  
    +---/project1
        +---package1 
           +---file1.go 
           +---file2.go 
           +---file3.go 
        +---package2 
        +---package3 
        +---main.go 
    +---/project2
    +---/project3

在我的proj1的main.go中,我将使用该项目下其他包的导入,它看起来像:

import(  
     "./package1"      
     "./package2"      
     "./package3"
 )  

然而当我运行"go build"时,我一直收到错误提示:
" 无法加载包:非本地包中的本地导入 "../package"

如果我不想使用相对包路径,例如像这样使用它:

import(
    "project1/package1"  
    "project1/package2"   
    "project1/package3"   
)  

如果我使用相对包路径,我的代码有什么问题?

如果将project1的名称更改为project1v2等,包导入的最佳实践是什么?

需要手动更新导入的包名称吗?

然后一切都会正常工作。

1个回答

5

规则 #1:不要使用相对导入。这也是你遇到问题的部分原因。请阅读以下内容:https://golang.org/doc/code.html#Library

使用完整的导入路径(就像你展示的那样):

import(
    "project1/package1"  
    "project1/package2"   
    "project1/package3"
    // Or ideally, so others can access it in the future:
    "github.com/<yourusername>/project1/package4"
)  

如果您想对包进行版本控制,可以选择以下两种方式之一:
  • 提供一个新的仓库(导入URL)
  • 使用类似gopkg.in (http://labix.org/gopkg.in) 的服务来提供版本化的导入URL(例如:gopkg.in/you/pkgname.v2)

如果我需要将project1重命名为project1v2,那该怎么办呢?在导入时,我需要更新它,对吧?有没有好的解决方案,让我不需要手动更新它们呢?这也是我在这里使用相对导入的原因。 - mikero
1
你不应该将它重命名为v2。你应该fork或复制它,并创建一个新的包作为v2(这样v1用户仍然可以使用v1,直到他们可以升级而不会破坏他们的程序)。 - elithrar
1
哦,这是我迄今为止遇到的golang最糟糕的部分 : ( - rox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接