仅当使用 gulp 更改了文件时,才编译 sass



我正在尝试重建我的gulp文件以提高效率,并且在使我的styles任务仅在文件更改时才编译时遇到了一些麻烦。

找到了这个问题,但答案似乎对我不起作用。

假设我的回购是这样组织的:

/dev
  /assets
    /styles
      all.css
/src
  /assets
    /styles
      all.scss
      _header.scss
gulpfile.js
package.json

我只想覆盖all.css,如果我的任何一个 Sass 文件进行了更改。因此,如果我在哪里保存_header.scss但没有进行任何更改,并运行我的styles任务,它应该意识到代码没有更改并且没有覆盖all.css

根据我上面链接的问题,我正在查看 gulp-cached,但这似乎对我不起作用。这是最基本的任务:

var gulp = require("gulp"),
    cached = require("gulp-cached"),
    sass = require("gulp-sass");
gulp.task("styles", function() {
    return gulp.src(src + "/assets/styles/all.scss")
        .pipe(sass().on("error", sass.logError))
        .pipe(cached("sass_compile")) // should skip the dest if cache is the same
        .pipe(gulp.dest(dev + "/assets/styles"));
});

在这种情况下,cached管道似乎不起作用。我运行gulp styles,它仍然覆盖所有.css即使没有进行任何更改,即使我什至没有重新保存文件。

我最终想要使用的更复杂的任务是:

var gulp = require("gulp"),
    cached = require("gulp-cached"),
    sourcemaps = require("gulp-sourcemaps"),
    sass = require("gulp-sass"),
    autoprefixer = require("gulp-autoprefixer"),
    // set up environment paths
    src = "./src",
    dev = "./dev",
    dist = "./dist";
gulp.task("styles", function() {
    return gulp.src(src + "/assets/styles/all.scss")
        .pipe(sourcemaps.init())
        .pipe(sass().on("error", sass.logError))
        .pipe(autoprefixer("last 2 version", "ie 8", "ie 9"))
        .pipe(sourcemaps.write())
        .pipe(cached("sass_compile")) // should skip the dest if cache is the same
        .pipe(gulp.dest(dev + "/assets/styles"));
});

将非常感谢对此的一些指导。多谢。


编辑 1:请注意,此演示中的all.scss仅包含 @import "_header";


编辑2:好的,我刚刚发现gulp-cached似乎在watch任务中工作正常。所以修改了问题:如何在监视任务之外获得相同类型的功能?

gulp-newer解决了这个问题,它可以检查导入的文件。相当厉害!这是我的最后一个样式任务:

// styles task, compiles & prefixes SCSS
gulp.task("styles", function () {
    "use strict";
    // development CSS directory
    var cssDirectory = dev + "/assets/styles";
    // production CSS directory (if --dist is passed)
    if (argv.dist) {
        cssDirectory = dist + "/assets/styles";
    }
    // clean directory if --clean is passed
    if (argv.clean) {
        del(cssDirectory + "**/*");
    }
    // compile all SCSS in the root styles directory
    return gulp.src(src + "/assets/styles/*.scss")
        // check if source is newer than destination
        .pipe(newer(cssDirectory + "/all.css"))
        // initialize sourcemap
        .pipe(sourcemaps.init())
        // compile SCSS (compress if --dist is passed)
        .pipe(gulpif(argv.dist, sass({outputStyle: "compressed"}).on("error", sass.logError), sass().on("error", sass.logError)))
        // prefix CSS
        .pipe(autoprefixer("last 2 version", "ie 8", "ie 9"))
        // write the sourcemap (if --dist isn't passed)
        .pipe(gulpif(!argv.dist, sourcemaps.write()))
        // output to the compiled directory
        .pipe(gulp.dest(cssDirectory));
});

尝试 gulp-change 代替。我相信这适用于文件的上次修改日期,这听起来像您想要的。

相关内容

  • 没有找到相关文章

最新更新