Использование gulp для компиляции файлов bootstrap.less в основной bootstrap.css?

Мне действительно нравится gulpjs, это был мой любимый диспетчер задач, но мне хотелось бы узнать о диспетчерах задач несколько месяцев назад и заняться gruntjs, в основном для поддержки. Для gulpjs сложно найти информацию о конкретных вещах.

Мой вопрос заключается в том, как мне настроить свой gulpfile.js, чтобы я мог вносить изменения в файлы bootstrap.less, в частности, variables.less. Я установил "gulp-less" и реализовал его, как показано ниже.

var less = require('gulp-less'),
    path = require('path');

gulp.task('less', function () {
  gulp.src('./source/less/variables.less')
    .pipe(less())
    .pipe(gulp.dest('./source/css/bootstrap.css'));
});

Я получаю сообщение об ошибке ниже после запуска gulp less.

events.js:72 throw er; // Unhandled 'error' event ^
Error: EEXIST, mkdir 'C:\wamp\www\myproj\source\css\bootstrap.css'

Я не думаю, что мой код задачи sass настроен правильно, я новичок в gulp, но я пробовал несколько комбинаций, и да, я использовал пример из "gulp-less", код, который я использовал, был наиболее кратким и четким кодом того, чего я хочу достичь.

Редактировать: я нашел несколько хороших ключевых слов для этого в Google. Я нашел несколько недавних сообщений об этом, вот один Запуск Gulp с сохранением структуры папок без Gulp не похоже, что есть хороший ответ, который мне нужно прочитать.

Дополнительно: я забыл, что при использовании кода из документации я получаю сообщение об ошибке с alerts.less

gulp.task('less', function () {
  gulp.src('./source/less/*.less')
    .pipe(less({
      paths: [ path.join(__dirname, 'less', 'includes') ]
    }))
    .pipe(gulp.dest('./source/css'));
});

Ошибка

stream.js:94
throw er; // Unhandled stream error in pipe.
^
[gulp] Error in plugin 'gulp-less': variable @alert-padding is undefined in file C:\wamp\www\myproj\source\less\alerts.less line no. 10

Даже когда я удаляю эту строку, она продолжает находить новые ошибки.

Редактировать: В документах говорится следующее, но это не имеет для меня смысла, говорит ли это о том, что должна быть ошибка, если это так, это сбивает с толку, я попробую следовать руководству, которое они предоставляют.

Обработка ошибок

По умолчанию задача gulp завершится ошибкой, и все потоки остановятся при возникновении ошибки. Чтобы изменить это поведение, ознакомьтесь с документацией по обработке ошибок здесь.


person Michael Joseph Aubry    schedule 24.02.2014    source источник
comment
Ваша ошибка говорит о том, что выход существует. Я не думаю, что вы указываете имя файла только в каталоге. Попробуйте изменить пункт назначения на ./source/css   -  person Mark Meyer    schedule 24.02.2014
comment
Да, я делал это во время экспериментов, и я не думаю, что это сработало, позвольте мне попробовать еще раз с кодом прямо из документации. Это скомпилирует для меня совершенно новый файл начальной загрузки, верно?   -  person Michael Joseph Aubry    schedule 24.02.2014
comment
Ах да, я забыл упомянуть о первой проблеме, с которой я столкнулся до того, как начал возиться, обновляя OP сейчас! Хорошо, обновлено, есть проблема с alerts.less в строке 10, но я не думаю, что мне нужно редактировать эту строку.   -  person Michael Joseph Aubry    schedule 24.02.2014
comment
Даже когда я удаляю эту строку, она продолжает находить новые ошибки.   -  person Michael Joseph Aubry    schedule 24.02.2014
comment
@MichaelJosephAubry устранило ли принятое решение ошибку заполнения предупреждений? я все еще получаю эту ошибку после ответов ниже   -  person br3w5    schedule 15.04.2015
comment
...похоже, alerts.less компилируется раньше, чем variable.less   -  person br3w5    schedule 15.04.2015
comment
aha исправил это, указав gulp.src на каталог less, который содержит все пользовательские файлы less, а также bootstrap-styles.less с импортом bootstrap и каталогом bootstrap less, вместо того, чтобы рекурсивно находить все файлы в каталоге less с помощью less/**/* .меньше   -  person br3w5    schedule 15.04.2015
comment
Вы не хотите указывать набор меньшего количества файлов в качестве источника. Только bootstrap.less, который импортирует остальные. (пример в ответе ниже)   -  person Robert Christian    schedule 27.12.2015


Ответы (6)


У меня были те же проблемы при попытке скомпилировать Bootstrap CSS. Мое упрощенное решение выглядело так:

// Compiles LESS > CSS 
gulp.task('build-less', function(){
    return gulp.src('styles.less')
        .pipe(less())
        .pipe(gulp.dest('./source/css'));
});

