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

时间:2013-05-21 11:23:51

标签: javascript coffeescript gruntjs

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

Structure

在这里,我可以拥有不同深度的多个(动态)目标文件夹。查找 coffee 文件仍然很容易,随时都会匹配**/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'
            }
        ]
    }
}

你将如何实现这一目标?

1 个答案:

答案 0 :(得分: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/'

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

那么。这是可能的,但很可能不是你真正想要的。