2012-03-11 2 views
13

У меня есть приложение, которое я развертываю в Nodejitsu. Недавно они пострадали от проблем с npm, из-за которых мое приложение отключилось в автономном режиме в течение нескольких часов после того, как я попробовал (и не смог) перезагрузить его, поскольку его зависимости не могут быть установлены. Мне сказали, что это можно предотвратить в будущем, перечисляя все мои зависимости как bundledDependencies в моем пакете. Json, вызывая загрузку зависимостей вместе с остальной частью приложения. Это означает, что мне нужен мой package.json выглядеть примерно так:Есть ли способ автоматически генерировать список связанных списков?

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

Теперь на СУХИХ основаниях, это непривлекательно. Но что еще хуже - это обслуживание: каждый раз, когда я добавляю или удаляю зависимость, я должен внести изменения в два места. Есть ли команда, которую я могу использовать для синхронизации bundledDependencies с dependencies?

+0

PING :) Это ответ на ваш вопрос или есть что-то еще для решения? – wprl

ответ

10

Как насчет реализации задачи grunt.js? Это работает:

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

}; 

Положи в корневой директории вашего проекта в файле с именем grunt.js. Чтобы установить grunt, используйте npm: npm install -g grunt. Затем сверните пакеты, выполнив grunt bundle.

commentor упомянутый модуль НПМ, которые могут быть полезны: (. Я не пробовал) https://www.npmjs.com/package/grunt-bundled-dependencies

+0

взял ваш ответ и сделал библиотеку. Https://github.com/GuyMograbi/grunt-bundled-dependencies. пожалуйста, добавьте свой ответ. –

0

Вы можете использовать простой Node.js скрипт для чтения и обновления bundleDependencies собственности и запустить его с помощью НПМ крючки/сценарии жизненного цикла.

Моя структура папок:

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

Если вы используете последнюю версию npm (> 4.0.0) , вы можете использовать prepublishOnly или prepack сценарий: https://docs.npmjs.com/misc/scripts

prepublishOnly: Запуск ПЕРЕД пакет подготовлен и упакован, только на НПМ публиковать. (См. Ниже)

расфасовывать: запустить ДО тарболла упакован (на НПМ упаковке, НПМ публиковать и при установке зависимостей GIT)

package.json:

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

Вы можете проверить это самостоятельно, запустив npm run update-bundle-dependencies.

Надеюсь, это поможет!

Смежные вопросы