Змініть файл на місці (те саме призначення) за допомогою Gulp.js та шаблону глобалізації


99

У мене є завдання gulp, яке намагається перетворити .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/partials, отриманий шлях до файлу просто справедливий project/partials.

Якщо є набагато простіший спосіб зробити це, я б точно оцінив це рішення ще більше. Дякую!

Відповіді:


155

Як ви підозрювали, ви робите це занадто складно. Місце призначення не повинно бути динамічним, оскільки глобальний шлях також використовується 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("./"));

Ах, дивовижно. Дякую. Чи є також простий спосіб використовувати глобус для джерела, але просто покласти все прямо в sassпапку?
— Дан-Нолан

2
Це не спрацювало для мене. Я повинен був зробити gulp.src("dist/**/*")...gulp.dest("./")
— niftygrifty

@ Дан-Нолан одним із способів вирівнювання структури папки виглядає використання gulp-перейменування , дивіться це запитання
— цифри1311407

@niftygrifty Згідно з документами, він повинен працювати в звичайній ситуації. Файли записуються на їх відповідний глобальний шлях проти обчисленої відносної бази , в цьому випадку 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
Коли я це спробую, файли зберігаються в "/", а не під глобальним контуром.
— Марк

1
Те, що говорить @GuiAmbros, не відповідає дійсності, принаймні, не згідно з документами . Базова за замовчуванням обчислюється як все, що знаходиться до глобального шляху. У моїй відповіді база буде розрахована як ./sassтака, але питання вказує, що вихід зберігає sassdir, через що він повторюється в dest. Ця відповідь досягає того ж результату, використовуючи базовий варіант, але жоден підхід не є помилковим.
— числа1311407

Примітно також, що ситуація з ОП, ймовірно, не така вже й поширена, принаймні для обробки 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(".")); 
    });
})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.