निर्देशिका से दूसरे तक की सभी फाइलों को Grunt.js कॉपी के साथ कॉपी करें


91

मैं अपनी निर्माण प्रक्रिया के हिस्से के रूप में एक निर्देशिका में सभी फ़ाइलों को कॉपी करने की कोशिश कर रहा हूं। यह उन व्यक्तिगत फ़ाइलों के लिए ठीक काम करता है जिन्हें मैं स्पष्ट रूप से निर्दिष्ट करता हूं लेकिन जब मैं पूरी निर्देशिका को कॉपी करने की कोशिश करता हूं तो यह पूरी निर्देशिका संरचना (या कुछ भी नहीं) की नकल जैसी अजीब चीजें करता है। यहाँ मेरा GruntFile.js से प्रासंगिक हिस्सा है:

copy: {
  myvoice: {
    files: [
      { src:"src/html/index.html", dest:"dist/myvoice/index.html" },
      { src:"src/html/css/style.css", dest:"dist/myvoice/css/style.css" },
      { src:"src/html/js/require.js", dest:"dist/myvoice/js/require.js" },
      { src:"build/myvoice/main.js", dest:"dist/myvoice/js/main.js" },
      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }
    ]
  }
},

विशेष रूप से यह अंतिम पंक्ति है जो मुझे काम करने के लिए नहीं मिल सकती है:

      { src:"src/html/css/fonts/*", dest:"dist/myvoice/css/fonts/" }

जवाबों:


149

flatten: trueमें के रूप में विकल्प इस जवाब कुछ मामलों के लिए काम कर सकते हैं, लेकिन यह करने के लिए, मुझे लगता है कि अधिक सामान्य आवश्यकता (मेरे मामले में के रूप में) एक फ़ोल्डर और इसके उप-फ़ोल्डर संरचना की नकल करने के लिए है, के रूप में-है dest। ऐसा लगता है कि ज्यादातर मामलों में अगर आपके पास उप-फ़ोल्डर हैं, तो उन्हें कोड में इस तरह से संदर्भित किया जा सकता है। ऐसा करने की कुंजी cwdविकल्प है, जो निर्दिष्ट कार्य निर्देशिका के सापेक्ष फ़ोल्डर संरचना को संरक्षित करेगा:

copy: {
  files: {
    cwd: 'path/to/files',  // set working folder / root to copy
    src: '**/*',           // copy all files and subfolders
    dest: 'dist/files',    // destination folder
    expand: true           // required when using cwd
  }
}

धन्यवाद - आप सही कह रहे हैं कि जब मैंने प्रश्न पूछा था तो यह उत्तर वही है जो मैं खोज रहा था। मैंने पिछले उत्तर के कारण चपटे से निपटना सीख लिया था लेकिन यह कष्टप्रद था।
इवान होब्स

13
मैंने इसके लिए एक घंटे से अधिक का समय गंवा दिया है ... यदि आप cwdविकल्पों का उपयोग करते हैं, तो सुनिश्चित करें कि मुड़ना है expand:true। यदि आप सेट expand:trueनहीं करते हैं, तो cwd ठीक से काम नहीं करेगा।
ड्यूकिन

2
मुझे यह सुनिश्चित करना था कि निर्देशिका के पथ '/' के साथ समाप्त हों और flatten: falseयह काम कर सके।
सैमुअल रॉसिल

**/* Thats मैं क्या देख रहा था मैं ** धन्यवाद आदमी का उपयोग कर रहा था।
सैम

43

यदि आप फ़ाइल ग्लोब निर्दिष्ट करते हैं तो यह कार्य फ़ोल्डर संरचना बनाए रखेगा। आप flattenजो चाहते हैं वह विकल्प है जो संरचना को हटा देगा।

{
    expand: true,
    flatten: true,
    src: ['src/html/css/fonts/**'],
    dest: 'dist/myvoice/css/fonts/',
    filter: 'isFile'
}

Github repo में उपलब्ध सभी विकल्पों को खोजें । उम्मीद है की यह मदद करेगा।


24

मैं जोड़ना चाहूंगा कि src में ग्लोब के प्रारूप को बदलने से कॉपी काम कैसे होता है।

जैसा कि ऊपर bmoeskau द्वारा बताया गया है , निम्नलिखित सब कुछ अंदर कॉपी करेगा dist/और इसे स्थानांतरित करेगा path/to/dir(यदि यह पहले से मौजूद है तो गंतव्य को अधिलेखित कर देगा)।

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '**'
  }
}

हालाँकि, ध्यान दें:

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*'
  }
}

केवल फ़ाइलों के dist/साथ-साथ निर्देशिकाओं को भी कॉपी करेगा, लेकिन उन निर्देशिकाओं की सामग्री को गंतव्य पर कॉपी नहीं करेगा ।

इसके अलावा, निम्नलिखित केवल सामग्री के साथ निर्देशिका की प्रतिलिपि src: '*/*'बनाएगा । यानी सिर्फ अंदर की फाइल कॉपी नहीं होगी।dist/dist/

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*'
  }
}

अंत में, ऊपर के समान, लेकिन केवल अंदर फ़ाइलों के साथ-साथ उपनिर्देशिकाओं के अंदर की फ़ाइलों src: '**/**'को कॉपी करेगा । इसलिए गंतव्य के अंदर कोई फ़ोल्डर नहीं होगा।dist/dist/path/to/dir

copy: {
  files: {
    expand: true,
    dest: 'path/to/dir',
    cwd: 'dist/',
    src: '*/*',
    flatten: true,
    filter: 'isFile'
  }
}

4
महान व्याख्या! +1
myrocode


+ 1 क्या सितारों की संख्या का कोई मतलब होना चाहिए, उदाहरण के लिए **हमेशा फाइलों और निर्देशिकाओं का मतलब होता है, और *सिर्फ फाइलें?
कोडीबस्टीन

1
@ बैश मैनुअल से : *एक ही पैटर्न के रूप में उपयोग किए जाने वाले दो आसन्न सभी फाइलों और शून्य या अधिक निर्देशिकाओं और उपनिर्देशिकाओं से मेल खाएंगे । यदि एक के बाद /, दो आसन्न *s केवल निर्देशिकाओं और उपनिर्देशिकाओं से मेल खाएँगे
जॉर्ज बुकरान

1
**सब कुछ मेल खाता है , जबकि **/ केवल निर्देशिका और उपनिर्देशिका (फाइलें नहीं)।
जॉर्ज बुकानन

1

फाइल सेगमेंट (कॉफ़ीस्क्रिप्ट में) के बजाय घुंघराले ब्रेसिज़ का उपयोग करना पड़ा ...

copy: {
  files: [
    cwd: 'path/to/files'
    src: '**/*'
    dest: 'dist/files'
    expand: true
  ]
}

0

यदि आप कोणीय तुर्क के साथ विकसित कर रहे हैं, तो यह ग्रंट के साथ नकल करने का बेहतर तरीका है। विस्तार: cwd का उपयोग करते समय सही होना आवश्यक है। <% = yeoman.app%> केवल ऐप मार्ग है ('।')।

 {
    expand: true,
     cwd: '<%= yeoman.app %>/data',
     dest: '<%= yeoman.dist %>/data',
     src: ['**']
    }

हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। कृपया अपने कोड को व्याख्यात्मक टिप्पणियों के साथ भीड़ न दें, क्योंकि इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
गुडबाय StackExchange
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.