ฉันจะคัดลอกไดเรกทอรีซ้ำด้วยอึกได้อย่างไร


167

ฉันกำลังพยายามทำโปรเจ็กต์จากไดเร็กตอรี่ที่ใช้งานได้ไปยังเซิร์ฟเวอร์ (เครื่องเดียวกัน). ใช้รหัสต่อไปนี้:

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

ฉันคาดว่าจะเห็นไฟล์ทั้งหมดที่คัดลอก อย่างไรก็ตามมันจะแบนโครงสร้าง dir - ไดเรกทอรีทั้งหมดจะถูกคัดลอก แต่ทุกไฟล์จะอยู่ในราก/var/www

อึกดูเหมือนว่าเป็นเครื่องมือสร้างยอดเยี่ยม แต่การคัดลอกไอเท็มควรเป็นกระบวนการที่ง่ายอย่างแน่นอน?


9
สำหรับผู้ชมใหม่ที่อ่านคำถามนี้ควรสังเกตว่าคำตอบที่ได้รับการโหวตสูงสุดนั้นใช้ไม่ได้ในการแก้สเปคของคำถามดั้งเดิมของไดเรกทอรีที่ไม่แบน มันช่วยแก้ปัญหาที่คนทั่วไปไม่สามารถคัดลอกไฟล์ทั้งหมดในไดเรกทอรีได้ซึ่งมันมีประโยชน์มาก!
M1ke

1
หากไม่ทำให้แบนคุณหมายถึงต้องการให้มีไดเรกทอรี 'css', 'js' และ 'src' /var/www/หรือไม่ คุณสามารถลอง{css,js,src}/**/*
Jason Goemaat

ฉันรู้ว่าการขยายตัวของ glob ทำงานได้ภายในอึก แต่ฉันจะสับสนถ้ามันทำงานแตกต่างกันไปในแต่ละรายการในแต่ละบรรทัดในรายการ - เนื่องจากการขยายตัวแบบกลมนั้นมีจุดประสงค์เพื่อขยายไปยังรายการก่อนดำเนินการ
M1ke

คำตอบ:


319

การทำงานต่อไปนี้โดยไม่ทำให้โครงสร้างโฟลเดอร์แบนราบ:

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

'**/*'เป็นส่วนที่สำคัญ นิพจน์นั้นเป็นรูปกลมซึ่งเป็นเครื่องมือเลือกไฟล์ที่ทรงพลัง ตัวอย่างเช่นสำหรับการคัดลอกไฟล์. js เท่านั้นให้ใช้:'input/folder/**/*.js'


2
คิดว่าคุณลืมเพิ่ม gulp.dest ควรเป็น.pipe(gulp.dest('output/folder'));
Matthew Sprankle

3
คุณจะทำเช่นนี้กับนามสกุลไฟล์ที่เฉพาะเจาะจงได้อย่างไร
Chev

1
คุณสามารถแก้ไขคำตอบเพื่อให้เป็นตัวอย่างสำหรับชุดไฟล์ต้นฉบับได้หรือไม่? ฉันไม่แน่ใจว่าวิธีนี้เหมาะสมกว่าแต่ฉันยินดีที่จะดูว่ามันทำงานอย่างไรเมื่อเปรียบเทียบกับ{base:"."}วิธีการ
M1ke

