2013-09-26 39 views
10

cấu trúc thư mục hiện tại của tôi trông giống như sau:Go: Chỉ định mẫu tên tập tin cho template.ParseFiles

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

File foo.go sử dụng ParseFiles để đọc trong file template trong init.

import "text/template" 

var qTemplate *template.Template 

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

... 

Kiểm tra đơn vị cho foo.go hoạt động như mong đợi. Tuy nhiên, tôi hiện đang cố gắng chạy thử nghiệm đơn vị cho bar.gobaz.go cả hai đều nhập foo.go và tôi cảm thấy hoảng sợ khi cố gắng mở 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 

tôi đã cố gắng xác định tên mẫu như một thư mục tương đối (" ./foo.tmpl "), một thư mục đầy đủ (" ~/đi/src/github.com/App/Template/foo. tmpl "), một thư mục tương đối ứng dụng (" /App/Template/foo.tmpl "), và những người khác nhưng không có gì có vẻ làm việc cho cả hai trường hợp. Các thử nghiệm đơn vị không thành công cho bar.go hoặc baz.go (hoặc cả hai).

Tệp mẫu của tôi nên được đặt ở đâu và làm cách nào để gọi ParseFiles để luôn có thể tìm tệp mẫu bất kể thư mục nào tôi gọi là go test từ?

+0

Bạn có thể gửi một ví dụ rõ ràng về những gì bạn đang cố gắng để làm gì? Tôi đã thử 'ParseFiles (" ../ Template/foo.tmpl ")' từ 'Model' và nó hoạt động tốt. – creack

+0

Nhưng nếu tôi cố chạy 'test test' trong một thư mục sâu hơn, nó không còn hoạt động nữa. Từ những gì tôi có thể tìm, 'go test' luôn đặt thư mục làm việc hiện tại và sau đó' ParseFiles' sử dụng thư mục cơ sở này để tìm các mẫu thay vì nó tương đối với tệp gọi là 'ParseFiles'. Điều này rất mỏng manh nên tôi nghĩ tôi phải làm điều gì đó sai. – Bill

+0

Tôi đã cập nhật câu hỏi của mình để hiển thị sự cố mà tôi đang gặp phải. – Bill

Trả lời

11

hữu ích tip:

Sử dụng os.Getwd()filepath.Join() để tìm đường dẫn tuyệt đối của một đường dẫn tập tin tương đối.

Ví dụ

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

Trước hết, tôi khuyên rằng thư mục template chỉ chứa mẫu để trình bày và không đi tập tin.

Tiếp theo, để giúp cuộc sống trở nên dễ dàng hơn, chỉ chạy các tệp từ thư mục dự án gốc. Điều này sẽ giúp làm cho đường dẫn đến một tập tin nhất quán trong suốt các tập tin đi lồng nhau trong thư mục con. Đường dẫn tệp tương đối bắt đầu từ nơi thư mục làm việc hiện tại, là nơi chương trình được gọi từ đó.

Ví dụ để cho thấy sự thay đổi trong thư mục làm việc hiện tại

[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 

Đối với các file kiểm tra, bạn có thể chạy các file kiểm tra cá nhân bằng cách cung cấp tên tập tin.

go test foo/foo_test.go 

Cuối cùng, sử dụng đường cơ sở và gói path/filepath để tạo đường dẫn tệp.

Ví dụ:

var (
    basePath = "./public" 
    templatePath = filepath.Join(basePath, "template") 
    indexFile = filepath.Join(templatePath, "index.gtpl") 
) 
Các vấn đề liên quan