[英]Grunt and NPM, package all production dependencies
我不确定NPM安装依赖项的方式何时更改。
过去我记得,如果在我的project.json
我依赖于“ abc”,而后者又依赖于“ xyz”,那么npm install
会导致类似以下内容:
package.json
node_modules/
abc/
node_modules/
xyz/
some-dev-dep/
在打包要由AWS Lambda使用的节点项目时,我必须包括该node_modules
结构(减去那里的任何开发依赖性)。 我将使用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
文件,然后搜索子依赖项等。这样做似乎很麻烦,这可能是许多项目的常见情况...
这是一个返回生产依赖模块名称数组的函数。 (注意:您可能需要在项目中本地安装“ 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); }); };
此更改是在npm 3发行版中引入的(请参阅npm v3 Dependency Resolution )。
目前还不清楚为什么需要使用Grunt。 如果您只想获取生产依赖项,则可以简单地运行:
npm install --production
使用--production
标志,将忽略所有开发依赖项。 如果将环境变量NODE_ENV
设置为'production',则也是如此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.