2012-03-11 12 views
13

Ho un'app che sto distribuendo su Nodejitsu. Recentemente, hanno sofferto di problemi di npm che hanno causato il mio app offline per diverse ore dopo aver provato (e non riuscito) a riavviarlo, poiché non è stato possibile installare le sue dipendenze. Mi è stato detto che questo potrebbe essere evitato in futuro elencando tutte le mie dipendenze come bundledDependencies nel mio package.json, causando il caricamento delle dipendenze insieme al resto dell'applicazione. Il che significa che ho bisogno del mio package.json a cercare qualcosa di simile:C'è un modo per generare automaticamente l'elenco di bundledDependencies?

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

Ora, su terreni asciutti, questo è poco attraente. Ma la cosa peggiore è la manutenzione: ogni volta che aggiungo o togli una dipendenza, devo fare la modifica in due punti. C'è un comando che posso usare per sincronizzare bundledDependencies con dependencies?

+0

PING :) Questo ha risposto alla tua domanda o c'è qualcos'altro da risolvere? – wprl

risposta

10

Cosa ne pensi di implementare l'attività grunt.js per farlo? Questo funziona:

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, ' ')); 
    }); 

}; 

Metti che nella directory principale del progetto in un file chiamato grunt.js. Per installare grunt, utilizzare npm: npm install -g grunt. Quindi raggruppa i pacchetti eseguendo grunt bundle.

Un commentor menzionato un modulo NPM che potrebbe essere utile: (. Io non l'ho provato) https://www.npmjs.com/package/grunt-bundled-dependencies

+0

ha preso la tua risposta e ha creato una biblioteca .. https://github.com/GuyMograbi/grunt-bundled-dependencies. per favore considera di aggiungere alla tua risposta. –

0

È possibile utilizzare un semplice script Node.js di leggere e aggiornare la proprietà bundleDependencies ed eseguirlo tramite NPM ganci/script del ciclo di vita.

La mia struttura di cartelle è:

  • 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"); 

Se si utilizza l'ultima versione di npm (> 4.0.0) , puoi usare prepublishOnly o prepack script: https://docs.npmjs.com/misc/scripts

prepublishOnly: Eseguire prima che il pacchetto viene preparato e confezionato, solo su NPM pubblicare. (Vedi sotto).

prepack: eseguire prima un tarball è ricco (su NPM pack, NPM pubblicare e durante l'installazione di dipendenze git)

package.json:

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

è possibile verificare te stesso eseguendo npm run update-bundle-dependencies.

Spero che questo aiuti!

Problemi correlati