我不确定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
文件,然后搜索子依赖项等。这种方法似乎很麻烦,可能是许多项目的常见场景。 ..
答案 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' ,情况也是如此。