world tutorial nodejs hello yeoman yeoman-generator

tutorial - ¿Cuál es la forma recomendada de copiar varios archivos de puntos con yeoman?



yeoman generator generator (4)

Acabo de hacer que esto funcione para mí: las opciones globales deben estar en el cuarto argumento:

this.fs.copyTpl( this.templatePath(''sometemplate/**/*''), this.destinationPath(this.destinationRoot()), { ...template args }, undefined, { globOptions: { dot: true } } );

Estoy construyendo un generador de yeoman para una aplicación de nodo bastante típica:

/ |--package.json |--.gitignore |--.travis.yml |--README.md |--app/ |--index.js |--models |--views |--controllers

En la carpeta de plantillas de mi generador de yeoman, tengo que cambiar el nombre de los archivos de puntos (y package.json) para evitar que se procesen como parte del generador:

templates/ |--_package.json |--_gitignore |--_travis.yml |--README.md |--app/ |--index.js |--models |--views |--controllers

Veo muchos generadores que copian archivos de puntos individualmente:

this.copy(''_package.json'', ''package.json'') this.copy(''_gitignore'', ''.gitignore'') this.copy(''_gitattributes'', ''.gitattributes'')

Creo que es un dolor cambiar manualmente el código de mi generador cuando agrego nuevos archivos de plantilla. Me gustaría copiar automáticamente todos los archivos en la carpeta / templates, y renombrar los que tienen el prefijo _.

¿Cuál es la mejor manera de hacer esto?

Si tuviera que describir mi intención en expresiones regulares imaginarias, así se vería:

this.copy(/^_(.*)/, ''.$1'') ths.copy(/^[^_]/)

EDITAR Esto es lo mejor que puedo manejar:

this.expandFiles(''**'', { cwd: this.sourceRoot() }).map(function() { this.copy file, file.replace(/^_/, ''.'') }, this);


Agregando a la respuesta de @callumacrae: también puede definir dot: true en las globOptions de copy() . De esa manera a /** glob incluirá archivos de puntos. Ejemplo:

this.fs.copy( this.templatePath(''files/**''), this.destinationPath(''client''), { globOptions: { dot: true } } );

Puede encontrar una lista de las opciones Glob disponibles en el README de node-glob .


Encontré esta pregunta en Google mientras buscaba la solución, y luego la resolví yo misma.

Usando la nueva API de fs , puedes usar globs!

// Copy all non-dotfiles this.fs.copy( this.templatePath(''static/**/*''), this.destinationRoot() ); // Copy all dotfiles this.fs.copy( this.templatePath(''static/.*''), this.destinationRoot() );


Si no desea usar plantillas que comiencen con un punto, puede usar el módulo de dive para lograr algo idéntico:

var templatePath = this.templatePath(''static-dotfiles''); var destinationRoot = this.destinationRoot(); dive(templatePath, {all: true}, function (err, file, stat) { if (err) throw err; this.fs.copy( file, (destinationRoot + path.sep + path.relative(templatePath, file)) .replace(path.sep + ''_'', path.sep + ''.'') ); }.bind(this));

donde static-dotfiles es el nombre de la carpeta de plantillas para los archivos de puntos donde _ reemplaza . en nombres de archivos (ej: _gitignore ).

No olvide agregar un requisito para dive en la parte superior de su generador con

var dive = require(''dive'');

Por supuesto, esto también funciona para copyTpl .

Tenga en cuenta que todas las subpartes de rutas que comiencen con un _ serán reemplazadas por a . (por ejemplo: static-dotfiles/_config/_gitignore se generará como .config/.gitignore )