如何解决“template: pattern matches no files”?

3

当我从非主要的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)
    }
}

3
很可能您在 templateFS 前面有一个不正确的 //go:embed 指令,这是您在答案中小心省略的。请展示一下。 - icza
2
你的templateFS是空的,因为你没有提供任何指令。在这里阅读有关指令的信息:https://pkg.go.dev/embed@go1.17.8 - mkopriva
1个回答

8

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

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

然而,go工具不会自动查找你想要包含在二进制文件中的文件和文件夹。它显然不会包括你源代码或模块文件夹中的所有内容。

告诉工具哪些文件要被包含是通过在你想要存储文件的变量前添加特殊的//go: embed注释来实现的。

因此,在你的情况下,你需要在templateFS变量之前放置以下注释:

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

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

import _ "embed"

更多细节请参考 embed 包文档。
相关问题请查看:如何在 Go 程序中打包静态资源?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接