กำลังหาวิธีคัดลอกไฟล์ในอึกและเปลี่ยนชื่อตามไดเร็กทอรีหลัก


91

สำหรับแต่ละโมดูลฉันมีไฟล์บางไฟล์ที่ต้องคัดลอกไปยังไดเร็กทอรี build และกำลังมองหาวิธีลดโค้ดซ้ำจากสิ่งนี้:

gulp.src('./client/src/modules/signup/index.js')
  .pipe(gulp.dest('./build/public/js/signup'));

gulp.src('./client/src/modules/admin/index.js')
  .pipe(gulp.dest('./build/public/js/admin'));

ถึงสิ่งนี้:

gulp.src('./client/src/modules/(.*)/index.js')
  .pipe(gulp.dest('./build/public/js/$1'));

เห็นได้ชัดว่าข้างต้นใช้ไม่ได้มีวิธีทำเช่นนี้หรือ npm ที่ทำสิ่งนี้อยู่แล้ว?

ขอบคุณ

คำตอบ:


131

วิธีที่ดีที่สุดคือกำหนดค่าของคุณbaseเมื่อจัดหาไฟล์ดังนี้:

gulp.src('./client/src/modules/**/index.js', {base: './client/src/modules'})
  .pipe(gulp.dest('./build/public/js/'));

สิ่งนี้บอกgulpให้ใช้ไดเร็กทอรีโมดูลเป็นจุดเริ่มต้นในการกำหนดพา ธ สัมพัทธ์

(นอกจากนี้คุณสามารถใช้/**/*.jsถ้าคุณต้องการรวมไฟล์ JS ทั้งหมด ... )


6
จะต้องมีวิธีที่มีพลวัตมากขึ้นในการทำเช่นนี้ - แล้วเมื่อไฟล์ src มาจาก 2 ไดเร็กทอรีที่แตกต่างกันและคุณต้องการเก็บรักษาไดเร็กทอรีไว้ใน dest?
Ivan Durst

1
@IvanDurst ฉันจัดการกรณีเฉพาะนี้ด้วยรหัส OP (คำตอบ) โดยใช้การกำหนดค่าฐานและใช้เส้นทางสัมพัทธ์จากไฟล์อึกไปยังไฟล์อิสระและ./folder-example/**โฟลเดอร์และไฟล์แบบเต็ม
Caio Wilson

210

ไม่ใช่คำตอบ แต่ใช้ได้กับการปรากฏของคำถามนี้ในผลการค้นหา

ในการคัดลอกไฟล์ / โฟลเดอร์ในอึก

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);

2
อืม ... อึกของฉันบอกว่างานนี้เสร็จสมบูรณ์ แต่ไม่มีไฟล์เอาต์พุต
Tyguy7

4
คุณต้องส่งคืนสตรีมเพื่อให้อึกรู้เมื่องานเสร็จสิ้น
Merott

2
ฉันสับสนว่าทำไมคำตอบที่ระบุว่า "ไม่ใช่คำตอบ" จึงมีคะแนนโหวตมากกว่าคำตอบที่ยอมรับซึ่งตอบคำถามได้ ฉันไม่แน่ใจว่าเราควรถ่วง SO ด้วยคำตอบที่ออกแบบมาเพื่อให้เครื่องมือค้นหาทำบางสิ่งโดยเฉพาะแทนที่จะให้คำตอบสำหรับคำถาม ฉันคิดว่ามันเป็นงานของเครื่องมือค้นหาที่จะทำสิ่งที่เป็นประโยชน์จากสิ่งที่พวกเขาได้รับเมื่อพวกเขารวบรวมข้อมูลเว็บไซต์ แค่ 0.02 เหรียญของฉัน
jinglesthula

9
@jinglesthula เป็นบริการที่มีประโยชน์สำหรับผู้ที่ตอบคำถามนี้ผ่านเครื่องมือค้นหาไม่ว่าเครื่องมือค้นหาจะทำงานได้ดีเพียงใดก็ตาม ฉันรู้สึกทราบซึ้ง.
jbkly

1
ฮ่าฮ่าเพิ่งรู้ว่านี่เป็นที่นิยมมากกว่าคำถามที่ถูกต้องหรือคำตอบที่ถูกต้อง: P
Kirk Strobeck

5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

ทำงานให้ฉัน!


.. ถึงกระนั้นนี่คือคำตอบ
Kirk Strobeck

2
... ดังนั้นคนที่สามารถเขียนมันจึงไม่ทำงานตามที่เป็นอยู่เพื่อให้คนที่จะมาถึงหน้านี้มองหาตัวอย่างข้อมูลที่แน่นอนของรหัสสามารถใช้งานจริงได้หรือไม่
Ivan Durst

ดังนั้น ... จึงอนุญาตให้ใช้ parens และ $ n "backreferences" ใน src / dest globs ได้หรือไม่ พวกเขาไม่ใช่ regexes, afaik ดูเหมือนว่าสิ่งที่ฉันกำลังมองหา แต่เอกสาร vinyl-fs นั้นค่อนข้างรัดกุมในตัวเลือก. src () และ. dest () และสิ่งที่อนุญาตในเอกสารเหล่านี้และวิธีการทำงาน
jinglesthula

3

การใช้เพื่อรักษาโครงสร้างไดเรกทอรีอินพุตจะถูกเก็บรักษาไว้

.pipe(gulp.dest(function(file) {
    var src = path.resolve(SRC_FOLDER);
    var final_dist = file.base.replace(src, '');
    return DIST_FOLDER + final_dist;
}))

ใช้นี้คุณสามารถวางไว้ใน src .src(SRC_FOLDER + '/**/*.js')นี้:

คำตอบอื่น ๆ ไม่ได้ผลสำหรับฉัน (เช่นใช้base:on src()} เนื่องจากปลั๊กอินบางตัวทำให้แผนผังไดเรกทอรีแบน


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