如何获取相对于导入包路径的文件路径?

问题是我无法访问相对于实际使用的包路径的文件。让我们考虑这个例子。我有以下结构:


~/go/src/github.com/user/dbms

  data/

    database.db

  dbms.go


~/projects/myproj/bin

  main.go

dbms.go :


package dbms


import (

  "os"

  "fmt"

  "path/filepath"

)


type dbms struct {

  filepath string

}


func New() *dbms {

  return &dbms{filepath: "./data/database.db"}

}


func (d *dbms) Run() {

  fmt.Println(filepath.Abs(d.Path))

  // output: /home/timur/projects/myproj/bin/data

  // I need: /home/timur/go/src/github.com/user/dbms/data

  file, err := os.OpenFile(d.filepath, os.O_RDWR, 0666)

  // error

}

main.go :


package main


import (

  "github.com/user/dbms"

)


func main() {

  db := dbms.New()

  db.Run()

}

如您所见,dbms.Path解析相对于入口点的路径而不是包本身。我怎么了?


慕妹3146593
浏览 173回答 2
2回答

不负相思意

问题是您的数据库文件将不是已编译二进制文件的一部分。当您运行代码时,您似乎希望它与二进制文件一起打包。我认为你应该重新考虑你的方法。您的源代码将被编译为要运行的静态二进制文件,但该二进制文件将不包含您的数据库文件。尝试可靠地猜测正确的路径会很麻烦。我会将数据库文件的路径移动到配置参数中,或者在运行时需要位于当前工作目录中的配置文件中,或者作为环境变量。然后,将数据库文件从包目录中拉出,因为它在那里不会帮助您。至于在运行时最初获取文件,您只需添加一个设置函数,该函数将根据需要为您的数据库提供支架。或者,如果您希望在数据库中有一些预加载的数据,只需将它与最终的二进制文件和配置文件放在一个包中即可。希望有帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go