如何在准备部署时清理node_modules文件夹

在准备部署代码时,我将如何去清理node_modules文件夹。

我正在制作一个使用node-webkit的应用程序,并且由于解压缩过程需要一些时间,所以在捆绑应用程序的最终版本时,希望包含最less量的文件。

我已经看过npm dedupe和使用npm install --production生产摆脱重复和只提取生产文件,但我仍然留有Readme文件, benchmarkstests和生成文件,我不需要。

我想结束node_modules文件夹中的每个模块是一个LICENSE文件,如果它存在, package.json和其他任何我需要的模块运行,但没有更多。

问题: 如何自动清理一个SCM提交的node_modules目录是朝着相同的方向,但它是谈论提交,所以不是真正的我正在寻找。

这个问题: NPM清理模块与我的相同,但不完全相同。

这个答案有帮助,因为它是捆绑最终应用程序的dedupe更有效的版本。

更新
我试图从这里链接的自定义模块,但它似乎并没有正常工作,即使经过一些摆弄。

尽pipe如此,我还没有find正确的答案呢。


这是我正在寻找的一个例子。

在我的项目中,我目前有两个依赖项: socket.iosocket.io-client

他们一起组成了15个文件夹中的550个文件。

手动清理readme makefilemakefileVC++构build文件,如.pdb.obj以及其他不必要的文件我可以缩小到2.74 MB的 73个文件夹中的265个文件。
这只有两个模块。

我想知道是否有办法自动执行此操作,最好使用npm

那么清理node_modules为了部署一个webkit应用程序,因为node_modules目录里面的模块安装了带有或没有testing文件的其他misc文件,所以如果模块的所有者声明了一个.npmignore文件与目录/文件,如testsexamples那些将被排除在包装过程时,所有者发布他的模块,但它会存在在仓库(git)正常。

在npm包中排除testing代码?

以上是留在模块所有者手中,如果他/她“忘记”做一个,那么包将包含几乎所有的东西。


请注意,因为您不使用socket.iosocket.io-clientdevelopment包,所以并不意味着您必须npm install socket.io --save-dev ,一个简单的npm install socket.io -V会安装生产包时,由其所有者上传。


一个可能的解决方法是做一个grunt任务,清理你的整个node_modules如你所愿。

一些规则将是

  • testtests目录或*test*.js文件
  • build目录(不知道它可能包含一些二进制文件有时是必要的)
  • history.md

GruntJS


希望我能以某种方式帮助,也请看看Tilemill以及他们如何部署他们的应用程序。

该模块尝试智能地清理node_modules文件夹:

modclean

安装:

 npm install modclean -g 

要么

 npm install modclean --save-dev 

用法:

 modclean 

它使用一组默认模式从整个依赖关系树中的模块中删除不必要的膨胀。

安装NPM的模块不应该包含开发文件(即基准,testing等)。 如果他们包括你应该联系模块维护者,并要求将他们添加到.npmignore

注意:在这种情况下,开发文件意味着开发实际模块所需的文件,而不是您的应用程序。

之前已经提出过,但是在grunt deploy任务可能是一个好主意。 清理完成后,请确保test应用程序。 grunt-contrib-clean非常适合清洁。

请参阅connect .npmignore ,了解不应包含在生产包中的文件/目录。

也许你对这个小小的find命令很感兴趣,我随着时间的推移已经组装好了。 请注意,这不是“一刀切”的解决scheme! 你需要非常仔细地检查你的要求。 它旨在用于node.js环境,并且肯定会破坏浏览器环境。 我在npm中运行一个bash脚本作为postinstall脚本。

不要盲目复制粘贴 。 你被警告了!

 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把这个pipe道添加到xargs ,使之真正发生。

find命令是做什么的? 我会通过模式来解释它的模式。

  1. \( \( -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 \) =>search匹配的目录在引号中的文字。 *是通配符。

  2. \( \( -iname "readme*" -or -iname "changelog*" -or -iname "notice*" -or -iname "test*.js" -or -iname "*.min.js" \) -and -type f \) =>search引号中文本匹配的任何文件夹中的文件,而不pipe大小写。 尤其是模式"*.min.js"对某些人可能是危险的。

  3. \( -path "*moment-timezone/data/unpacked*" -and -type d \) =>从当下删除解压后的数据。 这也节省了大量的空间。

随意改善这一点!

我正在研究这部署到AWS的elasticbeanstalk。 当我运行eb deploy命令时,它神奇地发现要上传的文件,并且没有得到任何bower_componentsnode_modules 。 我想知道如何。

事实certificate, eb deploy在引擎盖下调用git archivegit archive检出你指定的分支,并制作所有文件的zip文件。

据推测,你不会提交像你的node_modules或bower_components目录git,所以git archive可能是你的问题的解决scheme。 如果你想避免像testing用例和自述文件等等,你可能还需要在git中做一些标记。 但是你从一个小得多的列表开始,显然不包括你想要排除的大部分内容。

我想你正在寻找npm prune

npm修剪[<name> [<name ...]]

这个命令删除“无关”的包。 如果提供了一个包名称,那么只有与所提供的名称匹配的包才会被删除。

无关程序包是父程序包的依赖项列表中未列出的程序包。

文档https://docs.npmjs.com/cli/prune