当前位置: 首页 > 知识库问答 >
问题:

如何在没有gopath的情况下导入本地包

景元徽
2023-03-14

我使用了GOPATH,但对于当前的问题,它没有帮助。我希望能够创建特定于项目的包:

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

我尝试了多种方法,但如何获得package1。进入二进制文件中工作1。转到二进制文件2。去等等?

例如;我希望能够导入“pack age1”,然后能够运行go buildbinary1.go,并且一切正常,不会抛出在GOROOTGOPATH上找不到包的错误。我需要这种功能的原因是用于大型项目;我不想引用多个其他包或将它们保存在一个大文件中。


共有3个答案

鲁城
2023-03-14

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

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

这是一个例子:

add.go

package math

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

减去

package math

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

什么都不做。去

package math

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

我不是围棋专家,这是我在StackOveflow上的第一篇帖子,所以如果你有一些建议,它会受到欢迎。

广绪
2023-03-14

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

使用

import "myproject/packageN"

不要无缘无故地与构建系统对抗。在任何非平凡的程序中,每次导入保存十几个字符都不是一个好理由,因为例如,具有相对导入路径的项目是不可获取的。

导入路径的概念有一些重要的属性:

  • 导入路径可以是全局唯一的
  • 结合GOPATH,导入路径可以明确地转换为目录路径
  • GOPATH下的任何目录路径都可以明确地转换为导入路径

使用相对导入路径,以上都毁了,不要做。

PS:在使用相对导入的Go编译器测试中,在遗留代码中几乎没有位置。ATM,这是支持相对导入的唯一原因。

江航
2023-03-14

Go依赖管理摘要:

  • vgo如果你的go版本是:x

编辑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:仇杀方法仍然有效并且没有问题。供应商在很大程度上是一个手动过程,因为depvgo被创建。

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

建立通过创建package1的子文件夹,然后在binary1中导入import./package1“,我可以用GOPATH导入本地包。转到二进制文件2。去这样的脚本:

二进制1。去

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

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

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

我还应该注意到相对路径(至少在go 1.5中)也有效;例如:

import "../packageX"
 类似资料:
  • 问题内容: 示例问题: 实体: 用户包含姓名和朋友列表(用户参考) 博客文章包含标题,内容,日期和作者(用户) 需求: 我想要一个显示标题的页面以及指向用户朋友的最近10篇博客的链接。我还希望能够通过较旧的条目继续进行分页。 SQL解决方案: 因此在sql land中,它将类似于: 我能想到的GAE解决方案是: 加载用户,循环浏览好友列表并加载其最新博客帖子。最后合并所有博客文章以查找最新的10个

  • 问题内容: 我已经习惯了,但是对于当前的问题,我没有用。我希望能够创建特定于项目的软件包: 我尝试了多种方法,但是如何在或等等上工作? 例如; 我希望能够然后能够运行,并且一切正常,而不会抛出无法在或找到包的错误。我需要这种功能的原因是针对大型项目。我不想引用多个其他软件包或将它们保存在一个大文件中。 问题答案: 转到依赖项管理摘要: 如果您使用的版本是: 或者您的go版本是: 如果您使用的版本是

  • 问题内容: 我正在尝试设置spring xml配置,而不必创建进一步的。但是,即使我将数据库属性包括在 spring.xml: 我在这里想念什么? 问题答案: 在entityManagerFactory bean定义中指定“ packagesToScan”和“ persistenceUnitName”属性。 请注意,这适用于Spring版本> 3.1

  • 问题内容: 我正在学习使用Selenium(v2.20)来领先一些 即将使用它创建浏览器测试的程序员。我想在 陷阱到达之前发现它们,而我却跌入了一个陷阱。 当我创建ChromeDriver时,它始终会弹出“ Google Chrome EULA”并 显示两个按钮:“接受并运行”和“取消”。因为我希望这是一个 自动化测试,所以让用户单击按钮是不可能的。 我查看了Chromium CommandSwi

  • 我已经安装了Android SDK最新版本和Eclipse。但我也想试试Android Studio。 我看过这个和这个帖子,但是那些解决方案改变了Android Studio(一旦下载并安装)使用的SDK实例。我想要的不是下载另一个SDK,当我已经在我的机器上安装了它。

  • 问题内容: 我有一个项目,必须将其部署到无法连接到Internet的客户端Windows系统。我目前在D:\ NODE中有一个文件夹,其中包含node.exe和npm.cmd以及一个node_modules文件夹。为了能够从命令行运行节点,我将D:\ NODE添加到PATH变量中。 我可以将大多数模块本地安装在项目的node_modules内部。但是,只有一个-节点窗口-需要全局安装才能运行。 按