Есть ли способ автоматически генерировать список bundledDependencies? - PullRequest
13 голосов
/ 11 марта 2012

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

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

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

Ответы [ 2 ]

10 голосов
/ 15 декабря 2012

Как насчет реализации задачи 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.

Комментатор упомянул модуль npm, который может быть полезен: https://www.npmjs.com/package/grunt-bundled-dependencies (я не пробовал.)

0 голосов
/ 18 января 2018

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

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

  • 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: запускать ДО того, как пакет подготовлен и упакован, ТОЛЬКО на нпм публиковать. (См. Ниже.)

prepack: запускать ДО упаковывания тарболла (в пакете npm, публикации npm и при установке git-зависимостей)

package.json

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

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

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

...