我使用过GOPATH,但对于目前我面临的这个问题,它没有帮助。我希望能够创建特定于项目的包:
myproject/
├── binary1.go
├── binary2.go
├── package1.go
└── package2.go
我尝试了多种方法,但我怎么得到package1 ?在二进制中工作。Go或者binary2。等等?
例如;我希望能够导入“package1”,然后能够运行去构建binary1。go,一切正常工作,而不会抛出在GOROOT或GOPATH上找不到包的错误。我需要这种功能的原因是大型项目;我不想引用多个其他包或将它们保存在一个大文件中。
Go依赖项管理总结:
Vgo,如果你的go版本是:x >= go 1.11
Dep或供应商,如果你的go版本是:go 1.6 >= x < go 1.11
如果你的go版本是:x < go 1.6,则手动操作
编辑3:Go 1.11有一个功能vgo将取代dep。
要使用vgo,请参阅模块文档。TLDR如下:
export GO111MODULE=on
go mod init
go mod vendor # if you have vendor/ folder, will automatically integrate
go build
这个方法创建一个名为go的文件。在项目目录中进行修改。然后,您可以使用go build构建您的项目。如果设置了GO111MODULE=auto,那么你的项目不能在$GOPATH中。
编辑2:自动售货方法仍然有效,没有问题。Vendor很大程度上是一个手动过程,因为这个dep和vgo被创建了。
编辑1:虽然我以前的方法有效,但它不再是“正确”的方法了。你应该使用Go 1.6中默认启用的供应商功能,vgo或dep(目前);看到的。你基本上是在供应商目录中添加你的“外部”或“依赖”包;编译时,编译器将首先使用这些包。
发现。我可以通过创建package1的子文件夹,然后用import导入,用GOPATH导入本地包。/package1”。去binary2。Go脚本如下:
binary1.go
...
import (
"./package1"
)
...
所以我的当前目录结构是这样的:
myproject/
├── binary1.go
├── binary2.go
├── package1/
│ └── package1.go
└── package2.go
我还应该注意到相对路径(至少在go 1.5中)也可以工作;例如:
import "../packageX"
没有所谓的“本地套餐”。磁盘上包的组织与包的任何父/子关系是正交的。包形成的唯一真正的层次结构是依赖树,在一般情况下它不反映目录树。
只使用
import "myproject/packageN"
不要无缘无故地反对构建系统。在任何重要的程序中,每次导入都保存十几个字符不是一个好理由,因为,例如,具有相对导入路径的项目是不容易获得的。
导入路径的概念有一些重要的属性:
导入路径可以是全局唯一的。
结合GOPATH,导入路径可以明确地转换为目录路径。
GOPATH下的任何目录路径都可以明确地转换为导入路径。
使用相对导入路径会破坏上述所有功能。不要这样做。
PS:在Go编译器测试的遗留代码中,使用相对导入的地方很少。ATM,这是支持相对进口的唯一原因。
我有一个类似的问题,我目前使用的解决方案使用Go 1.11模块。我有如下结构
- projects
- go.mod
- go.sum
- project1
- main.go
- project2
- main.go
- package1
- lib.go
- package2
- lib.go
我能够从project1和project2导入package1和package2
import (
"projects/package1"
"projects/package2"
)
运行go mod init项目后。我可以使用从project1和project2目录构建或者我可以使用build -o project1/exe project1/*。从项目目录。
这种方法的缺点是你所有的项目最终都会在go.mod中共享相同的依赖项列表。我仍在寻找这个问题的解决方案,但它看起来可能是根本性的。
也许您正在尝试模块化您的包。我假设package1和package2在某种程度上是同一个包的一部分,但为了可读性,您将它们拆分为多个文件。
如果前面的案例是你的,你可以在这些多个文件中使用相同的包名,就像有相同的文件一样。
这是一个例子:
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
}
我不是围棋专家,这是我在stackoverflow的第一个帖子,所以如果你有一些建议,它会很受欢迎。