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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果输入文件丢失,有没有办法让Grunt插件失败?相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

答案

files array format中,如果文件不存在,您可以使用nonull: true发出警告:

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

Now force Grunt to stop通过将grunt.log.warn包装在您自己的函数中发出警告:

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

以上将停止任何警告。但是如果缺少源文件,我们想要停止。在'源文件...未找到'上过滤Grunt警告:

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

要在文件丢失时触发错误,您可以创建一个filter函数。


   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},

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

以上是关于如果输入文件丢失,有没有办法让Grunt插件失败?的主要内容,如果未能解决你的问题,请参考以下文章

npm脚本的时间/性能指标

Grunt常用插件及示例说明

sql server 2000,Log.LDF文件丢失,附加数据库失败的解决办法[转]

Xcode 7.2更新插件失败的解决办法

grunt的使用方法,环境配置和插件安装

电脑丢失dll文件怎么恢复