如果目录为空,我该如何跳过grunt任务?

8
我正在使用grunt-contrib的concat和uglify模块来处理一些JavaScript。目前,如果src/js/是空的,它们仍会创建一个(空的)concat文件,以及缩小的版本和源映射。
我希望任务在继续之前检测src/js/文件夹是否为空,如果为空,则任务应该跳过(而不是失败)。有什么想法如何做到这一点?

你介意贴出你的 Gruntfile.js 副本吗?你尝试过仅通过 uglify(包括连接)完成所有操作,只是为了测试吗? - Wallace Sidhrée
相关/重复?http://stackoverflow.com/questions/21001469/grunt-file-copy-exclude-empty-folders - nemesv
源代码可以在这里找到:https://github.com/jtfairbank/Milkshake - jtfairbank
我正在尝试解决Gruntfile.js中的第二个和第三个TODO。 - jtfairbank
3个回答

3
解决方案可能不是最漂亮的,但可以给您一个想法。首先,您需要运行类似于“npm install --save-dev glob”的命令。这是基于您提到的“Milkshake”项目的一部分。
grunt.registerTask('build_js', function(){
  // get first task's `src` config property and see
  // if any file matches the glob pattern
  if (grunt.config('concat').js.src.some(function(src){
    return require('glob').sync(src).length;
  })) {
    // if so, run the task chain
    grunt.task.run([
        'trimtrailingspaces:js'
      , 'concat:js'
      , 'uglify:yomama'
    ]);
  }
});

一个用于比较的要点:https://gist.github.com/kosmotaur/61bff2bc807b28a9fcfa

谢谢,这正是我所需要的! - jtfairbank

2
也许这只是一个更加更新的答案,因为其他答案已经超过一年了,但您不需要为此安装插件;您可以使用grunt.file.expand来测试是否存在与某个globbing模式匹配的文件。
@Kosmotaur的答案更新(路径在这里只是硬编码简单化):
grunt.registerTask('build_js', function(){
  // if any file matches the glob pattern
  if (grunt.file.expand("subdir/**/*.js").length) { /** new bit here **/ 
    // if so, run the task chain
    grunt.task.run([
        'trimtrailingspaces:js'
      , 'concat:js'
      , 'uglify:yomama'
    ]);
  }
});

1
谢谢更新,马克!你能提供一些关于你的代码的上下文吗?我应该直接在src字符串值或files数组中使用它吗?还是我应该像@Kosmotaur那样在函数的顶部使用它?如果是这样,你能模仿他的布局并提供一个完整的示例函数吗? - jtfairbank
对我有用,谢谢! - Parashuram

2
使用这个插件:

https://www.npmjs.org/package/grunt-file-exists

您可以检查文件是否存在。(我没有尝试过,但源代码似乎支持grunt expands。(*、** ...))
例如像这样:
grunt.initConfig({
  fileExists: {
    scripts: ['a.js', 'b.js']
  },
});

grunt.registerTask('conditionaltask', [
    'fileExists',
    'maintask',
]);

但是,如果文件不存在,它可能会因为错误而失败,而不是简单地跳过。(我没有测试过。)
如果这是一个问题,你可以稍微修改一下这个插件的源代码,以便在文件存在时运行相关任务:
配置:
grunt.initConfig({
  fileExists: {
    scripts: ['a.js', 'b.js'],
    options: {tasks: ['maintask']}
  },
});

grunt.registerTask('conditionaltask', [
    'fileExists',
]);

"你应该加上这个:"
grunt.task.run(options.tasks);

在这个文件中:

https://github.com/alexeiskachykhin/grunt-file-exists/blob/master/tasks/fileExists.js

在这行之后:
grunt.log.ok();

看起来它会工作,但我更喜欢比使用 grunt-file-exists 的修补版本更清晰的解决方案。 :) - jtfairbank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接