2
เป็นสิ่งสำคัญที่จะต้องทราบว่าbaseค่าเริ่มต้นคือ "โฟลเดอร์" ตามที่กำหนดในคำตอบนี้ กล่าวอีกนัยหนึ่งฐานเริ่มต้นที่รูปแบบ glob เริ่มต้น นี้ช่วยให้ฉันที่จะเข้าใจว่าไฟล์ของฉันจะจบลงและยังเป็นเหตุผลที่คุณไม่จำเป็นต้องใช้**/*ในgulp.destพารามิเตอร์ อึกนำทุกอย่างใน glob และวางไว้ในโฟลเดอร์ปลายทางด้วยโครงสร้างเดียวกัน
Neil Monroe

3
สิ่งนี้ไม่ตอบคำถามที่ถูกถามอย่างสมบูรณ์ มันเป็นทางออกที่ดีสำหรับวิธีการคัดลอกซ้ำอย่างถูกต้อง แต่ไม่ตอบวิธีการแก้ไขไดเรกทอรีฐาน
ty1824

173

ปรากฎว่าการคัดลอกโครงสร้างไดเรกทอรีที่สมบูรณ์gulpจะต้องให้กับฐานสำหรับgulp.src()วิธีการของคุณ

ดังนั้นgulp.src( [ files ], { "base" : "." })สามารถใช้ในโครงสร้างด้านบนเพื่อคัดลอกไดเรกทอรีทั้งหมดซ้ำ

ถ้าเช่นฉันคุณอาจลืมสิ่งนี้ลอง:

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};

1
เพิ่มการกำหนดค่า "cwd" เพื่อตั้งค่าไดเรกทอรีการทำงานปัจจุบัน
Skarllot

3
หากbaseยังทำให้คุณสับสนลองดูที่stackoverflow.com/a/35848322/11912ซึ่งทำหน้าที่อธิบายได้อย่างยอดเยี่ยม
James Skemp

60

ดังนั้น - วิธีแก้ปัญหาของการจัดเตรียมงานฐานให้ว่าเส้นทางทั้งหมดมีเส้นทางพื้นฐานเดียวกัน แต่ถ้าคุณต้องการให้เส้นทางพื้นฐานที่แตกต่างกันนี้ยังคงไม่ทำงาน

วิธีหนึ่งที่ฉันแก้ไขปัญหานี้คือการเริ่มต้นเส้นทางสัมพัทธ์ สำหรับกรณีของคุณ:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

เหตุผลที่งานนี้คืออึกตั้งฐานให้เป็นจุดสิ้นสุดของอันแรกอันชัดเจน - ชั้นนำ * ทำให้มันตั้งฐานที่ cwd (ซึ่งเป็นผลที่เราทุกคนต้องการ!)

ใช้งานได้เฉพาะในกรณีที่คุณมั่นใจได้ว่าโครงสร้างโฟลเดอร์ของคุณไม่มีเส้นทางที่แน่นอนที่สามารถจับคู่สองครั้ง ตัวอย่างเช่นหากคุณมีrandomjs/ระดับเดียวกับjsคุณจะสิ้นสุดการจับคู่ทั้งสอง

นี่เป็นวิธีเดียวที่ฉันพบว่ารวมสิ่งเหล่านี้เป็นส่วนหนึ่งของฟังก์ชัน gulp.src ระดับบนสุด อาจเป็นเรื่องง่ายที่จะสร้างปลั๊กอิน / ฟังก์ชั่นที่สามารถแยกแต่ละตัวออกมาดังนั้นคุณสามารถระบุไดเรกทอรีพื้นฐานสำหรับพวกมันได้


ฉันคิดว่าการเริ่มต้นด้วยเส้นทางพื้นฐานหลายเส้นทางอาจเกินขอบเขตของคำถาม จากคำถามเดิมของฉันฉันกำลังย้ายไฟล์ไปยังพา ธ สัมบูรณ์ แต่ปัญหายังคงเกิดขึ้นโดยไม่ระบุฐานไฟล์ทั้งหมดจาก globs ทั้งหมดของฉันถูกคัดลอกไปยังไดเรกทอรีเดียวโดยไม่ต้องมีลำดับชั้นที่มีอยู่
M1ke

2
@ M1ke เป็นจริงประเด็นหลักของคำถามของคุณไม่ได้มุ่งไปที่เส้นทางพื้นฐานที่แตกต่างกัน อย่างไรก็ตามคุณพูดถึงHowever it flattens the dir structure - all directories are copied but every file is placed in the root /var/wwwและนี่คือวิธีที่ฉันพบคำถามของคุณ - ฉันกำลังค้นหาวิธีการคัดลอกซ้ำด้วยเส้นทางฐานที่แตกต่างกัน โดยพื้นฐานแล้ววิธีนี้ใช้ได้กับกรณีของคุณโดยไม่ต้องระบุฐานเริ่มต้น แต่ยังรวมถึงกรณีเส้นทางแบบหลายฐานตราบใดที่คุณสามารถมั่นใจได้ว่าดาวชั้นนำไม่ตรงกัน :)
ty1824

6
คำตอบนี้ยอดเยี่ยม มันเกี่ยวข้องเฉพาะกับการคัดลอกเส้นทางจากจุดเริ่มต้นโดยพลการเช่น src สามารถ'assets/subdir/*fonts/*'คัดลอกแบบอักษร dir
Wtower

-4

หากคุณต้องการคัดลอกเนื้อหาทั้งหมดของโฟลเดอร์ซ้ำในโฟลเดอร์อื่นคุณสามารถดำเนินการคำสั่ง windows ต่อไปนี้จาก gulp:

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

/yตัวเลือกที่สิ้นสุดคือการปราบปรามข้อความยืนยันการเขียนทับ

ใน Linux คุณสามารถรันคำสั่งต่อไปนี้จาก gulp:

cp -R /path/to/srcfolder /path/to/destfolder

คุณสามารถใช้ปลั๊กอินgulp-execหรือgulp-runเพื่อรันคำสั่งระบบจาก gulp

ลิงก์ที่เกี่ยวข้อง:

  1. การใช้งาน xcopy

  2. gulp-execและgulp-run


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