2012-03-11 13 views
13

Tengo una aplicación que estoy implementando en Nodejitsu. Recientemente, sufrieron problemas de npm que causaron que mi aplicación se desconectara durante varias horas después de que intenté (y no lo logré) reiniciar, ya que sus dependencias no se pudieron instalar. Me dijeron que esto podría evitarse en el futuro al enumerar todas mis dependencias como bundledDependencies en mi paquete.json, haciendo que las dependencias se suban junto con el resto de la aplicación. Lo que significa que necesito mi package.json a ser algo como esto:¿Hay alguna forma de generar automáticamente la lista de paquetes incluidos?

"dependencies": { 
    "express": "2.5.8", 
    "mongoose": "2.5.9", 
    "stylus": "0.24.0" 
}, 
"bundledDependencies": [ 
    "express", 
    "mongoose", 
    "stylus" 
] 

Ahora, por motivos de tintorería, esto es poco atractivo. Pero lo que es peor es el mantenimiento: cada vez que agrego o elimino una dependencia, tengo que hacer el cambio en dos lugares. ¿Hay algún comando que pueda usar para sincronizar bundledDependencies con dependencies?

+0

PING :) ¿Respondió esto a su pregunta o hay algo más por resolver? – wprl

Respuesta

10

¿Qué hay de la implementación de una tarea grunt.js para hacerlo? Esto funciona:

module.exports = function(grunt) { 

    grunt.registerTask('bundle', 'A task that bundles all dependencies.', function() { 
    // "package" is a reserved word so it's abbreviated to "pkg" 
    var pkg = grunt.file.readJSON('./package.json'); 
    // set the bundled dependencies to the keys of the dependencies property 
    pkg.bundledDependencies = Object.keys(pkg.dependencies); 
    // write back to package.json and indent with two spaces 
    grunt.file.write('./package.json', JSON.stringify(pkg, undefined, ' ')); 
    }); 

}; 

poner esto en el directorio raíz de su proyecto en un archivo llamado grunt.js. Para instalar grunt, use npm: npm install -g grunt. A continuación, agrupe los paquetes ejecutando grunt bundle.

Un commentor menciona un módulo de NPM que podrían ser útiles: (. Yo no lo he probado) https://www.npmjs.com/package/grunt-bundled-dependencies

+0

tomó su respuesta e hizo una biblioteca .. https://github.com/GuyMograbi/grunt-bundled-dependencies. por favor, considere agregar a su respuesta. –

0

Se puede utilizar un simple script de Node.js para leer y actualizar la propiedad bundleDependencies y ejecutarlo a través de la NGP ganchos/scripts del ciclo de vida.

Mi estructura de carpetas es:

  • scripts/update-bundle-dependencies.js
  • package.json

scripts/update-bundle-dependencies.js:

#!/usr/bin/env node 
const fs = require('fs'); 
const path = require('path');  
const pkgPath = path.resolve(__dirname, "../package.json"); 
const pkg = require(pkgPath); 
pkg.bundleDependencies = Object.keys(pkg.dependencies);  
const newPkgContents = JSON.stringify(pkg, null, 2);  
fs.writeFileSync(pkgPath, newPkgContents); 
console.log("Updated bundleDependencies"); 

Si está utilizando la versión más reciente de npm (> 4.0.0) , puedes usar el prepublishOnly o prepack guión: https://docs.npmjs.com/misc/scripts

prepublishOnly: Ejecutar antes de que el paquete se prepara y se envasa, SOLAMENTE en NPM publicar. (Ver más abajo.)

preenvasado: Ejecutar antes de un archivo comprimido está lleno (el paquete de la NGP, la NGP publicar y al instalar dependencias git)

package.json:

{ 
    "scripts": { 
    "prepack": "npm run update-bundle-dependencies", 
    "update-bundle-dependencies": "node scripts/update-bundle-dependencies" 
    } 
} 

usted puede probar usted mismo ejecutando npm run update-bundle-dependencies.

Espero que esto ayude!

Cuestiones relacionadas