Проблема заключается в том, что я не могу добраться до файла относительно пути пакета, где он действительно используется. Рассмотрим пример. У меня есть следующая структура:Как получить путь к файлу относительно пути импортированного пакета?
~/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
решает путь относительно вступления а не сам пакет. Что я не так?
@BravadaZadada, гм ... хорошо. Следующее работает как ожидалось: 'pck, err: = build.Import (" github.com/user/dbms "," ", build.FindOnly); fmt.Println (pck.Dir, err) '. Похоже, 'build.Import (..)' немного сложнее использовать его только для разрешения каталога пакета. Есть ли более простые способы сделать то же самое? Если это единственный способ - ответьте, я соглашусь. –