如果输入文件丢失,有没有办法导致 Grunt 插件失败

Is there a way to cause a Grunt plugin to fail if input files are missing?

本文关键字:Grunt 失败 插件 有没有 文件 输入 如果      更新时间:2023-09-26

我一直在使用Grunt cssmin插件。我的 Gruntfile 中有一个块,它看起来像这样:

cssmin: {
    target: {
        files: {
            '<%= config.target %>/mytarget.css': [
                'bower_components/normalize.css/*.css',
                'bower_components/html5-boilerplate/css/main.css',
                '<%= config.src %>/css/*.css'
            ]
        }
    }
}

有一段时间这工作正常;但我把它移到另一台机器上,没有正确设置我的 bower 组件 - html5-boilerplate/css/main.css文件丢失 - 但任务仍然成功完成。事实上,我可以在该数组中放置完全假的路径,并且缩小仍然完成。

一般来说,如果有办法导致 Grunt 失败并在这样的数组中丢失文件时退出?(我不确定文件数组是通用的 Grunt 概念还是 cssmin 提供的概念)。如果没有,有没有办法导致这个特定的插件失败?

(顺便说一下,我知道HTML5样板现在可能有些过时,但我正在迁移一个旧网站。我还修复了我的 Bower 安装过程,以便它现在自动在此步骤之前运行。不过,我仍然想了解丢失文件问题的更通用的解决方案)。

在文件数组格式中,如果文件不存在,您可以使用 nonull: true 引发警告:

files: [
  {
    src: [
      'a.js',
      'b.js',
    ],
    dest: 'c.js',
    nonull: true
  }
]

现在通过将 grunt.log.warn 包装在您自己的函数中来强制 Grunt 停止警告:

var gruntLogWarn = grunt.log.warn;
grunt.log.warn = function(error) {
    gruntLogWarn(error); // The original warning.
    grunt.fail.warn('Stop! Hammer time.'); // Forced stop.
};

以上将在任何警告时停止。但是,如果缺少源文件,我们希望停止。过滤"源文件...未找到。

var gruntLogWarn = grunt.log.warn;
grunt.log.warn = function(error) {
  var pattern = new RegExp("^Source file (.*) not found.$");
  if (pattern.test(error)) {
    grunt.fail.warn(error);
  } else {
    gruntLogWarn(error);
  }
};

您可以创建一个cssmin 之前的任务。

grunt.task.registerTask('checkIfFilesExist','',function(){
  // Check for those files here. Throw if something's wrong.
});
grunt.task.registerTask('checkBeforeDoingStuff',[
  'checkIfFilesExist',
  'cssmin'
]);

iirc,您可以在cssmin任务中重用相同的参数,只需通过<% %>引用它们即可。

Grunt 选项nonull: true应该处理这个问题,但它并不总是适用于所有任务。对我来说,它适用于htmlminphpmin但不适用于cssminuglifyJS

要在文件丢失时触发错误,您可以改为创建过滤器函数。


   var checkFileExists = function(filepath) {
    if (!grunt.file.exists(filepath)) {
      grunt.fail.warn('Could not find file: ' + filepath);
    } else {
      return true;
    }
  };
{ src: ['<%= meta.srcPath %>/index.php'], dest: '<%= meta.deployPath %>/index.php', filter: checkFileExists, nonull: true},
使用

上面的脚本,它现在可以完美地与我测试过的每个任务配合使用。