gpt4 book ai didi

go - 为 template.ParseFiles 指定模板文件名

转载 作者:IT老高 更新时间:2023-10-28 13:07:20 27 4
gpt4 key购买 nike

我当前的目录结构如下:

App
- Template
- foo.go
- foo.tmpl
- Model
- bar.go
- Another
- Directory
- baz.go

foo.go 文件在 init 期间使用 ParseFiles 读取模板文件。

import "text/template"

var qTemplate *template.Template

func init() {
qTemplate = template.Must(template.New("temp").ParseFiles("foo.tmpl"))
}

...

foo.go 的单元测试按预期工作。但是,我现在正在尝试为 bar.gobaz.go 运行单元测试,它们都导入 foo.go 并且我感到 panic 在尝试打开 foo.tmpl.

/App/Model$ go test    
panic: open foo.tmpl: no such file or directory

/App/Another/Directory$ go test
panic: open foo.tmpl: no such file or directory

我尝试将模板名称指定为相对目录(“./foo.tmpl”)、完整目录(“~/go/src/github.com/App/Template/foo.tmpl”)、应用程序相关目录(“/App/Template/foo.tmpl”)和其他目录,但似乎对这两种情况都不起作用。 bar.gobaz.go(或两者)的单元测试失败。

我的模板文件应该放在哪里以及我应该如何调用 ParseFiles 以便无论我从哪个目录调用 go test 都能找到模板文件?

最佳答案

实用提示:

使用 os.Getwd()filepath.Join() 查找相对文件路径的绝对路径。

例子

// File: showPath.go
package main
import (
"fmt"
"path/filepath"
"os"
)
func main(){
cwd, _ := os.Getwd()
fmt.Println( filepath.Join( cwd, "./template/index.gtpl" ) )
}

首先,我建议 template 文件夹只包含演示模板,而不包含 go 文件。

接下来,为了让生活更轻松,只运行根项目目录中的文件。这将有助于使文件的路径在嵌套在子目录中的 go 文件中保持一致。相对文件路径从当前工作目录开始,也就是调用程序的位置。

显示当前工作目录更改的示例

user@user:~/go/src/test$ go run showPath.go
/home/user/go/src/test/template/index.gtpl
user@user:~/go/src/test$ cd newFolder/
user@user:~/go/src/test/newFolder$ go run ../showPath.go
/home/user/go/src/test/newFolder/template/index.gtpl

对于测试文件,您可以通过提供文件名来运行单个测试文件。

go test foo/foo_test.go

最后,使用基本路径和 path/filepath 包来形成文件路径。

例子:

var (
basePath = "./public"
templatePath = filepath.Join(basePath, "template")
indexFile = filepath.Join(templatePath, "index.gtpl")
)

关于go - 为 template.ParseFiles 指定模板文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19035187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com