Gulp Sass没有编译部分内容

时间:2015-06-09 14:23:09

标签: sass gulp libsass

所以我使用Gulp Sassgulp-changed(我已经尝试了更新语法更改的gulp-newer)并观看所有scss个文件在我的文件夹中。

当我更改基础scss文件时,它将编译没有任何问题。

但是如果我更改了部分内容,它就不会编译那个依赖于该部分的sass文件。

咕嘟咕嘟

var SRC = './stylesheets/**/*.scss';
var DEST = './stylesheets';
gulp.task('sass', function() {
  return gulp.src(SRC)
    .pipe(changed(DEST, { extension: '.css' }))
    .pipe(plumber({
        errorHandler: handleErrors
    }))
    .pipe(sourcemaps.init())
    .pipe(sass({
            includePaths: [
                'C:/var/www/mobile 2/stylesheets'
    ]}))
    .pipe(sourcemaps.write('./'))
    .on('error', handleErrors)
    .pipe(gulp.dest(DEST))
});

文件夹

├── scss
│    └── base.scss
│          ├── _partial1.scss
│          └── _partial2.scss
│          └── anotherBase.scss
│                 ├── _anotherBasePartial1.scss
│                 └── _anotherBasePartial2.scss

对所做的base.scss || anotherBase.scss更改进行更改,对partial1.scss进行任何更改。

正如您在日志中看到的那样:

[15:14:02] Starting 'sass'... //here i changed _partial1.scss
[15:14:03] Finished 'sass' after 248 ms
[15:18:20] Starting 'sass'...
[15:18:20] Finished 'sass' after 289 ms
[BS] File changed: c:\var\www\mobile 2\stylesheets\sitescss\responsive\tools\base.css
[15:18:24] Starting 'sass'...
[15:18:24] Finished 'sass' after 289 ms
[BS] File changed: c:\var\www\mobile 2\stylesheets\sitescss\responsive\tools\anotherBase.css

我希望每当部分更改时编译scss。

6 个答案:

答案 0 :(得分:5)

节目有点迟,但如果我理解你的话;你想在更改任何scss文件时运行你的构建,无论是否是部分,对吧? (但不包括构建本身的部分 - 因为它由sass @import处理)。

我通常使用这种方法:

var scss_source = [ 'path/to/scss' ],
    partials_source = [ 'path/to/partials' ];

gulp.task('scss', function () {
    gulp.src( scss_source )
    ...
});

var scss_watcher = gulp.watch([ scss_source, partials_source ], [ 'scss' ]);

我只将scss_source传递给构建版本,但是两个源代码都传递给了观察者。这样我可以从其他scss源中分离所有部分,但是对任何触发构建的文件都进行了更改。而且我不必包含另一个处理此问题的模块。

我通常将我的部分保存在不同的目录中(想想共享,而不是与其他scss文件混合)。

希望这对你的情况有意义 - 否则我会道歉。

答案 1 :(得分:1)

ClientId 如果partials位于同一个文件夹或子文件夹中。

答案 2 :(得分:0)

这可能更多地与你如何包含部分内容有关 - 你的@imported部分到你的基本sass文件?

即,base.scss有

@import 'partial1';
@import 'partial2';

那里的某个地方?

修改

好吧我刚遇到类似的问题,我最后只是使用gulp-newer +循环数组来生成gulp任务。所以它看起来像

