如何使用“模块”之外的模块;GOPATH“;在另一个模块中?

如何使用“模块”之外的模块;GOPATH“;在另一个模块中?,go,go-modules,Go,Go Modules,我已经在“数据库”文件夹中的“GOPATH”之外创建了一个库作为个人使用的模块,使用这个命令“go mod init database”,我不知道: 如何在其他模块中使用/导入此模块 OS:Windows 7,Go:v1.11最简单、最实用的现成解决方案是将您的数据库包/模块放入VCS(例如github.com),以便其他包(在其他模块内)可以通过如下方式导入来引用它: import "github.com/someone/database" 如果您这样做,您甚至不必手动摆弄go.mod文

我已经在“数据库”文件夹中的“GOPATH”之外创建了一个库作为个人使用的模块,使用这个命令“go mod init database”,我不知道:

  • 如何在其他模块中使用/导入此模块

OS:Windows 7,Go:v1.11

最简单、最实用的现成解决方案是将您的
数据库
包/模块放入VCS(例如github.com),以便其他包(在其他模块内)可以通过如下方式导入来引用它:

import "github.com/someone/database"
如果您这样做,您甚至不必手动摆弄
go.mod
文件,一切都将由go工具处理:它将自动识别并解决此依赖关系,下载并安装所需的软件包,还将自动更新
go.mod

完全保留在本地磁盘上 如果你不想使用VCS(例如,你只是在试验,或者你还没有决定使用什么),那么你仍然可以这样做。官方文件中详细说明了具体操作方法

因此,您在
GOPATH
之外创建了一个
数据库
文件夹,并在其中创建了一个模块。您创建了另一个模块,我们称之为
main
,您希望使用这个
数据库

你必须做的是:

  • main
    模块的
    go.mod
    必须将
    数据库
    包列为“要求”。为您的
    数据库
    包指定一个临时VCS名称:

    require (
        example.com/me/database v0.0.0
    )
    
  • 您必须告诉go工具这个包的位置,因为我们使用的完整包名只是一个临时/幻想的名称。使用
    replace
    指令使此
    数据库
    包指向本地磁盘上的文件夹;您可以使用绝对路径和相对路径:

    replace example.com/me/database => ../database
    
就这些

工作示例 让我们看一个工作示例。让我们创建一个
pretty
模块。创建一个包含2个文件的
pretty
文件夹:

漂亮。开始:

package pretty

import "fmt"

func Pretty(v ...interface{}) {
    fmt.Println(v...)
}
module main

require example.com/me/pretty v0.0.0

replace example.com/me/pretty => ../pretty
go.mod(可以通过运行
go mod init pretty
创建):

现在,让我们创建另一个主模块。让我们在
pretty
文件夹旁边创建一个文件夹
osif
(它可以是任何东西)。其中包含2个文件:

osif.go(注意我们打算使用我们的
pretty
包/模块,我们通过
“example.com/me/pretty”
导入它):

go.mod:

package pretty

import "fmt"

func Pretty(v ...interface{}) {
    fmt.Println(v...)
}
module main

require example.com/me/pretty v0.0.0

replace example.com/me/pretty => ../pretty
就这些

osif
文件夹中运行
go运行osif.go
,输出为:

hi
[1 3 5]
运行:

然后创建一个文件
黄色。转到

package yellow

func Mix(s string) string {
   return s + "Yellow"
}
package main
import "yellow"

func main() {
   s := yellow.Mix("Red")
   println(s)
}
然后创建一个文件
orange/orange.go

package yellow

func Mix(s string) string {
   return s + "Yellow"
}
package main
import "yellow"

func main() {
   s := yellow.Mix("Red")
   println(s)
}
然后构建:

go build

您可以按照mod.go文件中声明的包名导入它。请注意,您不能导入模块,只能导入包。还请注意,没有“本地”包的概念。包在gopath之外,因此go构建工具无法识别它,因此无法构建模块。GO111MODULE=on(GOPTH之外的默认值)的go 1.11可以在任何地方构建。你真的必须提供更多关于你的问题的细节。你没有。把它放在你的路径上。不要与工具抗争。不,这都是错的。您不是“构建模块”,而是构建包。mod只描述了模块的版本,以及(可选)模块中某个包导入的包是否需要特定版本
go build
将生成您的包,如果您的包想要导入“foo/bar”,则必须
导入“foo/bar”
。如果必须使用foo/bar v3.4.5:在go.mod中添加一行。只需运行go build。Go build将下载任何依赖项(通过查看导入语句)并生成。不用了,让我参与进来,非常感谢。这正是我所需要的。@samadadi您应该将答案标记为“已接受”,以给icza评分,并增加答案的可见性。看见