Динамическое сопоставление файлов с относительным назначением

95
12

Это общий вопрос о динамическом сопоставлении файлов с Grunt.js, но для примера я попытаюсь создать файлы кофе в проекте с динамической структурой:

Structure

Здесь я могу иметь несколько (динамических) целевых папок с другой глубиной. Поиск файлов кофе остается легким, он будет в **/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'
}
]
}
}

Как бы вы это достигли?

спросил(а) 2013-05-21T14:23:00+04:00 7 лет, 1 месяц назад
1
Решение
100

Я не думаю, что это очень хорошая идея. Похоже, что каждая цель должна быть собственным хранилищем. Даже если мы проигнорируем это, у вас появятся другие проблемы, такие как сложность сообщения целевых и нецелевых папок. Например, ваш текущий шаблон потенциально может соответствовать файлам 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'

Однако, если вы уверены, что вам нужны динамические цели, и не против черного списка нежелательных папок, возможно, попробуйте что-то вроде этого:

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-21T17:15:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема