这是关于使用 Grunt.js 进行动态文件映射的一般性问题,但出于示例目的,我将尝试在项目中构建 coffee 文件动态结构:
在这里,我可以拥有不同深度的多个(动态)目标文件夹。查找 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'
}
]
}
}
你将如何实现这一目标?
答案 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/'
虽然它可能看起来很简单(而且很难看),但它是最慢的选择并且感觉最错误。
那么。这是可能的,但很可能不是你真正想要的。