2013-09-26 13 views
10

Benim şu anki dizin yapısı aşağıdaki gibidir:Git: template.ParseFiles için şablon dosya belirtme

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

dosya foo.goinit sırasında şablon dosyasında okumak için ParseFiles kullanır.

import "text/template" 

var qTemplate *template.Template 

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

... 

foo.go için birim testleri beklendiği gibi çalışır. Ancak, bar.go ve baz.go için her ikisi de foo.go'u aldığım ve foo.tmpl'u açmaya çalışırken panik aldığım için birim testleri çalıştırmaya çalışıyorum.

/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 

Bir göreli dizin olarak (" ./foo.tmpl "), tam bir dizin (şablon adı belirterek denedim" ~/go/src/github.com/Uygulama/Şablon/foo. tmpl "), bir uygulama göreli dizini (" /App/Template/foo.tmpl ") ve diğerleri ancak hiçbir şey her iki durumda da işe yaramaz. Birim testleri ya bar.go ya da baz.go (ya da her ikisi) için başarısız.

Şablon dosyam nerede yerleştirmeli ve ParseFiles numaralı telefonu nasıl arayayım? Bu nedenle, şablon dosyasını her zaman go test olarak adlandırdığım dizinden bağımsız olarak bulabilirim?

+0

sen ne yapmaya çalışıyorsun ne açık bir örneğini gönderebilir miyim? 'Model' den ParseFiles ("../ Template/foo.tmpl") 'i denedim ve gayet iyi çalışıyor. – creack

+0

Ama daha derin bir dizinde 'go test 'çalıştırmaya çalışırsam, artık tekrar çalışmayacak. Anlayabildiğim kadarıyla, "git testi" her zaman geçerli çalışma dizinini ayarlar ve sonra ParseFiles, bunu "ParseFiles" olarak adlandırılan dosyaya göre değil, şablon bulmak için temel dizin olarak kullanır. Bu çok kırılgan, bu yüzden yanlış bir şey yapmam gerektiğini düşünüyorum. – Bill

+0

Çalıştığım sorunu göstermek için sorumu güncelledim. – Bill

cevap

11

Yardımcı ipucu:

Kullanım os.Getwd() ve filepath.Join() göreli bir dosya yolu mutlak yolu bulmak için.

Örnek

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

Öncelikle, ben template klasörü yalnızca sunum için şablonları içeren ve dosyaları gitmez önerilir.

Daha sonra, hayatı kolaylaştırmak için yalnızca kök proje dizinindeki dosyaları çalıştırın. Bu, alt dizinler içinde iç içe geçmiş dosyalarda tutarlı bir dosyaya yol açmaya yardımcı olur. Göreceli dosya yolları, programın çağrıldığı mevcut çalışma dizininden başlar.

Örnek testi dosyaları gelince

[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 

, dosya adı girerek tek tek test dosyaları çalıştırabilirsiniz geçerli çalışma dizini değişikliğini göstermek için.

go test foo/foo_test.go 

Son olarak, dosya yollarını oluşturmak üzere bir taban yolu ve path/filepath paketi kullanmak.

Örnek:

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