Warm tip: This article is reproduced from serverfault.com, please click

go-如何在不使用gopath的情况下导入本地软件包

(go - How to import local packages without gopath)

发布于 2013-07-09 03:28:54

我已经习惯了,GOPATH但是对于当前的问题,我没有用。我希望能够创建特定于项目的软件包:

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

我尝试了多种方法,但是如何package1.gobinary1.go上工作binary2.go,以此类推?

例如; 我希望能够import "package1"然后能够运行,go build binary1.go并且一切正常,而不会引发在GOROOT上找不到该软件包的错误GOPATH我之所以需要这种功能,是因为是大型项目。我不想引用多个其他软件包或将它们保存在一个大文件中。

Questioner
user1529891
Viewed
11
user1529891 2018-09-06 01:14:19

转到依赖项管理摘要:

  • vgo 如果你使用的版本是: x >= go 1.11
  • dep或者vendor你的go版本是:go 1.6 >= x < go 1.11
  • 如果你使用的版本是: 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.mod在你的项目目录中创建一个名为的文件然后,你可以使用构建项目go build如果GO111MODULE=auto设置为,则你的项目不能在中$GOPATH


编辑2:供应商方法仍然有效,并且可以正常工作。vendor主要是手动过程,因为这depvgo创建。


编辑1:虽然我的旧方法有效,但不再是“正确”的方法。你应使用Go 1.6中默认启用的供应商功能,vgodep(目前)。你基本上是在vendor目录中添加“外部”或“依赖”程序包在编译时,编译器将首先使用这些软件包。


成立。GOPATH通过创建的子文件夹,package1然后使用import "./package1"inbinary1.gobinary2.go脚本导入,可以导入本地包,如下所示:

binary1.go

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

因此,我当前的目录结构如下所示:

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

我还应该指出,相对路径(至少在go 1.5中)也有效;例如:

import "../packageX"