2016-02-28 75 views
1

我的$ GOPATH是Golang相关包装进口

"/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中,我将使用这个p下的其他包的导入roject,它看起来像:

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

但是当我跑“去建造”,我让越来越错误说:
无法加载包:本地进口” ../package”在非本地包

如果我不喜欢使用相对包路径,例如用它喜欢:

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

那么一切都将正常工作。

如果我使用相对包路径,我的代码有什么问题?
如果项目1的名称将在未来发生变化,那么包导入的最佳做法是什么?例如将其更改为projecet1v2?
我需要手动更新导入的软件包名称吗?

回答

4

规则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)的服务将提供版本进口网址(如gopkg.in/you/pkgname.v2)
+0

如果需要我必须将project1重命名为project1v2,那么该怎么办?在进口我必须更新它,对吧?有没有什么好的解决方案,所以我不需要手动更新它们?这也是我在这里使用相对导入的原因。 – mikero

+1

您不应该将其重命名为v2。分叉它/复制它,然后创建第二个新的包作为v2(这样v1用户仍然可以使用v1,直到他们可以升级而不会破坏他们的程序)。 – elithrar

+0

哦,这是我一生中golang最糟糕的部分:( – rox