我当前的目录结构如下所示:
App
- Template
- foo.go
- foo.tmpl
- Model
- bar.go
- Another
- Directory
- baz.go
文件
foo.go
在ParseFiles
期间使用init
读入模板文件。
import "text/template"
var qTemplate *template.Template
func init() {
qTemplate = template.Must(template.New("temp").ParseFiles("foo.tmpl"))
}
...
foo.go
的单元测试按预期工作。但是,我现在正在尝试对 bar.go
和 baz.go
运行单元测试,它们都导入 foo.go
,并且在尝试打开 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.go
或 baz.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")
)