Есть ли способ автоматически генерировать список связанных списков?
У меня есть приложение, которое я развертываю в 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
?
Ответы
Ответ 1
Как насчет реализации grunt.js задачи для этого? Это работает:
module.exports = function(grunt) {
grunt.registerTask('bundle', 'A task that bundles all dependencies.', function () {
// "package" is a reserved word so it 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 (я не пробовал).
Ответ 2
Вы можете использовать простой Node.js script для чтения и обновления свойства 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
script: https://docs.npmjs.com/misc/scripts
prepublishOnly: запустите ПЕРЕД упаковкой, упакованной, ТОЛЬКО на npm publish. (См. Ниже.)
prepack: запустите до того, как tarball упакован (на npm pack, npm publish, и при установке зависимостей git)
package.json
:
{
"scripts": {
"prepack": "npm run update-bundle-dependencies",
"update-bundle-dependencies": "node scripts/update-bundle-dependencies"
}
}
Вы можете проверить его самостоятельно, запустив npm run update-bundle-dependencies
.
Надеюсь, это поможет!