Golang не может использовать template.ParseFiles() из моей корзины (Revel)

Вот мой предыдущий пост Golang template.ParseFiles не является ошибкой каталога. У меня есть фрагмент:

root_path, err := osext.Executable()
if err != nil {
    return err
}
templates_path := root_path + "/app/views/mailtemplates/" + "feedback"
text_path := templates_path + ".txt"

textTmpl, err := template.ParseFiles(text_path)
if err != nil {
    return err
}

и следующая ошибка:

open /home/cnaize/gocode/bin/advorts/app/views/mailtemplates/feedback.txt: not a directory

Если я жестко запрограммирую:

templates_path := "/home/cnaize/" + "feedback"

все нормально. В чем проблема? Я пытался удалить свой бин, но это не помогло.

ОТРЕДАКТИРОВАНО: Мой env variables:

export GOROOT="/usr/local/go"
export GOPATH=$HOME/gocode
export PATH=$PATH:$GOROOT/bin
export PATH="$PATH:$GOPATH/bin"

и моя переменная PATH:

PATH=/home/cnaize/.rvm/gems/ruby-2.1.0/bin:/home/cnaize/.rvm/gems/ruby-2.1.0@global/bin:/home/cnaize/.rvm/rubies/ruby-2.1.0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/cnaize/.rvm/bin:/usr/local/go/bin:/home/cnaize/gocode/bin

person cnaize    schedule 15.07.2014    source источник
comment
Просто чтобы быть уверенным: какие-либо из папок /home/cnaize/gocode/bin/advorts/app/views/mailtemplates являются обычными каталогами? (нет проблем с разрешением, нет символической ссылки?)   -  person VonC    schedule 15.07.2014
comment
Кроме того, можете ли вы проверить, работает ли /home/cnaize/gocode/feedback.xxx? Если да, то /home/cnaize/gocode/bin/feedback.xxx. Если да, ... и так далее, чтобы определить, какая подпапка вызывает проблему.   -  person VonC    schedule 15.07.2014
comment
@VonC Я проверил эти места, все в порядке. что-то не так с моим бинарным файлом advorts. и интересная вещь: когда я проверяю наличие файла, он возвращает true. может быть что-то случилось, когда я переносил проект? где может быть проблема?   -  person cnaize    schedule 16.07.2014
comment
То есть /home/cnaize/gocode/bin/ работает, а /home/cnaize/gocode/bin/advorts/xxx нет?   -  person VonC    schedule 16.07.2014
comment
@VonC да, это так. странная вещь. Я пытался воссоздать проект и удалить свой файл advorts, но это тоже не работает   -  person cnaize    schedule 16.07.2014
comment
Где ваши источники? в 1_? На что ссылается GOPATH? /home/cnaize/gocode?   -  person VonC    schedule 16.07.2014
comment
@VonC да, где мои источники. Я обновил свой пост. может быть проблема в моей переменной PATH? как удалить мой путь Dropbox из переменной PATH?   -  person cnaize    schedule 16.07.2014
comment
простой export PATH=... (весь путь минус часть Dropbox) будет работать. Но я не думаю, что это проблема. Если вы сделаете go run в папке проекта src /home/cnaize/gocode/src/advorts/ (/src/ не /bin/), это сработает?   -  person VonC    schedule 16.07.2014
comment
@VonC /gocode/src/advorts$ go run advorts =› go run: no go files listed   -  person cnaize    schedule 16.07.2014
comment
Нет, просто запустите, он должен скомпилироваться и запуститься (если у вас есть хотя бы go файл в пакете main с функцией main). Это отличается от установки go, при которой исполняемый файл копируется в /home/cnaize/gocode/bin/advorts, где файлы ресурсов могут отсутствовать.   -  person VonC    schedule 16.07.2014
comment
@VonC /gocode/src/advorts$ go run =› go run: no go files listed. мой go version это go version go1.3 linux/amd64. как ресурсы справились с бинарником? на этапе компиляции? Я использую Revel, он генерирует мой файл main, а этот main.go находится в пути app/tmp/   -  person cnaize    schedule 16.07.2014
comment
Итак, вы не могли бы попробовать пробежаться по вашему app/tmp пути?   -  person VonC    schedule 16.07.2014
comment
@VonC /gocode/src/advorts/app/tmp$ go run =› go run: no go files listed   -  person cnaize    schedule 16.07.2014
comment
Хорошо, позвольте мне проверить Ревеля   -  person VonC    schedule 16.07.2014
comment
@VonC, как go run должен работать? Я только что создал простой файл main.go в ~/gocode/src/test и go run => go run: no go files listed   -  person cnaize    schedule 16.07.2014
comment
Интересно. И go run main.go? Я думаю, что go build (без указания любого файла go должен работать)   -  person VonC    schedule 16.07.2014
comment
@VonC go run main.go работает, а go build создает двоичный файл, который я могу запустить. что мне делать дальше? Я попытался запустить go build внутри своего /gocode/src/advorts/app/tmp, и он создал для меня файл tmp. Я думаю, это не то, что мне нужно   -  person cnaize    schedule 16.07.2014
comment
Когда вы говорите, что go build создает двоичный файл, который я могу запустить, вы имеете в виду, что не видите ошибку not a directory при запуске этого двоичного файла?   -  person VonC    schedule 16.07.2014
comment
Где находится ваш фрагмент в вашем приложении для показа? В контроллере, как в revel.github.io/tutorial/requestflow.html?   -  person VonC    schedule 16.07.2014
comment
@VonC нет, я не могу запустить свой двоичный файл tmp с ошибкой ERROR 2014/07/16 15:34:34 revel.go:256: GOPATH environment variable is not set. Please refer to http://golang.org/doc/code.html to configure your Go environment., не знаю почему   -  person cnaize    schedule 16.07.2014
comment
@VonC нет, мой фрагмент находится в app/lib/mytools.go, но я вызываю его из своего controller   -  person cnaize    schedule 16.07.2014
comment
Хорошо, тогда я буду следить за github.com/revel/revel/issues/666.   -  person VonC    schedule 16.07.2014
comment
@VonC, спасибо, я действительно не знаю, что с этим делать.   -  person cnaize    schedule 16.07.2014


Ответы (1)


Согласно вашему исправлению, правильным способом обращения к встроенному ресурсу templates/test.txt будет (используя filepath.Dir):

root_path, err := osext.Executable()
template_path := filepath.Join(filepath.Dir(root_path), "templates", "test")
text_path := template_path + ".txt"

Вы можете найти аналогичный подход в cmd/go/build.go для получения файлов пакета:

func (gccgoToolchain) pkgpath(basedir string, p *Package) string {
    end := filepath.FromSlash(p.ImportPath + ".a")
    afile := filepath.Join(basedir, end)
    // add "lib" to the final element
    return filepath.Join(filepath.Dir(afile), "lib"+filepath.Base(afile))
}
person VonC    schedule 24.07.2014