我正在尝试在Go中编写一个可重用的包。我使用的结构类似于描述的这里,但略有不同:
/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但这显然是非常笨拙的,并取决于个人设置,所以这是行不通的。一般来说,如果我想在外部包中引用一个文件,而不是我的内部项目目录,我应该如何优雅地这样做呢?
谢谢!
发布于 2014-08-04 13:58:37
结果发现有一个非常简单的解决方案。如下所示:
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代码的目录的路径。从那里,我想引用包源代码中的模板目录。使用InternalTemplateDir,我现在有了在外部包中引用模板的基本路径。
为了便于使用,我可能会构建一个模板加载器,它首先检查内部文件路径上的文件,然后在外部包中检查同一个文件,这样任何给定的模板都可以通过内部包含它来覆盖,但是基本模板也都有版本。
发布于 2014-08-02 01:10:46
如果它不是一个围棋包(又名bitbucket.org/EXTERNAL_PROJECT_NAME/EXTERNAL_PACKAGE_NAME/file.go),它是行不通的,你最好的选择是像https://github.com/jteeuwen/go-bindata这样的东西。
但我真的认为你应该重新思考你的问题,用另一种方法来解决它。
https://stackoverflow.com/questions/25086489
复制相似问题