如何生成 embed.FS?

how to generate an embed.FS?

我有一个embed.FS,喜欢:

//go:embed static
var embedStatic embed.FS

我想(在启动时)通过 minifier 传递文件。我希望能够使用 embedStatic 上可用的相同文件创建内存中 fs.FS,但其内容已缩小。

我知道有外部库(如 Afero 和 MemFS),但我通常会尽量避免添加依赖项。

我也知道我可以通过创建一个新接口并实现我关心的所有方法来做到这一点(Open 用于 fs.FSReadDir 等...)我自己,但似乎我想做的一切都已经由 embed.FS 完成,除了文件的构建。

我的问题是:有没有办法在重新使用 embed.FS 的同时做到这一点?我可以即时创建 embed.FS 吗?

can see那个embed.FS有一个files *[]file,但它显然是私有的。我想知道是否有一种方法可以创建一个新类型并告诉 Go “假装这是正确创建的并将其用作 embed.FS”。

embed.FS 是一种用于读取嵌入二进制文件的特定实现 - 它不能用于在运行时构建的文件系统。

标准库中有一些 fs.FS 实现可能适用于您的用例。您可以将文件处理成:

  1. 临时文件系统目录并传递给os.DirFS
  2. 一个 in-memory ZIP 文件并使用 archive/zip.Reader 作为 fs.FS.
  3. testing/fstest.MapFS。这确实是为了测试,但它在那里..

就我个人而言,我会:

  • 在构建二进制文件和使用 embed.FS 之前通过 go generate 进行压缩。这可以提供更小的二进制文件,启动次数更少 time/memory。
  • 编写我自己的 fs.FS 或如果文件需要在运行时修改,则引入依赖项。代码不多