2015-07-09 12 views
8

मेरा प्रश्न एक दूसरे के साथ शुरू होता है, यहाँ से पूछा: Gulp: How to set dest folder relative to processed file (when using wildcards)?स्पष्टीकरण()

मैं एक ऐसी ही स्थिति है, जहां मैं एक प्रति मॉड्यूल आधार पर संकुचित संस्करण बनाने की जरूरत है। यही है, मैं

ui/test/one/script1.js 
ui/test/two/script2.js 

है और मैं तो मैं

ui/test/one/compressed/script1.js 
ui/test/two/compressed/script2.js 

साथ खत्म हो रहा घूंट कार्य निम्नलिखित है

gulp.task('test', function() { 
    return gulp.src('ui/test/**/*.js') 
     .pipe(gulp.dest(function(file) { 
      return path.join(path.dirname(file.path), 'compressed'); 
     })); 
}); 

हालांकि घूंट रिश्तेदार निर्देशिका में फ़ाइलों की प्रतिलिपि की आवश्यकता है , जब मैं इसे चलाता हूं, तो मैं

ui/test/one/compressed/one/script1.js 
ui/test/two/compressed/two/script2.js 
के साथ समाप्त होता है

मैं docs में देखते हैं, जहां यह कहते हैं

CWD - कार्यशील निर्देशिका फ़ोल्डर के सापेक्ष है निर्दिष्ट करें। आधार - cwd से संबंधित फ़ोल्डर निर्दिष्ट करें। डिफ़ॉल्ट वह जगह है जहां ग्लोब शुरू होता है। यह जब) .dest में बचत (

मैं कई प्रश्न हैं, विशेष रूप से के बारे में .src(), .dest() और पथ और फ़ाइल वस्तुओं फ़ाइल नाम निर्धारित करने के लिए प्रयोग किया जाता है। (यानी, मुझे यकीन है कि मेरा अंतिम लक्ष्य प्राप्त करने के अन्य तरीके हैं, यह प्रश्न विशेष रूप से ऊपर नमूना गल्प कोड के व्यवहार और उल्लेख किए गए कार्यों के व्यवहार के बारे में है, इसलिए मैं उनके व्यवहार और एपीआई को बेहतर ढंग से समझ सकता हूं।)

प्रश्न

  • जब डॉक्स कहते हैं कि "कार्यशील निर्देशिका फ़ोल्डर के सापेक्ष है" इस, क्या फ़ोल्डर है?
  • उसी नोट पर, this comment के संबंध में और दस्तावेज़ों में स्थान जहां यह कहता है "आधार - सीडब्ल्यूडी के सापेक्ष फ़ोल्डर निर्दिष्ट करें। डिफ़ॉल्ट वह जगह है जहां ग्लोब शुरू होता है" ग्लोब शुरू होता है "क्या मतलब है? 'ग्लोब' की मेरी समझ यह है कि यह पूरी स्ट्रिंग है, लेकिन क्या यह वास्तव में उस स्ट्रिंग के भीतर * चरित्र का मतलब है? तो some/folder/a/b/c/foo.js पर मौजूद फ़ाइल के साथ 'कुछ/फ़ोल्डर/**/*। जेएस' के लिए मुझे यकीन नहीं है कि आधार some/folder/, some/folder/a/, या some/folder/a/b/c/ है?
  • <where the glob begins> + '..' कहने का कोई तरीका है?
  • जहां मैं path.join (path.dirname (file.path), 'संपीड़ित' कह रहा हूं) मुझे लगता है कि C:\blah\ui\test\one\compressed का उत्पादन कर रहा है। यह तब चलता है कि जो भी तय किया गया है, फ़ाइल के वास्तविक नाम में one\script1.js दिमाग में है। मैं अपने दिमाग को कैसे बदलूं ताकि यह केवल script1.js की सोच हो?

नोट:

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\one\script1.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\one\script1.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\two\script2.js 

cwd: ./ 
base: C:\blah\ui\test 
path: C:\blah\ui\test\two\script2.js 

तो यह है कि प्रतीत होता है: मैं निम्नलिखित (का उपयोग करते हुए घूंट-डिबग)

gulp.task('test', function() { 
    return gulp.src('ui/test/**/*.js', {cwd: './'}) 
     .pipe(debug({minimal: false})) 
     .pipe(rename(function(path) { 
      path.basename =  path.basename.substring(path.basename.lastIndexOf('\\') + 1); 
     })) 
     .pipe(debug({minimal: false})) 
     .pipe(gulp.dest(function(file) { 
      return path.join(path.dirname(file.path), 'compressed'); 
     })); 
}); 

कंसोल कार्य के इस संस्करण के लिए निम्न उत्पादन किया गया है कर रही करने की कोशिश की नाम पर पथ पर कोई प्रभाव नहीं पड़ता है। मैंने पथ को संशोधित करने का भी प्रयास किया।नाम बदलें पाइप में dirname, लेकिन कुछ भी नहीं मिला जो अंतिम आउटपुट पथ से नकली निर्देशिका नाम को हटाने का वांछित प्रभाव होगा।

मेरा आखिरी सवाल, तो, वास्तव में पथ क्या है। बेसिनम और path.dirname नाम बदलने के लिए पास की गई वस्तु वस्तु के लिए है?

संपादित करें: मुझे this मिला है जो गल्प कार्यों को डीबग करने के तरीके पर है।

{ 
    basename: "script1", 
    dirname: "one", 
    extname: ".js" 
} 

नाम बदलने परिणामों में '' को path.dirname स्थापना

में
ui/test/compressed/script1.js 
ui/test/compressed/script2.js 
तो

: एक debugger; बयान का नाम बदलें समारोह में रखा के साथ ऐसा करने से मुझे पथ वस्तु है, जो इस तरह दिखता का निरीक्षण करने की अनुमति दी यह हो सकता है कि नाम() खुद की आवश्यकता के लिए उपयोगी नहीं है। यह .src() के आधार विकल्प की तरह दिख रहा है, जहां कुंजी झूठ है, लेकिन दस्तावेज़ बदले में हैं।

+0

ऐसा लगता है कि आपको पिछले '.pipe' में जिस तरीके से आवश्यकता है, उसे संशोधित करने का तरीका मिला है, तो सवाल क्या है? गैर-मानक परिदृश्य को बॉक्स से बाहर क्यों नहीं जाने देता है? –

+0

@ किरीलस्लाटिन मैं 'ui/test/one/compressed/one/script1.js' के साथ समाप्त होता हूं जहां मुझे चाहिए' ui/test/one/compressed/script1.js'। वह दूसरा '/ एक' है जिसे मैं टालना चाहता हूं। मैंने इस नुस्खा को https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-task-steps-per-folder.md संशोधित किया और मुझे जो चाहिए वह प्राप्त करने में सक्षम था, इसलिए यदि बक्षीस समाप्त हो जाता है और उत्तर देने के द्वारा कोई और दावा करने की परवाह नहीं करता है, फिर मैं इसके साथ समाप्त होने के साथ एक उत्तर पोस्ट करूंगा। मैं नाम में एक हैश का उपयोग कर समाप्त हुआ, जो कि मुझे बस चाहिए था। – jinglesthula

+0

मुझे ध्यान रखना चाहिए कि मेरी पिछली टिप्पणी अंतिम परिणाम से संबंधित है, न कि .src() और .dest() के बारे में वास्तविक प्रश्नों के बारे में और कैसे हैंडल पथ जो मैं वास्तव में यहां पूछ रहा था। तो, मैं दूसरे प्रश्न पर जो पाया वह पोस्ट करूंगा कि यह वास्तव में जवाब है :) – jinglesthula