var sassMain = ['base', 'anotherBase'];
sassMain.forEach(current, function() {
    var src = current + '.scss';        

    return gulp.src(src)
      .pipe(newer(destination)
      .pipe(plumber())
      .pipe(sass())
      .pipe(gulp.dest(destination))
});

这并不是世界上最灵活的东西(特别是对于基本网址的嵌套目录),但有点像你想要的那样。如果没有这个技巧,gulp-cached也几乎可以获得你想要的位置,但是具有相同的NOT-compile-partials问题。

答案 3 :(得分:0)

https://www.npmjs.com/package/gulp-changed

  

默认情况下,它只能检测流中的文件   改变。

我猜你可能想要这个:https://github.com/floatdrop/gulp-watch

答案 4 :(得分:0)

我使用https://github.com/vigetlabs/gulp-starter作为https://github.com/berstend/gulp-sass-inheritance

的模板

它有效但只有2级深度

var gulp            = require('gulp');
var debug           = require('gulp-debug');
var browserSync     = require('browser-sync');
var sass            = require('gulp-sass');
var sourcemaps      = require('gulp-sourcemaps');
var handleErrors    = require('../lib/handleErrors');
var autoprefixer    = require('gulp-autoprefixer');
var path            = require('path');
var cached          = require('gulp-cached');
var sassInheritance = require('gulp-sass-inheritance');
var gulpif          = require('gulp-if');
var filter          = require('gulp-filter');
var duration        = require('gulp-duration');
var notify          = require('gulp-notify');

var paths = {
    src : 'app/styles',
    dest: 'grails-app/assets'
}


var isPartial = function (file) {
    return /_/.test(file.relative);
}

//set global.isWatching = true on gulp watch

gulp.task('css', function () {
    return gulp.src(paths.src)
        //.pipe(debug({title: 'before cache:'}))
        .pipe(gulpif(global.isWatching, cached('sass')))
        //.pipe(gulpif(global.isWatching, debug({title: 'after cache:'})))
        .pipe(gulpif(isPartial, sassInheritance({dir: path.join(config.root.src, config.tasks.css.src), debug: false}).on('error', handleErrors))) //,
        .pipe(debug({title: 'after sassInheritance:'}))         
        //.pipe(debug({title: 'after filter:'}))
        .pipe(sourcemaps.init())
        .pipe(sass()).on('error', handleErrors)
        .pipe(debug({title: 'after sass:'}))
        //.pipe(notify('Sass compiled <%= file.relative %>'))
        .pipe(autoprefixer(config.tasks.css.autoprefixer))
        .pipe(sourcemaps.write())
        .pipe(gulp.dest(paths.dest))
        //.pipe(duration('after sass'))
        .pipe(debug({title: 'before browserSync:'}))
        .pipe(browserSync.reload({stream: true}))
})

答案 5 :(得分:0)

这是一个很好的问题。我遇到了这个问题,经过大量的时间摆脱了这个问题。因为当时我在网上找不到消除这些问题的方法。

  • 无礼

    • 摘要
      • _base.scss
    • 基地
    • 组件
    • 布局
    • 页面
    • 主题
    • 供应商
  • main.scss

main.scss

@import 'sass/abstracts/base';

const gulp = require('gulp');
const sass = require('gulp-sass');
const rename = require('gulp-rename');
const browserSync = require('browser-sync');
const gulpSequence = require('gulp-sequence');
const sassInheritance = require('gulp-sass-inheritance');
const filter = require('gulp-filter');
var cached = require('gulp-cached');
var gulpif = require('gulp-if');


gulp.task('sass', function() {
    return gulp.src('sass/main.scss')

    
    //filter out unchanged scss files, only works when watching
    .pipe(gulpif(global.isWatching, cached('sass')))
 
    //find files that depend on the files that have changed
    .pipe(sassInheritance({dir: 'sass'}))
    
    .pipe(filter(function (file) {
        return !/\//.test(file.path) || !/^_/.test(file.relative);
      }))


    .pipe(sass())
    .pipe(rename('style.compile.css'))
    .pipe(gulp.dest('css/'))
    .pipe(browserSync.stream());
})

gulp.task('serve', ['sass'], function () {
    browserSync.init(
        {
            server: "./"
        }
    );

    gulp.watch('sass/abstracts/**/*.scss', ['sass']);;
    gulp.watch('index.html').on('change', browserSync.reload);
});

运行gulp serve