能否通过Go代码而非CLI生成Templ模板并自定义输出路径与文件名?
问题解答
1. 能否手动指定Templ生成文件的位置和文件名?
可以,Templ提供了两种灵活的控制方式:
- CLI命令参数:执行
templ generate时,通过--output(简写-o)参数指定全局输出目录,所有编译后的.go文件都会生成到该目录下。示例:templ generate --output ./generated/templates - 配置文件定制:在项目根目录创建
.templ.toml文件,可针对单个模板文件指定输出路径和文件名,覆盖默认规则。示例:
默认生成的文件名格式是[[templates]] source = "./views/layout.templ" output = "./custom/path/layout.go"原文件名_templ.go,通过配置文件可以直接自定义最终的文件名。
2. 手动编写代码解析并生成模板是否可行?
完全可行,Templ暴露了底层的编译API,允许你在自定义工具中完成模板解析、编译和输出的全流程。你的示例代码方向正确,补充完整逻辑后即可正常运行,参考实现如下:
import ( "os" "path/filepath" "github.com/a-h/templ/parser" "github.com/a-h/templ/generator" ) func CompileTemplate(source string, targetPath string) error { content, err := os.ReadFile(source) if err != nil { return err } // 解析模板内容 parsedTemplate, err := parser.Parse(source, string(content)) if err != nil { return err } // 生成Go代码,可通过generator.Options配置编译规则 generatedCode, err := generator.Generate(parsedTemplate, generator.Options{}) if err != nil { return err } // 构造目标文件路径 file := filepath.Base(source) ext := filepath.Ext(file) targetFile := file[:len(file)-len(ext)] + ".go" targetFilePath := filepath.Join(targetPath, targetFile) // 写入生成的代码到目标文件 err = os.WriteFile(targetFilePath, []byte(generatedCode), 0644) if err != nil { return err } return nil }
通过templ/parser和templ/generator包可以完成核心的解析与生成工作,generator.Options还支持配置代码格式化、注释添加等额外编译规则。
内容的提问来源于stack exchange,提问作者Yanick Rochon
相关产品推荐
相关产品推荐