उत्तर

5

प्रश्न 1:

gulp.src('ui/test/**/*.js') 

इस लाइन, अपने रूट निर्देशिका ('फ़ाइल निर्देशिका काम कर रहे') के रूप में '/ ui/परीक्षण /' स्थापित कर रही है, क्योंकि यह आपके ग्लोब पैटर्न का आधार है। यही कारण है कि 'रिश्तेदार पथ' को नष्ट करने के लिए 'एक/script1.js' और 'दो/script2.js' थे।

प्रश्न 2:

ग्लोब करके, डॉक्स अपने '। **/* js' पैटर्न की बात कर रहे। तो आपके ग्लोब का आधार वही बात है जो यह आपकी रूट निर्देशिका, '/ ui/test /' के रूप में उपयोग कर रहा है, जो इस मामले में "सीडब्ल्यूडी के सापेक्ष फ़ोल्डर" जैसा ही है।

प्रश्न 3:

प्रत्येक पथ के लिए 'आधार' संपत्ति प्रत्येक फ़ाइल gulp.src धारा से आने के लिए glob2base मॉड्यूल के लिए इसी तरह की स्थापना की जा रही है।

glob2base(new glob.Glob('/ui/test/**/*.js')) + '..'; 

रूप

file.base + '..'; 

अगर है कि आप करने के लिए समझ में आता है एक ही है।

प्रश्न 4:

मैं तुम्हें कोड के अपने दूसरे खंड में gulp-rename उपयोग कर रहे हैं मान। तो यह आपकी समस्या को हल करना चाहिए।

gulp.src('ui/test/**/*.js') 
    .pipe(rename(function(path){ 
     path.basename = 'compressed/' + path.basename; 
    }) 
    .pipe(gulp.dest(function(file) { 
     return file.base; 
    })); 

अन्य विकल्पों को gulp.src को पारित किया जा सकता here पाया जा सकता है, लेकिन मुझे नहीं लगता उनमें से किसी को सीधे हल तुम क्या करने की कोशिश कर रहे हैं क्या है। gulp.src आपको प्रत्येक पथ के बीच में एक नई निर्देशिका में हैक करने की अपेक्षा नहीं करता है, इसलिए नामकरण सबसे सरल समाधान है।

मैं दस्तावेज़ों को समझने में समस्या के लिए आपको दोष नहीं देता हूं। मुझे तीन या चार अलग-अलग गिथब पृष्ठों के बीच कूदना पड़ा ताकि सबकुछ चल रहा हो। आशा है कि आपने जितना मैंने किया उतना सीखा।

संबंधित मुद्दे