tutorial que yeoman yeoman-generator

que - ¿Pueden los generadores Yeoman actualizar archivos existentes?



que es yeoman (3)

En combinación con la excelente respuesta de @sepans, en lugar de usar expresiones regulares, se puede usar un analizador.

De la documentation Yeoman:

Consejo: actualiza el contenido del archivo existente

Actualizar un archivo preexistente no siempre es una tarea simple. La forma más confiable de hacerlo es analizar el archivo AST y editarlo. El principal problema con esta solución es que la edición de un AST puede ser detallada y un poco difícil de comprender.

Algunos analizadores de AST populares son:

  • Cheerio para analizar HTML.
  • Esprima para analizar JavaScript: es posible que le interese AST-Query que proporciona una API de nivel inferior para editar el árbol de sintaxis Esprima.
  • Para archivos JSON, puede utilizar los métodos de objetos JSON nativos.

Analizar un archivo de código con RegEx es una ruta peligrosa, y antes de hacerlo, debe leer las respuestas antropológicas de este CS y comprender los defectos del análisis RegEx. Si elige editar los archivos existentes utilizando RegEx en lugar del árbol AST, tenga cuidado y proporcione pruebas unitarias completas. - Por favor, no rompas el código de tus usuarios.

Más específicamente, cuando utilice esprima probablemente necesitará también algún generador como escodegen para generar js de vuelta.

var templatePath = this.destinationPath(...); this.fs.copy(templatePath, templatePath, { process: function (content) { // here use the parser return ... } });

Tenga en cuenta que puede usar la misma ruta from , to argumentos para reemplazar el archivo existente.

Por otro lado, la desventaja de estos analizadores es que, en algunos casos, puede alterar demasiado el archivo original y, aunque es seguro, esto es más intrusivo.

Así que solo para darle un poco de contexto, estoy tratando de crear un generador que creará algunos archivos (basado en las aportaciones de los usuarios, por supuesto) y también actualizará algunos archivos existentes en el proyecto (como agregar una nueva ruta, por ejemplo).

Crear los archivos usando this.template no es un problema ... la pregunta es: ¿hay alguna manera de hacer esto con Yeoman sin tener que leer el archivo usando Node y hacer un extravagante descubrimiento y reemplazo?


Ok, entonces encontré la respuesta a mi pregunta.

Addy Osmani me mostró dónde buscar en este hilo en Twitter , y luego encontré este enlace que muestra exactamente lo que necesito.

La esencia de esto se reduce a dos funciones: readFileAsString y write . El uso es el siguiente:

var path = "/path/to/file.html", file = this.readFileAsString(path); /* make modifications to the file string here */ this.write(path, file);

Edit: También he blogeado sobre esto en mi blog .

EDITAR 1

Como se menciona en los comentarios de Toilal:

El método de write ya no existe, y debe ser reemplazado por writeFileFromString (los argumentos también se invierten) - Toilal

Editar 2

Y luego, como se menciona en los comentarios de ivoba:

this.writeFileFromString y this.readFileAsString están en desuso, github.com/yeoman/html-wiring ya debe ser usado, las cosas cambian :) - ivoba


Yeoman también proporciona una forma más elegante de operaciones fs usando mem-fs-editor .

Puede usar this.fs.copy , pasando una función de proceso como una opción para hacer cualquier modificación al contenido:

this.fs.copy(path, newPath, { process: function(content) { /* Any modification goes here. Note that contents is a Buffer object */ var regEx = new RegExp(''old string'', ''g''); var newContent = content.toString().replace(regEx, ''new string''); return newContent; } });

De esta manera también puedes aprovechar las características de mem-fs-editor .