0

这是一个关于使用Grunt.js进行动态文件映射的通用问题,但出于示例目的,我将尝试在具有动态结构的项目中构建咖啡文件:

结构

在这里,我可以有多个(动态)具有不同深度的目标文件夹。查找咖啡文件仍然很容易,它会**/coffee/*.coffee随时匹配。

我想要实现的是使dest属性对于匹配的咖啡文件:

  • 寻找**/coffee/*.coffee
  • 编译为../js/*.js

而不是使其相对于项目文件夹(Gruntfile)。

coffee: {
    compile: {
        files: [
            {
              expand: true,
              src: ['**/coffee/*.coffee'],
              dest: '../js/', // This won't work ! But I wish it could :)
              ext: '.js'
            }
        ]
    }
}

您将如何实现这一目标?

4

1 回答 1

6

我不认为这是一个很好的主意。听起来每个目标都应该是自己的存储库。即使我们忽略这一点,您也会遇到其他问题,例如难以区分目标文件夹和非目标文件夹。例如,您当前的模式可能会匹配node_modules/目录中的 CoffeeScript 文件。

我还发现您的目标具有不同的文件夹结构(即不在同一级别)很coffee/奇怪js/。同样,听起来它们是不同的项目,应该有自己的存储库。

话虽这么说,如果你真的,真的必须那样做,有几种方法可以做到这一点。

首先,“正常”的做法是简单地手动指定多个目标。我将在Gruntfile.coffee这里使用语法:

coffee:
  target1:
    expand: true
    cwd: 'target1/coffee'
    src: '**/*.coffee'
    dest: 'target1/js'
    ext: '.js'
  targetX:
    expand: true
    cwd: 'targetX/some-folder/coffee'
    src: '**/*.coffee'
    dest: 'targetX/some-folder/js'
    ext: '.js'

但是,如果您确定需要动态目标,并且不介意将不需要的文件夹列入黑名单,则可以尝试以下操作:

coffee: do ->
  targets = {}
  for target in grunt.file.expand '**/coffee', '!node_modules/**'
    targets[target.split('/', 1)[0]] =
      expand: true
      cwd: target
      src: '**/*.coffee'
      dest: target + '/../js'
      ext: '.js'
  targets

这基本上与前面的代码片段相同,但增加了一些不确定性。targets/您可以通过让一个文件夹包含所有目标并targets/**/coffee用作模式 来摆脱黑名单。

或者,您可以使用grunt.file.expandMapping

coffee:
  compile:
    files: grunt.file.expandMapping ['**/coffee/**/*.coffee', '!node_modules/**'], '',
      expand: true
      ext: '.js'
      rename: (base, src) ->
        src.replace '/coffee/', '/js/'

虽然它可能看起来有点简单(而且丑陋),但它是最慢的选择并且感觉最错误。

所以在那里。这是可能的,但很可能不是你真正想要的。

于 2013-05-21T14:15:48.770 回答