【问题标题】:Gulp inject ignores css if the dist folder was first cleaned如果首先清理 dist 文件夹,Gulp 注入将忽略 css
【发布时间】:2016-06-08 19:38:05
【问题描述】:

我有一个简单的 gulp 脚本。流程是:

  1. 删除 dist 文件夹
  2. 将 .html 和 .css 文件移动到新的 dist 文件夹
  3. 编译 typescript 并将生成的 .js 移动到 dist 文件夹
  4. 最小化 .js
  5. 将 .js 和 .css 注入 .html

问题是,如果我先删除 dist 文件夹,则注入仅适用于 .js 文件。但是,如果我跳过 dist 文件夹的清理,它会创建一个正确的 .html(因为 index.html 中同时存在 .js 和 .css)。有没有人遇到过这个问题?如果是这样,您是如何解决的?我猜它与流水线有关。

Gulp 版本:“^3.9.1”

var gulp = require('gulp');
var ts = require('gulp-typescript');
var minify = require('gulp-minify');
var inject = require('gulp-inject');
var del = require('del');

gulp.task('default', ['clean'], function () {
    gulp.start('scripts')
});

gulp.task('clean', function (cb) {
    del(['dist'], cb)
});

gulp.task('move', function () {
    console.log('-- gulp is running task "move"');
    gulp.src(['app/**/*.html', 'app/**/*.css'])
        .pipe(gulp.dest('dist'));
});

gulp.task('compile', ['move'], function () {
    console.log('-- gulp is running task "compile"');
    return gulp.src('app/**/*.ts')
        .pipe(ts({
            noImplicitAny: true,
            out: 'app.js'
        }))
        .pipe(gulp.dest('dist'));
});

gulp.task('compress', ['compile'], function () {
    console.log('-- gulp is running task "compress"');
    gulp.src('dist/**/*.js')
        .pipe(minify({
            ext: {
                src: '-debug.js',
                min: '.js'
            },
            noSource: true
        }))
        .pipe(gulp.dest('dist'))
});


gulp.task('scripts', ['compress'], function () {
    console.log('-- gulp is running task "scripts"');
    var target = gulp.src('dist/index.html');
    var sources = gulp.src(['dist/**/*.js', 'dist/**/*.css'], {read: false});
    return target.pipe(inject(sources, {relative: true}))
        .pipe(gulp.dest('dist'));
});

【问题讨论】:

    标签: javascript css gulp gulp-inject


    【解决方案1】:

    您遇到了竞争条件,因为您在多个地方没有正确地发出async completion 的信号:

    del 不接受回调cb,它返回一个Promise。你需要从你的任务中返回这个 Promise:

    gulp.task('clean', function () {
      return del(['dist']);
    });
    

    还需要从您的任务中返回流。你没有在你的movecompress 任务中这样做,这(除其他外)意味着gulp-inject 可能在所有.css 文件被复制到dist/ 之前运行。

    gulp.task('move', function () {
      console.log('-- gulp is running task "move"');
      return gulp.src(['app/**/*.html', 'app/**/*.css'])
        .pipe(gulp.dest('dist'));
    })
    
    gulp.task('compress', ['compile'], function () {
      console.log('-- gulp is running task "compress"');
      return gulp.src('dist/**/*.js')
        .pipe(minify({
            ext: {
                src: '-debug.js',
                min: '.js'
            },
            noSource: true
        }))
        .pipe(gulp.dest('dist'));
    });
    

    【讨论】:

    • 这解决了我的问题。谢谢!请注意,显然我使用的是旧版本的 del(如 1.1.0),其中 del 采用回调函数。我已经对其进行了升级,并为“压缩”和“移动”添加了回报,它就像魅力一样。
    猜你喜欢
    • 2016-07-28
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多