在我的Go项目中,我想将一些通用功能分解为Go模块,与主项目分开.我在GOPATH之外这样做是为了与go的未来保持一致.我不想在GitHub或其他任何地方发布模块.
我将此模块导入主项目的所有尝试都会导致:
cannot find module for path X
Run Code Online (Sandbox Code Playgroud)
我已经go mod init X在模块的文件夹中运行了.其go.mod文件的内容是:
module X
Run Code Online (Sandbox Code Playgroud)
构建或安装此模块似乎什么都不做.我没有发现它的迹象$GOPATH/pgk/mod.
我尝试了各种import语句:
import "X"import "../x" (模块目录的相对路径)import "../x/X" (目录+模块名称的路径)救命!
Cso*_*mai 13
如果您不想使用 Go 模块,则不需要。从 Go v1.13 开始,默认使用 go 模块。因此,如果您不想这样做,您需要明确告知。
例子:
main.go:
package main
import (
"fmt"
"./pakk"
)
func main() {
fmt.Println("Hello" + pakk.World())
}
Run Code Online (Sandbox Code Playgroud)
帕克/pakk.go:
package pakk
func World() string {
return " world"
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,运行go run main.go将输出
build command-line-arguments: cannot find module for path .../pakk
Run Code Online (Sandbox Code Playgroud)
但运行
GO111MODULE=off go run main.go
Run Code Online (Sandbox Code Playgroud)
将输出
Hello world
Run Code Online (Sandbox Code Playgroud)
Ham*_*nis 12
所以你写了一个Go"library"模块:
使用该
replace指令来解决此问题.
给定模块名称"X",在主模块中添加以下行:
require "X" v0.0.0
replace "X" v0.0.0 => "{local path to the X module}"
Run Code Online (Sandbox Code Playgroud)
路径应指向模块的根目录,可以是绝对路径或相对路径.
要从模块X导入package util:
import "X/util"
Run Code Online (Sandbox Code Playgroud)
(您不导入模块.您从模块导入包.)
Go的模块功能专为公开发布的模块而设计.通常,模块的名称既是其唯一标识符,也是其公共存储库的路径.当go.mod使用该require指令声明模块依赖时,Go将自动在该路径中查找并检索模块的指定版本.
(另请参阅Go Modules FAQ,我可以在本地文件系统上完全在VCS之外工作吗?)
例如,如果您的go.mod文件包含require github.com/some/dependency v1.2.3,Go将从该路径的GitHub检索模块.但如果它包含require X v0.0.0,"X"不是实际路径,您将得到错误cannot find module for path X.
该replace指令允许您为给定的模块标识符和版本指定替换路径.您需要执行此操作的原因有很多,例如在将模块推送到公共存储库之前测试模块的更改.但您也可以使用它将模块标识符绑定到您不打算发布的本地代码.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
2776 次 |
| 最近记录: |