[英]How to clean node_modules folder of packages that are not in package.json?
[英]How to clean node_modules folder when prepping for deployment
在准备部署代码时,我将如何清理node_modules文件夹。
我正在使用node-webkit创建一个应用程序,并且在捆绑最终版本的应用程序时,由于解压缩过程需要一些时间,因此我希望包含尽可能少的文件。
我查看了npm dedupe
并使用npm install --production
来删除重复项并仅获取生产文件,但是我仍然留下了Readme
文件, benchmarks
, tests
和build
文件,我不需要。
我想在node_modules
文件夹中的每个模块最终node_modules
是LICENSE
文件(如果存在), package.json
以及模块运行所需的任何其他内容,但仅此而已。
问题: 如何自动清理一个SCM提交的node_modules目录有点朝着同一个方向,但它正在谈论提交所以不是我真正想要的。
问题: NPM清洁模块在某种程度上与我的相同,但并不完全相同。
这个答案很有帮助,因为它是dedupe
捆绑最终应用程序的更高效版本。
更新
我尝试了从这里链接的自定义模块,但它似乎无法正常工作,即使在一些摆弄之后。
尽管如此,我还没有找到正确的答案。
这是我正在寻找的一个例子。
在我的项目中,我目前有两个依赖项: socket.io
和socket.io-client
。
它们共计15 MB,包含110个文件夹中的550个文件。
手动清理readme
, makefile
, VC++
构建文件,如.pdb
和.obj
以及其他不必要的文件我能够将它缩小到2.74 MB ,在73个文件夹中有265个文件。
这只有两个模块。
我想知道是否有办法自动执行此操作,最好是使用npm
。
此模块尝试智能清理node_modules文件夹:
安装:
npm install modclean -g
要么
npm install modclean --save-dev
用法:
modclean
它使用一组默认模式从整个依赖关系树中的模块中删除不必要的膨胀。
很好地清理node_modules
以便为webkit应用程序部署,这有点困难,因为node_modules
目录下的模块安装有或没有测试文件的其他misc文件,所以,如果模块的所有者,已经声明了.npmignore
文件使用dir /文件(例如tests
或examples
当所有者发布其模块时,这些将被排除在打包过程之外,但它将正常存在于存储库(git)中。
上面的内容留在模块所有者手中,如果他/她“忘记”制作一个,那么包装将包含几乎所有内容。
socket.io
或socket.io-client
的development
包,这并不意味着您必须使用npm install socket.io --save-dev
,一个简单的npm install socket.io -V
会安装由其所有者上传的生产包。
grunt
任务,清理你的整个node_modules
,你想的那样。
将有两条规则
test
或tests
目录或*test*.js
文件 build
目录(不确定它有时可能包含一些必要的二进制文件) history.md
使用NPM安装的模块不应包含开发文件(即基准测试,测试等)。 如果包含它们,您应该联系模块维护者并要求将它们添加到.npmignore
。
注意:在这种情况下,开发文件是指开发实际模块而不是应用程序所需的文件。
之前已经提出过建议,但是在grunt
deploy
任务可能是一个好主意。 只需确保在清理后test
应用程序。 grunt-contrib-clean
非常适合清洁。
见.npmignore
从connect
的一些想法上的文件/目录不应该是在生产包装。
也许你有兴趣在这个小find
命令,我已经召集了一段时间。 请注意,这不是一个“万能的”解决方案! 您需要根据您的要求仔细检查。 它适用于node.js环境,肯定会破坏浏览器环境。 我在postinstall
脚本中运行作为npm中的postinstall
脚本。
不要盲目复制'N PASTE 。 你被警告了!
find node_modules \( \( -name "dist" -or -name "ts" -or -name "logos" -or -name "min" -or -name "test*" -or -name "doc*" -or -name "tst" -or -name "example*" -or -name "build" -or -name "man" -or -name "benchmark*" \) -and -type d \) -or \
\( \( -iname "readme*" -or -iname "changelog*" -or -iname "notice*" -or -iname "test*.js" -or -iname "*.min.js" \) -and -type f \) -or \
\( -path "*moment-timezone/data/unpacked*" -and -type d \)
可以肯定的是,我没有添加最后一行| xargs rm -rf
| xargs rm -rf
。 您可以安全地执行上述命令而不删除任何内容,然后将管道添加到带有rm
xargs
以使其真正发生。
find命令有什么作用? 我将按模式解释它。
\\( \\( -name "dist" -or -name "ts" -or -name "logos" -or -name "min" -or -name "test*" -or -name "doc*" -or -name "tst" -or -name "example*" -or -name "build" -or -name "man" -or -name "benchmark*" \\) -and -type d \\)
=>搜索匹配的目录引号中的文字。 *
是通配符。
\\( \\( -iname "readme*" -or -iname "changelog*" -or -iname "notice*" -or -iname "test*.js" -or -iname "*.min.js" \\) -and -type f \\)
=>搜索引号中文本匹配的任何文件夹中的文件,无论大小写如何。 特别是"*.min.js"
模式对某些人来说可能是危险的。
\\( -path "*moment-timezone/data/unpacked*" -and -type d \\)
=>从中移除解压缩的数据。 这也节省了大量空间。
随意改善这个!
我正在考虑将其部署到AWS的elasticbeanstalk。 当我运行eb deploy
命令时,它神奇地找到了要上传的文件,并且没有获得任何bower_components
或node_modules
。 我想知道如何。
事实证明, eb deploy
在引擎盖下调用git archive
。 git archive
检出你指定的分支并对所有文件进行压缩。
大概你不会将你的node_modules或bower_components目录提交给git,所以git archive
可能是你问题的解决方案。 如果你想避免测试用例和自述文件等等,你可能仍然需要在git中做一些标记。 但是你从一个相当小的列表开始,你显然排除了你要排除的大部分内容。
我想你正在寻找npm prune
npm prune
[<name> [<name ...]]
此命令删除“无关”包。 如果提供了包名称,则仅删除与提供的名称之一匹配的包。
无关的包是父包的依赖项列表中未列出的包。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.