【发布时间】:2016-04-06 10:02:44
【问题描述】:
我不确定 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 文件,然后搜索子依赖项等。这种方法看起来很麻烦,这可能是许多项目的常见场景......
【问题讨论】:
-
使用 NVM,以便在安装依赖项时可以使用 NPM v2。然后,您将拥有 node_modules 目录的旧嵌套结构,并且您的 grunt 脚本将再次运行。
标签: node.js npm gruntjs npm-install