Go: Angabe von template-Dateinamen für die Vorlage.ParseFiles
Meine aktuellen Verzeichnis-Struktur sieht wie folgt aus:
App
- Template
- foo.go
- foo.tmpl
- Model
- bar.go
- Another
- Directory
- baz.go
Die Datei foo.go
verwendet ParseFiles
zu Lesen in der Vorlage-Datei während der init
.
import "text/template"
var qTemplate *template.Template
func init() {
qTemplate = template.Must(template.New("temp").ParseFiles("foo.tmpl"))
}
...
Unit-tests für foo.go
wie erwartet funktionieren. Allerdings versuche ich jetzt, um unit-tests für bar.go
und baz.go
die sowohl importieren als foo.go
und ich bekomme Panik beim Versuch Sie zu öffnen foo.tmpl
.
/App/Model$ go test
panic: open foo.tmpl: no such file or directory
/App/Another/Directory$ go test
panic: open foo.tmpl: no such file or directory
Ich habe versucht, die Angabe des template-namens als relative Verzeichnis ("./foo.tmpl"), ein vollständiges Verzeichnis ("~/go/src/github.com/App/Template/foo.tmpl"), eine App relative Verzeichnis ("/App/Template/foo.tmpl"), und andere, aber nichts scheint zu funktionieren für beide Fälle. Die unit-tests fehlschlagen, entweder bar.go
oder baz.go
(oder beides).
Wo soll ich meine template-Datei platziert werden, und wie soll ich das nennen ParseFiles
so dass Sie immer finden Sie die Vorlage-Datei, egal in welchem Verzeichnis ich nenne go test
aus?
- Kannst du ein klares Beispiel von dem, was Sie sind versuchen zu tun? Ich habe versucht
ParseFiles("../Template/foo.tmpl")
ausModel
und es funktioniert Prima. - Aber wenn ich versuche zu laufen
go test
in einem tieferen Verzeichnis funktioniert Sie nicht mehr wieder. Von dem, was ich kann herausfinden,go test
setzt immer das aktuelle Arbeitsverzeichnis und dannParseFiles
verwendet diese als Basis-Verzeichnis finden Sie Vorlagen, anstatt dass es relativ zu der Datei, die nenntParseFiles
. Dieser ist sehr zerbrechlich, so dass ich vermute, ich muss etwas falsch machen. - Ich aktualisiert meine Frage, um zu zeigen, das problem ich bin mit in.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hilfreicher Tipp:
Verwenden
os.Getwd()
undfilepath.Join()
zu finden, die den absoluten Pfad zu einem relativen Pfad.Beispiel
First off, ich empfehlen, dass die
template
Ordner enthalten nur Vorlagen für die Präsentation und nicht die Dateien.Nächsten, das Leben leichter zu machen, nur ausführen, Dateien aus dem root-Verzeichnis der Projekte. Dies wird helfen, stellen Sie den Pfad zu einer Datei einheitlich gehen Dateien verschachtelt in Unterverzeichnissen. Relative Dateipfade beginnen, wo das aktuelle Arbeitsverzeichnis, in dem das Programm aufgerufen wurde, aus.
Beispiel zeigt die änderung im aktuellen Arbeitsverzeichnis
Als für test-Dateien Sie können einzelne Dateien testen, indem der Dateiname.
Schließlich, verwenden Sie ein Basis-Pfad und die
path/filepath
Paket zu bilden Dateipfade.Beispiel: