如何解决template: pattern matches no files

How to solve template: pattern matches no files

当我从除 main 之外的其他 go 文件访问文件时如何处理文件路径。

在 other.go 文件中,我正在尝试 运行 ParseFS,但它给出了模板:模式不匹配任何文件:templates/test.tmpl 错误。这是我的文件树。

├── go.mod
├── main
│   └── main.go
└── other
    ├── other.go
    └── templates
        └── test.tmpl

other/other.go

package other

import (
    "embed"
    "fmt"
    "html/template"
)

var templateFS embed.FS

func Check() error {
    _, err := template.New("email").ParseFS(templateFS, "templates/"+ "test.tmpl")

    if err != nil {
        fmt.Println(err)
    }
    return nil
}

main/main.go

func main() {
    err :=othher.Check()

    if err != nil {
        fmt.Println(err)
    }
}

Go 是一种静态链接语言。无论您编写什么源代码,最终 go 工具都会将其编译成可执行二进制文件。 运行 二进制文件之后不需要源文件。

embed 包为您提供了一种在可执行二进制文件中包含静态文件的方法,您可以在 运行 时访问这些文件(原始的包含文件不需要在您访问时出现) 运行 应用)。

但是,go 工具不会神奇地找出您要包含在二进制文件中的文件和文件夹。它显然不会包含您在源或模块文件夹中的所有内容。

告诉您要包​​含哪些文件的方法是在要存储文件的变量之前添加一个特殊的 //go:embed 注释。

因此,在您的情况下,您必须在 templateFS 变量之前添加以下注释:

//go:embed templates/*
var templateFS embed.FS

另请注意,嵌入仅在您导入 embed 包时有效。这种“自然”发生在您的情况下,因为您使用了 embed.FS 类型(这需要导入 embed 包),但是如果您将文件包含在 string[]byte 类型,不需要导入 embed,在这种情况下,您必须执行“空白”导入,如

import _ "embed"

更多详细信息在 embed.

的包文档中

参见相关问题:What's the best way to bundle static resources in a Go program?