2013-09-26 16 views
10

Meine aktuelle Verzeichnisstruktur sieht wie folgt aus:Go: Die Angabe Vorlage Dateinamen für template.ParseFiles

App 
    - Template 
    - foo.go 
    - foo.tmpl 
    - Model 
    - bar.go 
    - Another 
    - Directory 
     - baz.go 

Die Datei foo.goParseFiles verwendet in der Vorlagendatei während init zu lesen.

import "text/template" 

var qTemplate *template.Template 

func init() { 
    qTemplate = template.Must(template.New("temp").ParseFiles("foo.tmpl")) 
} 

... 

Unit-Tests für foo.go Arbeit wie erwartet. Jedoch versuche ich jetzt Unit-Tests für bar.go und baz.go zu starten, die beide foo.go importieren und ich bekomme eine Panik beim Versuch, foo.tmpl zu öffnen.

/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 Vorlagennamen als relatives Verzeichnis Angabe (“./foo.tmpl "), ein Full-Verzeichnis (" ~/go/src/github.com/App/Template/foo. tmpl "), ein relatives App-Verzeichnis (" /App/Template/foo.tmpl ") und andere, aber nichts scheint für beide Fälle zu funktionieren. Die Komponententests schlagen entweder für bar.go oder baz.go (oder beides) fehl.

Wo sollte meine Vorlagendatei platziert werden und wie soll ich ParseFiles aufrufen, so dass es immer die Vorlagendatei finden kann, unabhängig davon, welches Verzeichnis ich go test aufrufen?

+0

Können Sie ein klares Beispiel nach, was Sie zu tun versuchen? Ich habe 'ParseFiles (" ../ Template/foo.tmpl ") von' Model' ausprobiert und es funktioniert gut. – creack

+0

Aber wenn ich versuche, go go test in einem tieferen Verzeichnis auszuführen, funktioniert es nicht mehr. Von dem, was ich herausfinden kann, setzt 'go test' immer das aktuelle Arbeitsverzeichnis und dann' ParseFiles' verwendet dieses als das Basisverzeichnis, um Vorlagen zu finden, anstatt relativ zu der Datei zu sein, die 'ParseFiles' aufruft. Das ist sehr fragil, also muss ich etwas falsch machen. – Bill

+0

Ich habe meine Frage aktualisiert, um das Problem zu zeigen, auf das ich gestoßen bin. – Bill

Antwort

11

Hilfreicher Tipp:

Verwenden os.Getwd() und filepath.Join() den absoluten Pfad eines relativen Dateipfad zu finden.

Beispiel

// File: showPath.go 
package main 
import (
     "fmt" 
     "path/filepath" 
     "os" 
) 
func main(){ 
     cwd, _ := os.Getwd() 
     fmt.Println(filepath.Join(cwd, "./template/index.gtpl")) 
} 

Zunächst einmal, ich empfehle, dass die template Ordner nur Vorlagen für die Präsentation enthalten und keine Dateien gehen.

Als nächstes, um das Leben einfacher zu machen, führen Sie nur Dateien aus dem Stammverzeichnis des Projekts. Dies wird dazu beitragen, den Pfad zu einer Datei konsistent zu machen, indem Dateien in Unterverzeichnissen verschachtelt werden. Relative Dateipfade beginnen dort, wo das aktuelle Arbeitsverzeichnis liegt, von wo aus das Programm aufgerufen wurde.

Beispiel die Änderung der aktuellen Arbeitsverzeichnis

[email protected]:~/go/src/test$ go run showPath.go 
/home/user/go/src/test/template/index.gtpl 
[email protected]:~/go/src/test$ cd newFolder/ 
[email protected]:~/go/src/test/newFolder$ go run ../showPath.go 
/home/user/go/src/test/newFolder/template/index.gtpl 

Wie für Testdateien zeigen, können Sie, indem Sie den Dateinamen einzelnen Testdateien ausführen.

go test foo/foo_test.go 

Schließlich verwenden, um einen Basispfad und das Paket path/filepath Dateipfade zu bilden.

Beispiel:

var (
    basePath = "./public" 
    templatePath = filepath.Join(basePath, "template") 
    indexFile = filepath.Join(templatePath, "index.gtpl") 
) 
Verwandte Themen