dqdz6464 2015-07-08 07:19
浏览 98
已采纳

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

The problem is I can't reach the file relative to the package path where it is actual used. Let's consider the example. I have the following structure:

~/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()
}

As you can see dbms.Path resolves path relative to the entry point and not package itself. What do I wrong?

  • 写回答

2条回答 默认 最新

  • duannao3819 2015-07-08 10:20
    关注

    The issue is that your database file will not be a part of the compiled binary. It seems you are expecting it to be packaged with your binary when you run your code.

    I think you should reconsider your approach. Your source code will be compiled into a static binary to be ran, but that binary will not include your database file. You are going to have a bad time trying to guess the correct path reliably.

    I would move the path to your database file into a configuration param, either in a config file that is required to be in the current working directory at runtime, or as an environment variable. Then, pull the database file out of the package directory, since it won't be helping you by being there.

    As far as getting the file initially at runtime, you could just add a setup function that will scaffold your database as appropriate. Or, if you are expecting some preloaded data in the database, just ship it in a package with the final binary and config file.

    Hope that helps!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值