有没有办法自动生成bundledDependencies列表?

时间:2012-03-11 02:54:32

标签: node.js npm nodejitsu

我有一个应用程序,我正在部署到Nodejitsu。最近,他们遇到了npm问题导致我的应用程序在我尝试(并且失败)重启后几个小时脱机,因为无法安装依赖项。有人告诉我,将来可以通过在我的package.json中将所有依赖项列为bundledDependencies来避免这种情况,从而导致依赖项与应用程序的其余部分一起上传。这意味着我需要我的package.json看起来像这样:

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

现在,在干旱的情况下,这是没有吸引力的。但更糟糕的是维护:每次添加或删除依赖项时,我都必须在两个地方进行更改。我可以使用命令将bundledDependenciesdependencies同步吗?

2 个答案:

答案 0 :(得分: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捆绑包。

评论员提到了一个非常有用的npm模块:https://www.npmjs.com/package/grunt-bundled-dependencies(我还没试过。)

答案 1 :(得分:0)

您可以使用简单的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),则可以使用prepublishOnlyprepack脚本:https://docs.npmjs.com/misc/scripts

  

prepublishOnly:在准备和打包包之前运行,仅打开   npm发布。 (见下文。)

     

预包装:在压缩包装之前运行(在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来自行测试。

希望这有帮助!