我试图在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
但这显然非常笨拙,取决于个人设置,所以这不会起作用。一般来说,如果我想引用外部包中的文件而不是我的内部项目目录,我将如何优雅地执行此操作?
谢谢!
答案 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这样的东西。
但我真的认为你应该重新考虑你的问题,并采用不同的方法。