当依赖/子项(@import)更改时,gulp 编译所有父 sass 文件

Mic*_*ael 2 sass gulp gulp-sass

我有一个相当大的代码库,其中包含多个共享通用 sass 模块的项目。

我还有一个非常复杂的 gulpfiles 设置,用于运行许多任务的每个模块。

我遇到的一个问题是在更新单个共享 sass 模块时能够在多个项目上运行 sass 任务。

例如:

Project 1 file.scss
   @import "shared-child.scss"

Project 2 file.scss
   @import "shared-child.scss"

Project 3 file.scss
       @import "shared-child.scss"
Run Code Online (Sandbox Code Playgroud)

这种情况经常发生。当我更新shared-child.scss 时,我希望所有包含shared-child.scss 的项目文件都重新编译。

因此,当我在shared-child.scss上运行gulp sass 任务时,它会反过来知道它在各个项目(即项目 1、项目 2、项目 3)中的位置,并运行相应的 gulp 任务以包括对共享 child.scss

就权利而言,我在项目 gulp.watching 中的所有包含文件中都有父文件进行更改,但反之亦然是问题所在。更新孩子并让父母重新编译。

任何有关如何实现这一点的信息将不胜感激。

fre*_*nte 5

不完全是您想要的,但我使用它来避免部分/包含/子项被单独解析。

var gulp = require('gulp');
var filter = require('gulp-filter');
var sass = require('gulp-sass');

gulp.task('styles', function () {
    return gulp.src('app/css/**/*.scss')
        .pipe(filter(noPartials))//avoid compiling SCSS partials
        .pipe(sass())
        .pipe(gulp.dest('dist'));
});
Run Code Online (Sandbox Code Playgroud)

您应该查看所有文件,包括部分文件,以便在它们更改时也触发任务。

gulp.task('watch', function() {
  gulp.watch('app/css/**/*.scss', ['styles']); //watch ALL the SCSS files
});
Run Code Online (Sandbox Code Playgroud)

部分由_文件名的开头或包含文件夹的名称识别。

var noPartials = function (file) {
    var path         = require('path');
    var dirSeparator = path.sep.replace('\\', '\\\\');
    var relativePath = path.relative(process.cwd(), file.path);
    return !new RegExp('(^|'+dirSeparator+')_').test(relativePath);
};
Run Code Online (Sandbox Code Playgroud)

唯一的缺点是当任何SCSS 文件更改时,所有非部分文件都将被呈现。


作为旁注:我完全按照你的要求做了,但是对于 Jade(html 模板语言),使用了一个插件来计算依赖树/图。所以可能,如果有人找到一种方法来为 SASS 文件构建该树