带git子模块的Vendoring 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.

目的是使go模块与静态文件存储库同步


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是否与本地文件系统中的一样是最新的?