Змініть файл на місці (те саме призначення) за допомогою 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.