2012-03-11 3 views
13

Mam aplikację, którą wdrażam w Nodejitsu. Ostatnio wystąpiły problemy z npm, które spowodowały, że moja aplikacja wyłączyła się na kilka godzin po tym, jak spróbowałem (i nie udało się) uruchomić ją ponownie, ponieważ jej zależności nie mogły zostać zainstalowane. Powiedziano mi, że można to w przyszłości zapobiec, wymieniając wszystkie moje zależności jako bundledDependencies w moim pliku package.json, powodując przesyłanie zależności wraz z resztą aplikacji. Co oznacza, że ​​muszę mój package.json wyglądać mniej więcej tak:Czy istnieje sposób automatycznego generowania listy dołączanych powiązań?

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

Teraz, na suchym terenie, to jest nieprzyjemne. Ale co gorsza, to konserwacja: za każdym razem, gdy dodaję lub usuwam zależność, muszę dokonać zmiany w dwóch miejscach. Czy istnieje polecenie synchronizacji bundledDependencies z dependencies?

+0

PING :) Czy ta odpowiedź stanowiła Twoje pytanie lub czy jest jeszcze coś do rozwiązania? – wprl

Odpowiedz

10

Co powiesz na wykonanie zadania grunt.js? To działa:

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

}; 

Put, że w katalogu głównym projektu w pliku o nazwie grunt.js. Aby zainstalować grunt, użyj npm: npm install -g grunt. Następnie pakuj pakiety, wykonując grunt bundle.

commentor wymienić moduł npm, które mogą być użyteczne: (. Nie próbowałem go) https://www.npmjs.com/package/grunt-bundled-dependencies

+0

wziął twoją odpowiedź i zrobił bibliotekę .. https://github.com/GuyMograbi/grunt-bundled-dependencies. rozważ dodanie do swojej odpowiedzi. –

0

Można użyć prostego node.js skrypt czytać i zaktualizuj właściwość bundleDependencies i uruchomić go przez KMP haki/skrypty cyklu życia.

Moja struktura folderów jest:

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

Jeśli korzystasz z najnowszej wersji npm (> 4.0.0) , możesz użyć prepublishOnly lub prepack scenariusz: https://docs.npmjs.com/misc/scripts

prepublishOnly: biec zanim pakiet zostanie przygotowany i zapakowany, tylko na npm opublikować. (Patrz poniżej).

prepack: uruchom przed archiwum jest zapakowany (na npm paczki, npm publikować i podczas instalowania zależności GIT)

package.json:

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

można przetestować samodzielnie, uruchamiając npm run update-bundle-dependencies.

Mam nadzieję, że to pomoże!