Grunt和NPM,打包所有生产依赖项

时间:2016-04-06 10:02:45

标签: node.js npm gruntjs npm-install

我不确定NPM安装依赖项的方式何时发生变化 在过去,我记得如果在我的project.json中我依赖于" abc",而这又依赖于" xyz",npm install会结果如下:

package.json
node_modules/
    abc/
        node_modules/
            xyz/
    some-dev-dep/

在打包我的节点项目以供AWS Lambda使用时,我必须包含node_modules结构(减去那里的任何dev依赖项)。我会使用Grunt作为我的包装,所以我写了这个方便的东西来帮助我将所有生产依赖项放到这个zip中(提取我的gruntfile.js的一部分):

function getDependencies(pkg) {
    return Object.keys(pkg.dependencies)
        .map(function(val) { return val + '/**'; });
}

var config = {
    compress: {
        prod: {
            options: {
                archive: 'public/lambda.zip'
            },
            files: [
                { src: 'index.js', dest: '/' },
                { expand: true, cwd: 'node_modules/', src: getDependencies(pkg), dest: '/node_modules' }
            ]
        }
    }
};

这可以工作,因为我的依赖项的依赖项是嵌套的 最近(或者可能不是最近)这已经发生了变化(我不确定何时使用非常旧版本的NPM并最近更新了它。) 如果我依赖" abc"而这又取决于" xyz"我会得到:

node_modules/
    abc/
    xyz/
    some-dev-dep/

正如您所看到的,我只获得生产依赖性的方法才能胜任 有没有简单的方法来获取grunt作业中的生产依赖项列表(以及子依赖项)? 我可以使用递归函数扫描我的依赖项,然后检查那些的project.json文件,然后搜索子依赖项等。这种方法似乎很麻烦,可能是许多项目的常见场景。 ..

2 个答案:

答案 0 :(得分:1)

这是一个返回生产依赖项模块名称数组的函数。 (注意:您可能需要在项目中本地安装'npm'模块才能使其正常工作。)

/**
 * Returns an array of the node dependencies needed for production.
 * See https://docs.npmjs.com/cli/ls for info on the 'npm ls' command.
*/
var getProdDependencies = function(callback) {
  require('child_process').exec('npm ls --prod=true --parseable=true', undefined,
      function(err, stdout, stderr) {
        var array = stdout.split('\n');
        var nodeModuleNames = [];

        array.forEach(function(line) {
          var index = line.indexOf('node_modules');
          if (index > -1) {
            nodeModuleNames.push(line.substr(index + 13));
          }
        });

        callback(nodeModuleNames);
      });
};

答案 1 :(得分:0)

此更改是在npm 3发布时引入的(请参阅npm v3 Dependency Resolution)。

根本不清楚为什么你需要使用Grunt。如果您想要做的只是生成依赖项,您只需运行:

npm install --production

使用--production标志,将忽略所有dev依赖项。如果NODE_ENV环境变量设置为' production' ,情况也是如此。