带git子模块的Vendoring go模块
目的是使go模块与静态文件存储库同步带git子模块的Vendoring go模块,git,go,go-modules,Git,Go,Go Modules,目的是使go模块与静态文件存储库同步 internal - parser.go - static-file-repository/ 其中“parser.go”解析存储库中作为git子模块添加的静态文件 在此之前,我已经找到了一种使用静态文件销售go模块的解决方法。添加go文件时,go模块将包含整个包 但是,当添加为git子模块时,go模块似乎不包括静态文件存储库 另一个注意事项是,当我将replace指令用于此存储库的本地路径时,其他包可以正确地使用它 为进一步解释情况: parser.
internal
- parser.go
- static-file-repository/
其中“parser.go”解析存储库中作为git子模块添加的静态文件
在此之前,我已经找到了一种使用静态文件销售go模块的解决方法。添加go文件时,go模块将包含整个包
但是,当添加为git子模块时,go模块似乎不包括静态文件存储库
另一个注意事项是,当我将replace指令用于此存储库的本地路径时,其他包可以正确地使用它
为进一步解释情况:
parser.go
将文件嵌入到静态文件存储库中
并充当Getter
。然后,如果另一个模块想要访问这些静态文件,它只需调用一个函数,如GetStaticFiles()
问题是,去吧
模式静态文件存储库未找到匹配的文件
我确信嵌入的路径、命名、使用等,因为我们在整个项目的多个地方都在使用它
编辑3:
问题不在于如何嵌入文件,我知道这是因为正如我所说的,用本地版本替换模块很好。问题是go模块不提供git子模块。当我使用本地替换时,我可以在外部库中看到静态文件存储库,并且一切正常。
但是,当使用相同的代码时,在go模块上,该存储库消失了。通过使用go 1.16嵌入功能,您似乎可以实现您想要的
在parser.go
(或与静态文件目录/子模块相同级别的另一个文件)中添加一个嵌入内容的变量:
package internal
import "embed"
//go:embed static-file-repository
var StaticFiles embed.FS
请注意,go:embed
指令中的此目录模式不会嵌入名称以
或开头的文件。如果您也需要,可以作为静态文件存储库/*
嵌入
然后,此模块中的其他软件包将能够从中访问文件:
f, err := internal.StaticFiles.Open("static-file-repository/foo/bar/stuff.png")
请考虑,如果在内部
包中声明嵌入的资产,则即使导出了名称,它在其自身模块之外也不可用。因此,要实际提供静态文件,您可能需要重命名内部包,或者公开访问它的非内部包中的函数:
package static
import "mymodule/internal"
func Get(filename string) (fs.File, error) {
return internal.StaticFiles.Open("static-file-repository/"+filename)
}
我不太清楚你在问什么。您是否在询问如何将主go模块(包括parser.go
)与静态repo的内容一起分发?@blackgreen Yeapa编辑3后,我想我了解您的问题所在。Go的Git子模块没有什么特别之处,只是项目中的一个目录。当您使用本地替换时,这一切都会起作用,因为您正在从文件系统中的某个位置导入文件,而这正是您所设置的。相反,作为非本地go模块,它是从(可能)远程服务器导入的,其中git子模块目录可能不是最新的。您是否检查了您导入的go模块版本的git subdir是否与本地文件系统中的一样是最新的?