и мой файл styles.less включал импорт в файл bootstrap.less. Я заметил, что если в путь gulp.src() будут включены файлы без начальной загрузки, это приведет к ошибкам.

My styles.less:

@import "../lib/bootstrap/less/bootstrap.less";
@body-bg:     red; // test background color
person Tucker    schedule 24.02.2014
comment
Я только что заставил его работать в то же время, когда вы написали, круто! - person Michael Joseph Aubry; 24.02.2014
comment
Я должен дать вам зеленый чек, хотя. Но мой ответ - то, что работает для меня. Спасибо! Надеюсь, это поможет другим. Go gulpjs - person Michael Joseph Aubry; 24.02.2014

Я заставил его работать, я не знал, что sourceLess должен быть bootstrap.less, в основном это было проблемой.

var sourceLess = './source/less';
var targetCss = './source/css';

// Compile Our Less
gulp.task('less', function() {
    return gulp.src([sourceLess + '/bootstrap.less'])
        .pipe(less())
        .pipe(gulp.dest(targetCss));
});
person Michael Joseph Aubry    schedule 24.02.2014
comment
Ну, это имеет смысл, bootstrap.less включает в себя остальные файлы .less (кроме переменных). - person basickarl; 20.03.2015
comment
bootstrap.less включает переменные.less — это первая строка. - person Henry; 21.04.2015

Плагин gulp less просто преобразует less в css. В Bootstrap файл без индекса — это Bootstrap.less, который, в свою очередь, импортирует все остальные файлы, связанные с начальной загрузкой. Так что все, что вам нужно, это получить Bootstrap.less. Если вам нужен собственный набор переменных, просто создайте еще один файл меньшего размера (my-custom-bs.less) и импортируйте файл меньшего числа переменных после того, как Bootstrap.less вроде (при условии, что все файлы меньшего размера начальной загрузки находятся в папке с именем bootstrap):

@import "bootstrap/less/bootstrap.less";
@import "my-custom-bs-variables.less";

Затем в задаче gulp просто укажите исходный код только для этого файла:

gulp.task('build-less', function(){
return gulp.src('my-custom-bs.less')
    .pipe(less())
    .pipe(gulp.dest('./source/css'));
});
person abhisekpaul    schedule 04.02.2015

Мое решение этой проблемы — создать собственную копию bootstrap.less за пределами папки поставщиков и изменить все пути импорта:

@import "../vendor/bootstrap/less/variables.less";

Затем я могу закомментировать части бутстрапа, которые мне не нужно включать — их много, и вам обычно не нужно все это.

Затем я могу заменить отдельные включения, если я планирую их изменить:

@import "./custom-bootstrap/variables.less";
// etc...

Таким образом, нет необходимости изменять папку поставщиков, и я могу удалить или повторно добавить компоненты по своему желанию, изменить шрифты по умолчанию, цвета по умолчанию и т. д.

Еще один совет для тех, кто предпочитает sass/scss. Можно комбинировать загрузку из меньшего источника, если вы конвертируете в css, а затем включаете его с помощью этого плагина компаса:

https://github.com/chriseppstein/sass-css-importer

person Henry    schedule 21.04.2015

Вы не хотите указывать набор меньшего количества файлов в качестве источника. Только bootstrap.less, который импортирует остальные.

gulp.task('less', function () {
    return gulp.src('./less/bootstrap.less')
        .pipe(less({
            paths: [ path.join(__dirname, 'less', 'includes') ]
        }))
        .pipe(gulp.dest('./ui/css'));
});
person Robert Christian    schedule 26.12.2015

Следующий gulpfile должен работать с последней версией bootstrap и gulp.

var gulp = require('gulp');
var postcss = require('gulp-postcss');
var less = require('gulp-less');
var autoprefixer = require('autoprefixer');

gulp.task('css', function () {
    var processors = [
        autoprefixer
    ];
    return gulp.src('./node_modules/bootstrap/less/bootstrap.less')
        .pipe(less())
        .pipe(postcss(processors))
        .pipe(gulp.dest('./public/css'));
});

gulp.task('default', ['css']);

Вы также можете скомпилировать каждый модуль/компонент начальной загрузки по отдельности, просто проанализировав каждый файл less по отдельности. Или вы можете импортировать каждый отдельный модуль так же, как это делает bootstrap.css.

например оповещения

@import "../node_modules/bootstrap/less/variables.less";
@import "../node_modules/bootstrap/less/mixins.less";

@import "../node_modules/bootstrap/less/alerts.less";

Я использовал этот подход для совместимой с модулем css версии bootstrap bootstrap-css, где каждый модуль начальной загрузки может быть импортируются по отдельности в компоненты.

person svnm    schedule 05.02.2016