具有相对目标的动态文件映射

ray*_*nco 0 javascript coffeescript gruntjs

这是关于使用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'
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

你会如何实现这一目标?

Sim*_*nen 6

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

我也觉得很奇怪,你的目标具有不同的文件夹结构(即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'
Run Code Online (Sandbox Code Playgroud)

但是,如果您确定需要拥有动态目标,并且不介意将不需要的文件夹列入黑名单,那么可以尝试以下方法:

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
Run Code Online (Sandbox Code Playgroud)

这基本上与前一个片段相同,但增加了一些不确定性.您可以通过让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/'
Run Code Online (Sandbox Code Playgroud)

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

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