แก้ไขไฟล์ในตำแหน่ง (ปลายทางเดียวกัน) โดยใช้ Gulp.js และรูปแบบ globbing


100

ฉันมีงานอึกทึกที่พยายามแปลงไฟล์. scss เป็นไฟล์. css (โดยใช้ gulp-ruby-sass) จากนั้นวางไฟล์. css ที่เป็นผลลัพธ์ลงในที่เดียวกับที่พบไฟล์ต้นฉบับ ปัญหาคือเนื่องจากฉันใช้รูปแบบโกลบบิงฉันไม่จำเป็นต้องรู้ว่าไฟล์ต้นฉบับถูกเก็บไว้ที่ไหน

ในโค้ดด้านล่างนี้ฉันกำลังพยายามใช้ gulp-tap เพื่อแตะเข้าไปในสตรีมและหาเส้นทางไฟล์ของไฟล์ปัจจุบันที่สตรีมอ่านจาก:

gulp.task('convertSass', function() {
    var fileLocation = "";
    gulp.src("sass/**/*.scss")
        .pipe(sass())
        .pipe(tap(function(file,t){
            fileLocation = path.dirname(file.path);
            console.log(fileLocation);
        }))
        .pipe(gulp.dest(fileLocation));
});

จากผลลัพธ์ของconsole.log(fileLocation)โค้ดดูเหมือนว่าโค้ดนี้จะทำงานได้ดี อย่างไรก็ตามไฟล์ CSS ที่ได้ดูเหมือนจะถูกวางไว้สูงกว่าที่ฉันคาดไว้หนึ่งไดเร็กทอรี ในที่ที่มันควรจะเป็นเส้นทางแฟ้มผลเป็นเพียงproject/sass/partialsproject/partials

หากมีวิธีที่ง่ายกว่านี้ฉันจะต้องขอบคุณโซลูชันนั้นมากยิ่งขึ้น ขอบคุณ!

คำตอบ:


156

อย่างที่คุณสงสัยคุณกำลังทำให้เรื่องนี้ซับซ้อนเกินไป ปลายทางไม่จำเป็นต้องเป็นแบบไดนามิกเนื่องจากมีการใช้เส้นทางแบบ globbed ด้วยdestเช่นกัน เพียงแค่ไปป์ไปยังไดเร็กทอรีฐานเดียวกันกับที่คุณกำลังกวาดล้าง src จากในกรณีนี้คือ "sass":

gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest("sass"));

หากไฟล์ของคุณไม่มีฐานทั่วไปและคุณต้องส่งต่ออาร์เรย์ของพา ธ สิ่งนี้ก็ไม่เพียงพออีกต่อไป ในกรณีนี้คุณต้องการระบุตัวเลือกพื้นฐาน

var paths = [
  "sass/**/*.scss", 
  "vendor/sass/**/*.scss"
];
gulp.src(paths, {base: "./"})
  .pipe(sass())
  .pipe(gulp.dest("./"));

อายอดเยี่ยม ขอบคุณ. นอกจากนี้ยังมีวิธีง่ายๆในการใช้ glob สำหรับซอร์ส แต่เพียงแค่ใส่ทุกอย่างลงในsassโฟลเดอร์โดยตรง
Dan-Nolan

2
สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันต้องทำgulp.src("dist/**/*")...gulp.dest("./")
niftygrifty

@ Dan-Nolan วิธีหนึ่งในการทำให้โครงสร้างโฟลเดอร์แบนดูเหมือนจะใช้การเปลี่ยนชื่ออึกดูคำถามนี้
หมายเลข 1311407

@niftygrifty ตามเอกสารมันควรจะทำงานในสถานการณ์ปกติ ไฟล์ถูกเขียนไปยังพา ธ globbed ที่ตรงกันเทียบกับฐานสัมพัทธ์ที่คำนวณได้ในกรณีsassนี้ บางทีปลั๊กอิน sass ที่นี่กำลังแก้ไขเส้นทางอยู่แล้ว?
ตัวเลข 1311407

1
แต่สิ่งนี้ไม่บันทึกไฟล์ใน / sass และไม่ได้อยู่ในไดเรกทอรีย่อยตามเช่น / sass / any / where? ฉันจะบันทึกไฟล์ในเส้นทางแบบโกลเบิลได้อย่างไร
มาร์ค

68

สิ่งนี้ง่ายกว่าที่ตัวเลข 1311407 นำไปสู่ .คุณไม่จำเป็นต้องระบุโฟลเดอร์ปลายทางที่ทุกการใช้งานเพียงแค่ นอกจากนี้อย่าลืมตั้งค่าไดเรกทอรีฐาน

gulp.src("sass/**/*.scss", { base: "./" })
    .pipe(sass())
    .pipe(gulp.dest("."));

