2013-07-09 103 views
87

我已经使用GOPATH,但对于这个目前我遇到的问题没有帮助。我希望能够创建一个特定于某个项目包:Golang如何导入没有gopath的本地软件包?

myproject/ 
├── binary1.go 
├── binary2.go 
├── package1.go 
└── package2.go 

我试过多种方法,但我如何才能package1.gobinary1.gobinary2.go等工作?

例如;我希望能够import "package1",然后能够运行go build binary1.go和一切工作正常,没有错误被抛出的包无法找到GOROOTGOPATH。我需要这种功能的原因是大型项目;我不想引用多个其他软件包或将它们保存在一个大文件中。

+2

你应该把每个二进制文件的源文件放到它自己的目录中。 – fuz

回答

103

编辑2:售货方法仍然有效,没有问题。 vendor是事实上管理项目的方式。然而,这主要是一个手动过程,因为这个新工具已经出来为您管理您的供应商软件包:dep

depwill be part of the toolchain in the future;这不是我推荐的第三方工具。这是未来:)。这是一个非常简单的工具,请参阅documentation


编辑1:虽然我的旧方法的作品,它不再是“正确”的方式来做到这一点。您应该在Go 1.6中使用默认启用的供应商功能; see。你基本上在vendor目录中添加你的“外部”或“依赖”包;编译后编译器将首先使用这些软件包。


找到。我可以导入本地包GOPATH通过创建package1一个子文件夹,然后用import "./package1"binary1.go进口和binary2.go脚本是这样的:

binary1.go

... 
import (
     "./package1" 
    ) 
... 

所以我的当前目录结构如下所示:

myproject/ 
├── binary1.go 
├── binary2.go 
├── package1/ 
│ └── package1.go 
└── package2.go 

我也应该注意到,相对路径(至少在1.5)也可以;例如:

import "../packageX" 
+3

这工作正常,直到你有两个子文件夹与一个引用到另一个。例如,如果package2也是一个子文件夹,并且它需要package1,则系统会中断。 – Carl

+6

'import“../ package1”' –

+8

相对导入路径是[坏主意](https://golang.org/cmd/go/#hdr-Relative_import_paths)。 –

42

没有“本地包”这样的东西。磁盘上软件包的组织与任何软件包的父/子关系是正交的。由软件包形成的唯一真正的层次结构是依赖关系树,在一般情况下它不反映目录树。

只需使用

import "myproject/packageN" 

不打构建系统没有很好的理由。在任何非平凡的程序中为每个导入保存十几个字符并不是一个好的理由,因为例如具有相对导入路径的项目是不可获取的。

的进口路径的概念有一些重要的特性:

  • 导入路径可以是全局唯一的。
  • 结合GOPATH,导入路径可以毫不含糊地转换为目录路径。
  • GOPATH下的任何目录路径都可以毫不含糊地转换为导入路径。

以上所有情况都是通过使用相对导入路径来破坏的。不要做。

PS:在Go编译器测试中使用相对导入的遗留代码中很少有地方。自动柜员机,这是为什么支持相对进口的唯一原因。

+1

开头我建议查看此介绍视频以更好地了解**包**和** GOPATH **。 https://www.youtube.com/watch?v=XCsL89YtqCs –

+4

我认为这是不好的建议。例如,如果最终使用gopkg.in进行版本控制,那么如上所述,对于“迷你”版本而言,绝对不会有输入路径。要么打破源代码回购,要么版本化的回购变得毫无用处。 – Greg

+0

'import“myproject/packageN”'。 'myproject'是保存我的项目的文件夹名称? – securecurve

30

也许你正试图模块化你的软件包。我假设package1package2在某种程度上是同一个软件包的一部分,但为了便于阅读,您将它们分成多个文件。

如果上一个案例是你的,你可以在这些多个文件中使用相同的包名称,就像是有相同的文件一样。

这是一个例子:

add.go

package math 

func add(n1, n2 int) int { 
    return n1 + n2 
} 

subtract.go

package math 

func subtract(n1, n2 int) int { 
    return n1 - n2 
} 

donothing.go

package math 

func donothing(n1, n2 int) int { 
    s := add(n1, n2) 
    s = subtract(n1, n2) 
    return s 
} 

我不是一个围棋高手和这是我在StackOveflow中的第一篇文章,所以如果你有一些建议,它会很受欢迎。

3

要将“本地”包添加到项目中,请添加一个文件夹(例如“package_name”)。并把你的实现文件放在那个文件夹中。

src/github.com/GithubUser/myproject/ 
├── main.go 
└───package_name 
     └── whatever_name1.go 
     └── whatever_name2.go 

在你package main做到这一点:

import "github.com/GithubUser/myproject/package_name" 

哪里package_name是文件夹名称,它必须在文件中使用的包名称相匹配whatever_name1.go和whatever_name2.go。换句话说,所有带有子目录的文件应该是相同的包。

只要您指定导入中父文件夹的完整路径,就可以进一步嵌套更多子目录。

相关问题