คัดลอกไฟล์ทั้งหมดจากไดเร็กทอรีไปยังไดเร็กทอรีอื่นด้วย Grunt.js copy


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
  }
}

ขอบคุณ - คุณพูดถูกคำตอบนี้คือสิ่งที่ฉันกำลังมองหาเมื่อถามคำถาม ฉันเรียนรู้ที่จะจัดการกับการแบนที่เกิดจากคำตอบก่อนหน้านี้ แต่มันน่ารำคาญ
Evan Hobbs

13
ฉันได้หายไปกว่าหนึ่งชั่วโมงนี้ ... ถ้าคุณใช้ตัวเลือกให้แน่ใจว่าได้เปิดcwd expand:trueหากคุณไม่ได้ตั้งค่าexpand:truecwd จะทำงานไม่ถูกต้อง
ducin

2
ฉันต้องตรวจสอบให้แน่ใจว่าเส้นทางไดเรกทอรีลงท้ายด้วย '/' และเพิ่มflatten: falseเพื่อให้มันใช้งานได้
Samuel Rossille

**/* นั่นคือสิ่งที่ฉันกำลังมองหาฉันใช้ ** ขอบคุณมาก
แซม

43

งานนี้จะรักษาโครงสร้างโฟลเดอร์หากคุณระบุไฟล์ glob สิ่งที่คุณต้องการคือflattenตัวเลือกซึ่งจะลบโครงสร้างออก

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

หาส่วนที่เหลือของตัวเลือกในการซื้อคืน Github หวังว่านี่จะช่วยได้


25

ฉันต้องการเพิ่มว่าการเปลี่ยนรูปแบบของglobใน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

3
ดีกว่าเอกสารใน github ฉันชอบตัวอย่าง
wukong

+1 มีหลักการหรือไม่ว่าจำนวนดาวควรหมายถึงอะไรเช่น**หมายถึงไฟล์และไดเร็กทอรีเสมอและ*แค่ไฟล์
CodyBugstein

1
@Imray จากคู่มือการทุบตี : สองติด*s ใช้เป็นรูปแบบเดียวที่จะตรงกับไฟล์ทั้งหมดและเป็นศูนย์หรือมากกว่าไดเรกทอรีและไดเรกทอรีย่อย หากตามด้วย a /สอง*s ที่อยู่ติดกันจะจับคู่ไดเร็กทอรีและไดเร็กทอรีย่อยเท่านั้น
Jorge Bucaran

1
**จับคู่ทุกอย่างในขณะที่ไดเร็กทอรีและไดเร็กทอรีย่อย**/ เท่านั้น (ไม่ใช่ไฟล์)
Jorge Bucaran

2

ต้องใช้ egdy แทนวงเล็บปีกกาสำหรับส่วนของไฟล์ (ใน Coffeescript) ...

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

0

หากคุณกำลังพัฒนาโดยใช้มุมเอียงนี่เป็นวิธีที่ดีกว่าในการคัดลอกด้วยเสียงฮึดฮัด expand: true เป็นสิ่งจำเป็นเมื่อใช้ cwd <% = yeoman.app%> เป็นเพียงเส้นทางของแอป (".")

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

แม้ว่าข้อมูลโค้ดนี้จะช่วยแก้ปัญหาได้ แต่คำอธิบายจะช่วยปรับปรุงคุณภาพของโพสต์ โปรดจำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและบุคคลเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำโค้ดของคุณ โปรดพยายามอย่าเบียดโค้ดของคุณด้วยความคิดเห็นเชิงอธิบายเนื่องจากจะช่วยลดความสามารถในการอ่านโค้ดและคำอธิบาย!
Goodbye StackExchange
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.