gruntjs - una - ¿Cómo puedo cambiar el nombre de los archivos con Grunt, según el nombre de la carpeta principal del archivo respectivo?
socket io pdf (5)
Tengo la siguiente estructura:
src/
modules/
module1/
js/
main.js
scss/
main.scss
index.html
module2/
js/
main.js
scss/
main.scss
index.html
Me gustaría ejecutar una tarea ronca para copiarlos en la siguiente estructura:
dev/
js/
module1.js
module2.js
css/
module1.css
module2.css
module1.html
module2.html
¿Hay alguna manera de hacer esto con un plugin existente? Si no, ¿cómo podría lograr esto?
Esto se puede hacer usando el complemento grunt-contrib-copy .
Lo más importante a tener en cuenta es que puede cambiar el destino mediante programación utilizando una función de cambio de nombre (que toma el destino y la fuente de cada archivo).
Aquí hay un Gruntfile.js
muestra (algo quebradizo) que debe copiar a su estructura deseada:
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'']);
};
Si desea cambiar el nombre de los archivos .coffee a .js o similar, simplemente adáptelos;)
sudo npm instalar grunt-contrib-copy
copy: {
rename: {
files: [{
expand: true,
dot: true,
cwd: ''./app/scripts'',
dest: ''./app/scripts/'',
src: [
''**/*.coffee''
],
rename: function(dest, src) {
console.log(dest + src);
return dest + src.replace(''.coffee'',''.js'');
}
}]
}
},
Simplemente puede usar las opciones: expandir: verdadero, aplanar: verdadero
No hay necesidad de cambiar el nombre de devoluciones de llamada.
Ya no es necesario usar grunt-contrib-copy
solo para esto, ahora puede aprovechar grunt.file.expandMapping
que tiene opciones para cambiar la extensión del archivo o para definir una función que devuelva el nombre de archivo de salida.
Aquí hay un ejemplo de un objeto de files
en una tarea de jade
para compilar plantillas de .jade en archivos .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'');
}
}]
Habría sido más fácil usar la opción ext: ''.html''
lugar de la opción de cambio de rename
en este caso, pero estoy usando el rename
aquí para que pueda ver cómo funciona.
Más información sobre las opciones de ext
y rename
(y otras) en los documentos grunt.file . Algunos ejemplos más here y here .
No es exactamente una respuesta a tu pregunta, pero lo hice aquí buscando carpetas de destino relativas con gruñido, así que ... Así es como lo resolví
...
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);
}
},
],
}
...
Este pequeño bit path.join(expand.cwd, src.dir, dest, src.base);
simplemente creando el camino que necesito.
expand.cwd = app/design/frontend/
src.dir = <DYNAMIC_FOLDERS>/Magento_Sales/email-src/
dest = ../../Magento_Sales/email/
src.base = <FILE>.html
y todos juntos = app/design/frontend/<COMPANY>/<MAIN-THEME>/Magento_Sales/email/<FILE>.html
y en mi situación ahora compilará mis correos electrónicos html en carpetas de destino relativas