如何解决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?
当我从除 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?