7

所以我正在使用Gulp Sasswith gulp-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。

4

6 回答 6

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 文件混合)。

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

于 2016-06-18T08:17:27.953 回答
2

尝试 var SRC = './stylesheets/**/{*.scss,_*.scss}'; 部分是否位于同一文件夹或子文件夹中。

于 2018-02-02T21:18:16.457 回答
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))
});

并不是世界上最灵活的东西(尤其是对于基本 url 的嵌套目录),但有点像你想去的地方。gulp-cached 也几乎可以在没有这种技巧的情况下到达您想要的位置,但具有相同的不会编译部分问题。

于 2015-06-09T14:29:34.963 回答
0

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

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

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

于 2015-06-10T17:54:18.130 回答
0

这是一个很好的问题。我遇到了这个问题,并在很长一段时间后解决了这个问题。因为当时我在网上没有找到这样的东西来摆脱它。

  • 粗鲁的

    • 摘要
      • _base.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

于 2018-11-29T10:24:20.517 回答
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}))
})
于 2015-11-05T23:50:38.320 回答