13

我有一个要部署到 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

4

2 回答 2

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 (我还没有尝试过。)

于 2012-12-14T21:57:48.560 回答
2

您可以使用简单的 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),则可以使用prepublishOnlyorprepack脚本: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

希望这可以帮助!

于 2018-01-18T20:47:19.157 回答