13

我当前的目录结构如下所示:

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

该文件foo.go用于ParseFilesinit.

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 相对目录目录(“/App/Template/foo.tmpl”)和其他目录,但似乎对这两种情况都不起作用。单元测试中的一个bar.gobaz.go(或两个)都失败了。

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

4

1 回答 1

16

有用的提示:

使用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 文件中保持一致。相对文件路径从当前工作目录的位置开始,也就是调用程序的位置。

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

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")
) 
于 2013-12-06T05:55:37.277 回答