8
นี่คือคำตอบที่ใช่ หากคุณกำลังพยายามรักษาโครงสร้างปลายทาง (กล่าวคือไม่ทำให้โครงสร้างแบนราบ) คุณต้องระบุไดเร็กทอรีฐานใน gulp.src
Gui Ambros

2
เมื่อฉันลองสิ่งนี้ไฟล์จะถูกบันทึกไว้ใน "/" และไม่อยู่ภายใต้พา ธ แบบโกลเบิล
Mark

1
อะไร @GuiAmbros กล่าวว่าไม่เป็นความจริงอย่างน้อยไม่เป็นไปตามเอกสาร โดยค่าเริ่มต้นฐานจะถูกคำนวณให้เป็นทุกอย่างก่อนเส้นทางที่มีลูกโลก ในคำตอบของฉันฐานจะถูกคำนวณให้เป็น./sassแต่คำถามระบุว่าเอาต์พุตยังคงมีsassdir ซึ่งเป็นสาเหตุที่ทำซ้ำในไฟล์dest. คำตอบนี้ได้ผลลัพธ์เดียวกันโดยใช้ตัวเลือกฐาน แต่ทั้งสองวิธีไม่ผิด
ตัวเลข 1311407

นอกจากนี้ยังเป็นที่น่าสังเกตว่าสถานการณ์ของ OP อาจจะไม่ร่วมกันว่าอย่างน้อยสำหรับการประมวลผล CSS เป็นโดยปกติที่คุณคาดหวังที่จะส่งออกเป็นcssไดเรกทอรีหรือคล้ายกันไม่ได้มาจากการsass sassในกรณีเช่นนี้คำตอบที่ยอมรับนั้นง่ายกว่าทางเลือกนี้
ตัวเลข 1311407

30
gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest(function(file) {
    return file.base;
  }));

แต่เดิมคำตอบให้ที่นี่: https://stackoverflow.com/a/29817916/3834540

ฉันรู้ว่าเธรดนี้เก่า แต่ยังคงปรากฏเป็นผลลัพธ์แรกใน Google ดังนั้นฉันคิดว่าฉันอาจโพสต์ลิงก์ที่นี่


เธรดนี้เก่า แต่คำตอบยังคงถูกต้องแม้ว่าฉันคิดว่าวิธีนี้จะแห้งกว่าเล็กน้อย (ถ้ามีประสิทธิภาพน้อยกว่าเล็กน้อย) คำถามที่เชื่อมโยงจริงๆแล้วเป็นปัญหาของการใช้destอย่างไม่ถูกต้อง แน่ใจว่าวิธีแก้ปัญหาที่ให้มาใช้งานได้ แต่การทำอย่างถูกต้องในครั้งแรกเพียงแค่แทนที่dest('./')ด้วยdest('./images')ก็จะได้ผลลัพธ์เช่นเดียวกัน
ตัวเลข 1311407

เหตุผลที่โซลูชันอื่นไม่ได้ผลสำหรับฉันคือฉันมีอาร์เรย์ภายใน gulp.src () เช่น gulp.src (['sass / **', 'common / sass / **']) และเมื่อฉันค้นหา คำตอบนี่คือโพสต์ที่ฉันพบ น่าจะทำให้ชัดเจนขึ้นแม้ว่า
bobbarebygg

มีเหตุผล. ในกรณีของคุณปัญหาคือไม่มีฐานทั่วไปสำหรับการคำนวณอึก วิธีแก้ปัญหาของคุณใช้งานได้ แต่วิธีแก้ปัญหาที่ได้รับจาก @ NightOwl888 ในการระบุฐานจะใช้งานได้เช่นกัน การอัปเดตคำตอบที่ยอมรับเพื่อรวมกรณีที่ไม่มีฐานร่วมกัน
ตัวเลข 1311407

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! ไม่ใช่ไฟล์อื่น ๆ ซึ่งเฉพาะสำหรับไฟล์เดียวหรือไปยังพา ธ ฐาน
MrCroft

0

สิ่งนี้มีประโยชน์มาก!

gulp.task("default", function(){

    //sass
    gulp.watch([srcPath + '.scss', '!'+ srcPath +'min.scss']).on("change", function(file) {
         console.log("Compiling SASS File: " + file.path)
         return gulp.src(file.path, { base: "./" })
        .pipe(sass({style: 'compressed'}))
        .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.init())
        .pipe(autoprefixer({
            browsers: ['last 2 versions'],
            cascade: false
        }))
        .pipe(sourcemaps.write('./'))         
        .pipe(gulp.dest(".")); 
    });

    //scripts
    gulp.watch([srcPath + '.js','!'+ srcPath + 'min.js']).on("change", function(file) {
        console.log("Compiling JS File: " + file.path)
        gulp.src(file.path, { base: "./" })
        .pipe(uglify())
        .pipe(rename({suffix: '.min'}))       
        .pipe(gulp.dest(".")); 
    });
})
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.