我使用过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"

其他回答

你可以使用replace

go mod init example.com/my/foo

foo / go.mod

module example.com/my/foo

go 1.14

replace example.com/my/bar => /path/to/bar

require example.com/my/bar v1.0.0

foo / main.go

package main
import "example.com/bar"

func main() {
    bar.MyFunc()
}

酒吧/ go.mod

module github.com/my/bar

go 1.14

酒吧/ fn.go

package github.com/my/bar

import "fmt"

func MyFunc() {
    fmt.Printf("hello")
}

导入本地包就像导入外部包一样

除了在里面走。Mod文件将外部包名称替换为本地文件夹。

文件夹的路径可以是完整的或相对的/path/to/bar或../bar

https://github.com/golang/go/wiki/Modules#when-should-i-use-the-replace-directive https://thewebivore.com/using-replace-in-go-mod-to-point-to-your-local-module/

Run:

go mod init yellow

然后创建一个文件yellow.go:

package yellow

func Mix(s string) string {
   return s + "Yellow"
}

然后创建一个文件orange/orange.go:

package main
import "yellow"

func main() {
   s := yellow.Mix("Red")
   println(s)
}

然后构建:

go build

https://golang.org/doc/code.html

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

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

在你的包main中这样做:

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

其中package_name是文件夹名,它必须与whatever_name1文件中使用的包名匹配。Go和whatever_name . Go。换句话说,带有子目录的所有文件应该属于同一个包。

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

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,这是支持相对进口的唯一原因。