2013-09-26 4 views
10

मेरे वर्तमान निर्देशिका संरचना ऐसा दिखाई देता है:जाओ: template.ParseFiles के लिए टेम्पलेट फ़ाइल नाम निर्दिष्ट करना

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

फ़ाइल foo.goParseFiles का उपयोग करता init दौरान टेम्पलेट फ़ाइल में पढ़ने के लिए।

import "text/template" 

var qTemplate *template.Template 

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

... 

foo.go के लिए यूनिट परीक्षण अपेक्षित काम करते हैं। हालांकि, अब मैं bar.go और baz.go के लिए यूनिट परीक्षण चलाने की कोशिश कर रहा हूं जो दोनों foo.go आयात करते हैं और मुझे 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 

मैं एक रिश्तेदार निर्देशिका के रूप में टेम्पलेट का नाम निर्दिष्ट ("./foo.tmpl"), एक पूर्ण निर्देशिका (की कोशिश की है "~/जाना/src/github.com/ऐप्स/खाका/foo। tmpl "), एक ऐप रिश्तेदार निर्देशिका (" /App/Template/foo.tmpl "), और अन्य लेकिन दोनों मामलों के लिए कुछ भी काम नहीं करता है। यूनिट परीक्षण bar.go या baz.go (या दोनों) के लिए विफल हो जाते हैं।

मेरी टेम्पलेट फ़ाइल कहां रखी जानी चाहिए और मुझे ParseFiles पर कॉल कैसे करना चाहिए ताकि यह हमेशा मुझे टेम्पलेट फ़ाइल मिल सके, चाहे मैं किस निर्देशिका से go test कहूं?

+0

आप आपको बस इतना करना कोशिश कर रहे हैं का एक स्पष्ट उदाहरण पोस्ट कर सकते हैं? मैंने 'मॉडल' से 'ParseFiles (" ../ Template/foo.tmpl ")' कोशिश की और यह ठीक काम करता है। – creack

+0

लेकिन अगर मैं गहरी निर्देशिका में 'परीक्षण करें' चलाने की कोशिश करता हूं तो यह अब फिर से काम नहीं करेगा। जो मैं समझ सकता हूं, 'परीक्षण करें' हमेशा मौजूदा कार्यशील निर्देशिका को सेट करता है और फिर 'पारसेफाइल' इसे 'पैरासेफाइल' नामक फ़ाइल के सापेक्ष होने के बजाय टेम्पलेट्स खोजने के लिए मूल निर्देशिका के रूप में उपयोग करता है। यह बहुत नाजुक है इसलिए मुझे लगता है कि मुझे कुछ गलत करना होगा। – Bill

+0

मैंने अपनी समस्या को अद्यतन करने के लिए अद्यतन किया है जिसमें मैं चल रहा हूं। – Bill

उत्तर

11

सहायक युक्ति:

उपयोग os.Getwd() और filepath.Join() एक रिश्तेदार फ़ाइल पथ का निरपेक्ष पथ खोजने के लिए।

उदाहरण

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

पहले, मेरा सुझाव है कि template फ़ोल्डर केवल प्रस्तुति के लिए टेम्प्लेट हो और फ़ाइलों को नहीं जाना।

अगला, जीवन को आसान बनाने के लिए, केवल रूट प्रोजेक्ट निर्देशिका से फ़ाइलें चलाएं। यह सब निर्देशिकाओं के भीतर घोंसला वाली फाइलों के दौरान एक फ़ाइल को लगातार बनाने में मदद करेगा। सापेक्ष फ़ाइल पथ वर्तमान कार्यशील निर्देशिका से शुरू होते हैं, जहां से प्रोग्राम कहलाता था।

उदाहरण वर्तमान कार्यशील निर्देशिका में परिवर्तन को दिखाने के लिए

[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 

परीक्षण फ़ाइलों के लिए के रूप में, आप फ़ाइल नाम की आपूर्ति करके अलग-अलग परीक्षण फ़ाइलें चला सकते हैं।

go test foo/foo_test.go 

अन्त में, फ़ाइल पथ बनाने के लिए एक आधार के पथ और path/filepath पैकेज का उपयोग करें।

उदाहरण:

var (
    basePath = "./public" 
    templatePath = filepath.Join(basePath, "template") 
    indexFile = filepath.Join(templatePath, "index.gtpl") 
) 
संबंधित मुद्दे