是否可以禁止导入具有多个独立模块的模块(mono-repo)?
Is it possible to dis-allow import of module (mono-repo), having multiple independent modules?
我基本上拥有的是一个单存储库,它在根级别没有 go.mod
。这个 mono-repo 中有多个目录,每个目录都有自己的 go.mod
文件。我将它们称为 sub-modules
.
现在,我找到了一种能够在完全不同的代码库中独立(版本化)访问子模块的方法。我现在面临的问题是,要禁止导入整个 mono-repo,使用:
go get link.to/mono-repo@commit_id
------> A
并且只允许导入使用:
go get link.to/mono-repo/sub_mod1@v0.x.y
go get link.to/mono-repo/sub_mod2@v0.y.z
命令A
可以获取整个repo,然后可以用来访问内部模块。有什么办法可以阻止这种行为被允许吗?
我尝试了一些方法,例如:
- 在根级别的文件
noCompile.go
中添加了不可编译的代码。在 go get...
上打印了编译错误,但内部模块的使用仍然正常。
- 在同一
noCompile.go
文件中添加了一个 init()
函数,该函数仅调用 panic()
。这个 init 函数没有被执行,因为根目录永远不会被直接访问,只有内部模块是。
有什么方法可以达到我的目的吗?
任何包含自己的 go.mod
文件的目录都被排除在父目录的模块之外。所以如果你go get link.to/mono-repo@commit_id
,那应该不包含包link.to/mono-repo/sub_mod1
或link.to/mono-repo/sub_mod2
(假设它们存在并且有自己的go.mod
文件)。
我怀疑您正在观察像 import "link.to/mono-repo/sub_mod2/some/package/here"
这样的导入来解析不是因为最初的 go get
,而是因为 go
命令正在解析丢失的导入(并添加缺少依赖项)自动;参见 https://golang.org/ref/mod#go-mod-file-updates。
从 Go 1.16(今天发布!)开始,大多数 go
命令不再隐式修改 go.mod
文件,因此 repo root 中的模块不包含的内容嵌套模块应该更清晰。
我基本上拥有的是一个单存储库,它在根级别没有 go.mod
。这个 mono-repo 中有多个目录,每个目录都有自己的 go.mod
文件。我将它们称为 sub-modules
.
现在,我找到了一种能够在完全不同的代码库中独立(版本化)访问子模块的方法。我现在面临的问题是,要禁止导入整个 mono-repo,使用:
go get link.to/mono-repo@commit_id
------> A
并且只允许导入使用:
go get link.to/mono-repo/sub_mod1@v0.x.y
go get link.to/mono-repo/sub_mod2@v0.y.z
命令A
可以获取整个repo,然后可以用来访问内部模块。有什么办法可以阻止这种行为被允许吗?
我尝试了一些方法,例如:
- 在根级别的文件
noCompile.go
中添加了不可编译的代码。在go get...
上打印了编译错误,但内部模块的使用仍然正常。 - 在同一
noCompile.go
文件中添加了一个init()
函数,该函数仅调用panic()
。这个 init 函数没有被执行,因为根目录永远不会被直接访问,只有内部模块是。
有什么方法可以达到我的目的吗?
任何包含自己的 go.mod
文件的目录都被排除在父目录的模块之外。所以如果你go get link.to/mono-repo@commit_id
,那应该不包含包link.to/mono-repo/sub_mod1
或link.to/mono-repo/sub_mod2
(假设它们存在并且有自己的go.mod
文件)。
我怀疑您正在观察像 import "link.to/mono-repo/sub_mod2/some/package/here"
这样的导入来解析不是因为最初的 go get
,而是因为 go
命令正在解析丢失的导入(并添加缺少依赖项)自动;参见 https://golang.org/ref/mod#go-mod-file-updates。
从 Go 1.16(今天发布!)开始,大多数 go
命令不再隐式修改 go.mod
文件,因此 repo root 中的模块不包含的内容嵌套模块应该更清晰。