Golang无法在外部包中看到模板

时间:2014-08-01 18:30:49

标签: file templates go package external

我试图在Go中编写一个可重用的包。我使用的结构类似于here所描述的结构,但略有不同:

/src/bitbucket.org/EXTERNAL_PROJECT_NAME/EXTERNAL_PACKAGE_NAME/...
/src/INTERNAL_PROJECT_NAME/INTERNAL_PACKAGE_NAME/...

或者第二行应该是:

/src/bitbucket.org/INTERNAL_PROJECT_NAME/INTERNAL_PACKAGE_NAME/...

一切正常,直到我需要访问外部包中存在的非go文件。例如,我有一些我希望可用的内置模板,而不必将它们包含在我的内部项目模板目录中。

为此,我在外部项目中有一个“模板”目录,我希望在我的内部项目中包含一些内置模板和一个“模板”目录,自定义模板将在该目录中运行。但是当我尝试从外部项目模板目录解析模板时,它找不到它们。

那么我该如何表示我想从外部包目录而不是内部目录中获取模板?我可以调整路径,如下所示:

../../bitbucket.org/EXTERNAL_PROJECT_NAME/EXTERNAL_PACKAGE_NAME/templates/file.html

但这显然非常笨拙,取决于个人设置,所以这不会起作用。一般来说,如果我想引用外部包中的文件而不是我的内部项目目录,我将如何优雅地执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:2)

原来有一个非常简单的解决方案。看起来如下:

package main

import (
    "bitbucket.org/EXTERNAL_PROJECT/EXTERNAL_PACKAGE"
    "go/build"
)

func main() {
    SrcRoot := "/src"
    PackageDir := "/bitbucket.org/EXTERNAL_PROJECT/EXTERNAL_PACKAGE"
    InternalTemplateDir := build.Default.GOPATH + SrcRoot + PackageDir + "/templates/"
}

GOROOT这里为我们提供了包含所有go代码的目录的路径。从那里,我想引用包源中的templates目录。使用InternalTemplateDir,我现在可以在外部包中引用模板的基本路径。

为了便于使用,我可能会构建一个模板加载器,首先在内部文件路径上检查文件,然后在外部包中检查相同的文件,以便通过在内部包含它来覆盖任何给定的模板,但基本模板也都有内置版本。

答案 1 :(得分:0)

如果它不是Go套餐(又名bitbucket.org/EXTERNAL_PROJECT_NAME/EXTERNAL_PACKAGE_NAME/file.go)它不会起作用,最好打赌像https://github.com/jteeuwen/go-bindata这样的东西。

但我真的认为你应该重新考虑你的问题,并采用不同的方法。