【问题标题】:Gulp default task unable to compress after copyGulp 默认任务复制后无法压缩
【发布时间】:2017-06-01 05:52:46
【问题描述】:

起初我认为这与任务的依赖关系有关,所以我使用运行序列,甚至尝试在任务本身中定义依赖关系。但我无法让compress 任务在copy 之后运行。或者,即使它说它确实完成了压缩任务,只有当我在 Visual Studio 内的任务运行器中单独运行压缩时,压缩才有效。复制后我还能尝试压缩什么?

/// <binding BeforeBuild='default' />
/*
This file is the main entry point for defining Gulp tasks and using Gulp plugins.
Click here to learn more. https://go.microsoft.com/fwlink/?LinkId=518007
*/

var gulp = require("gulp");
var debug = require("gulp-debug");
var del = require("del");
var uglify = require("gulp-uglify");
var pump = require("pump");
var runSequence = require("run-sequence");

var paths = {
    bower: "./bower_components/",
    lib: "./Lib/"
};

var modules = {
    "store-js": ["store-js/dist/store.legacy.js"],
    "bootstrap-select": [
        "bootstrap-select/dist/css/bootstrap-select.css",
        "bootstrap-select/dist/js/bootstrap-select.js",
        "bootstrap-select/dist/js/i18n/*.min.js"
    ]
}

gulp.task("default", function (cb) {
    runSequence("clean", ["copy", "compress"], cb);
});

gulp.task("clean",
    function () {
        return del.sync(["Lib/**", "!Lib", "!Lib/ReadMe.md"]);
    });

gulp.task("compress",
    function (cb) {
        pump([
            gulp.src(paths.lib + "**/*.js"),
            uglify(),
            gulp.dest(paths.lib)
        ], cb);
    });

gulp.task("copy",
    function (cb) {
        prefixPathToModules();
        copyModules();
        cb();
    });

function prefixPathToModules() {
    for (var moduleIndex in modules) {
        for (var fileIndex in modules[moduleIndex]) {
            modules[moduleIndex][fileIndex] = paths.bower + modules[moduleIndex][fileIndex];
        }
    }
}

function copyModules() {
    for (var files in modules) {
        gulp.src(modules[files], { base: paths.bower })
            .pipe(gulp.dest(paths.lib));
    }
}

【问题讨论】:

    标签: gulp gulp-uglify


    【解决方案1】:

    您使用run-sequence 和您的代码

    runSequence("clean", ["copy", "compress"], cb);
    

    按此顺序运行

    1. 干净
    2. 并行复制和压缩//这就是为什么你的代码什么都不压缩,因为你还没有复制文件
    3. cb

    这样写,压缩会在复制后

    runSequence("clean", "copy", "compress", cb);
    

    【讨论】:

    • 也试过了,如果我运行默认任务,压缩步骤永远不会发生。 :(
    【解决方案2】:

    我不熟悉 runSequence。但是,您为什么不尝试以下方法。通过这种方式,您的默认任务取决于压缩和压缩取决于复制。所以,“复制”将首先运行,然后“压缩”

    gulp.task('default', ['copy','compress'], function(cb){});
    
    gulp.task('compress',['copy'], function(cb){});
    

    Gulp 返回一个 steam ,因为您在 for 循环中调用它,所以在第一次迭代本身期间返回流。

    将您的 copyModule 更新为以下内容,您可以尝试运行 Kirill 发布的 runSequence 或按照我的方法进行

       function copyModules() {
                var inputFileArr = [];
                for (var files in modules) { 
                  inputFileArr = inputFileArr.concat(modules[files]);
                };
            return gulp.src(inputFileArr, { base: paths.bower })
                    .pipe(gulp.dest(paths.lib));       
        }
    

    【讨论】:

    • 尝试了这个以及上面的答案,日志显示 [08:11:57] Starting 'copy'... [08:11:57] Finished 'copy' after 15 ms [08 :11:57] 开始“压缩”... [08:11:58] 4.47 毫秒后完成“压缩” [08:11:58] 开始“默认”... [08:11:58] 完成“默认” ' 在 4.53 μs 之后,但最终文件大小不是压缩后的大小。但是如果我自己运行压缩任务,那么最终大小就是压缩后的大小。不知道为什么。
    • 您可以尝试将文件输出到其他位置吗?
    • 嗯,所以我尝试将 compress 中的输出重定向到 gulp.dest("./bin") 并且我应该期望在 bin 目录中看到它对吗?我在那里什么也没看到。
    • 嗯,这很奇怪。您可以尝试一个接一个地运行单个任务。并查看运行每个任务后的结果是否匹配。 1 clean - 检查结果,2 copy,3 compress
    • 是的,单独运行一切正常。它可能与复制运行以实际复制文件的for循环函数有关吗?我觉得这个问题可能与循环有关?
    猜你喜欢
    • 1970-01-01
    • 2017-03-23
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多