Как переименовать файлы с помощью Grunt на основе имени родительской папки соответствующего файла?
У меня есть следующая структура:
src/
modules/
module1/
js/
main.js
scss/
main.scss
index.html
module2/
js/
main.js
scss/
main.scss
index.html
Я хотел бы запустить задачу grunt, чтобы скопировать их в следующую структуру:
dev/
js/
module1.js
module2.js
css/
module1.css
module2.css
module1.html
module2.html
Есть ли способ сделать это с существующим плагином grunt? Если нет, как я могу это достичь?
Ответы
Ответ 1
Это можно сделать с помощью плагина grunt-contrib-copy.
Главное отметить, что вы можете изменить назначение программным путем с помощью функции переименования (которая берет в пункт назначения и источник каждого файла).
Вот (несколько хрупкий) образец Gruntfile.js
, который должен скопировать в желаемую структуру:
module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
copy: {
main: {
files: [
{
expand: true,
cwd: 'src/modules/',
src: ['**/*.js'],
dest: 'dev/js/',
rename: function(dest, src) {
// use the source directory to create the file
// example with your directory structure
// dest = 'dev/js/'
// src = 'module1/js/main.js'
return dest + src.substring(0, src.indexOf('/')) + '.js';
}
},
{
expand: true,
cwd: 'src/modules/',
src: ['**/*.scss'],
dest: 'dev/css/',
rename: function(dest, src) {
return dest + src.substring(0, src.indexOf('/')) + '.css';
}
},
{
expand: true,
cwd: 'src/modules/',
src: ['**/*.html'],
dest: 'dev/',
rename: function(dest, src) {
return dest + src.substring(0, src.indexOf('/')) + '.html';
}
}
]
}
}
});
grunt.loadNpmTasks('grunt-contrib-copy');
// Default task(s).
grunt.registerTask('default', ['copy']);
};
Ответ 2
Нет необходимости использовать grunt-contrib-copy
только для этого, теперь вы можете воспользоваться grunt.file.expandMapping
, у которого есть опции, чтобы просто изменить расширение файла или определить функцию, которая возвращает имя выходного файла.
Вот пример объекта files
в задаче jade
для компиляции шаблонов .jade в .html файлы:
files: [{
expand: true,
src: "**/*.jade",
dest: "<%= distDir %>",
cwd: "<%= assetsDir %>/jade",
rename: function(dest, matchedSrcPath, options) {
// return the destination path and filename:
return (dest + matchedSrcPath).replace('.jade', '.html');
}
}]
В этом случае было бы проще использовать параметр ext: '.html'
вместо опции rename
, но я использую rename
здесь, чтобы вы могли видеть, как это работает.
Подробнее о параметрах ext
и rename
(и других) в файлах grunt.file. Еще несколько примеров здесь и здесь.
Ответ 3
Вы можете просто использовать параметры:
expand: true,
flatten: true
Нет необходимости в пользовательских обратных вызовах переименования.
Ответ 4
Не совсем ответ на ваш вопрос, но я сделал его здесь для поиска относительных dest-папок с хрюканьем, поэтому... Вот как я его решил
...
base: {
files:
[
{
expand: true,
cwd: 'app/design/frontend/',
src: ['**/Magento_Sales/email-src/*.html'],
dest: '../../Magento_Sales/email/',
rename: function(dest, src, expand) {
src = path.parse(src)
return path.join(expand.cwd, src.dir, dest, src.base);
}
},
],
}
...
Этот маленький бит path.join(expand.cwd, src.dir, dest, src.base);
просто создает путь, который мне нужен.
expand.cwd = app/design/frontend/
src.dir = <DYNAMIC_FOLDERS>/Magento_Sales/email-src/
dest = ../../Magento_Sales/email/
src.base = <FILE>.html
и все вместе = = app/design/frontend/<COMPANY>/<MAIN-THEME>/Magento_Sales/email/<FILE>.html
и в моей ситуации он теперь скомпилирует мои html-письма в относительных папках назначения