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

时间:2013-12-21 21:18:45

标签: node.js npm node-modules resource-cleanup

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

我正在使用 node-webkit 创建一个应用程序,并且在捆绑最终版本的应用程序时希望包含尽可能少的文件,因为解压缩过程需要一些时间。

我查看了npm dedupe并使用npm install --production删除了重复内容并仅获取了生产文件,但我仍留有Readme个文件,benchmarks,我不需要testsbuild个文件。

对于node_modules文件夹中的每个模块,我最终想要的是LICENSE文件(如果存在),package.json以及模块所需的任何其他内容跑了,但仅此而已。

问题:How to automatically clean a node_modules directory for a SCM commit在某种程度上朝着同一个方向前进,但它正在谈论承诺所以并不是我真正想要的。

问题:NPM clean modules在某种程度上与我的一致,但并不完全在那里。

This回答有帮助,因为它是dedupe捆绑最终应用的更高效版本。

更新
我尝试了从here链接的自定义模块,但它似乎无法正常工作,即使在进行了一些调整之后。

尽管如此,我还没有找到正确的答案。


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

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

它们与 110 文件夹中的 550 文件一起构成 15 MB

手动清除readmemakefileVC++构建文件,例如.pdb.obj以及其他不必要的文件,我可以将其缩小为<在 73 文件夹中包含 265 个文件的强> 2.74 MB 。
这只有两个模块。

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

6 个答案:

答案 0 :(得分:7)

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

modclean

安装:

npm install modclean -g

npm install modclean --save-dev

用法:

modclean

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

答案 1 :(得分:3)

为webkit应用程序的部署很好地清理node_modules,由于node_modules目录中的模块安装有或没有测试文件其他misc文件,因此,如果模块的所有者已声明.npmignore文件,其中包含testsexamples等目录/文件,当所有者发布其模块时,这些文件将被排除在打包过程之外,但它将存在于存储库(git)正常。

Exclude test code in npm package?

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

<小时/> 请注意,由于您未使用developmentsocket.io的{​​{1}}包,因此并不意味着您需要socket.io-client,因此会安装一个简单的npm install socket.io --save-dev由其所有者上传的生产包。
可能的解决方法是执行npm install socket.io -V任务,按照您的意愿清理整个grunt

有几条规则

  • node_modulestest目录或tests个文件
  • *test*.js目录(不确定它有时可能包含一些必要的二进制文件)
  • build

GruntJS

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

答案 2 :(得分:2)

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

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

之前已经提出建议,但在deploy中执行grunt任务可能是一个好主意。只需确保清理后test应用程序。 grunt-contrib-clean非常适合清洁。

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

答案 3 :(得分:2)

也许你对这个find这个小命令感兴趣,我随着时间的推移组装了这个命令。请注意,这不是一个“万能的”解决方案!您需要根据您的要求仔细检查。它适用于node.js环境,肯定会破坏浏览器环境。我在bpm脚本中运行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以使其真正发生。

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 \) =&gt;搜索与引号中的文本匹配的目录。 *是通配符。

  2. \( \( -iname "readme*" -or -iname "changelog*" -or -iname "notice*" -or -iname "test*.js" -or -iname "*.min.js" \) -and -type f \) =&gt;搜索引号中文本匹配的任何文件夹中的文件,无论大小写如何。 特别是模式"*.min.js"对某些人来说可能是危险的。

  3. \( -path "*moment-timezone/data/unpacked*" -and -type d \) =&gt;从瞬间删除解压缩的数据。这也节省了足够的空间。

  4. 随意改善这一点!

答案 4 :(得分:1)

我正在考虑部署到AWS的弹性豆秆。当我运行eb deploy命令时,它神奇地找到了要上传的文件,并且它没有获得bower_componentsnode_modules中的任何一个。我想知道如何。

事实证明,eb deploy会在引擎盖下调用git archivegit archive检查您指定的分支并对所有文件进行压缩。

据推测,您不会将诸如node_modules或bower_components目录之类的内容提交给git,因此git archive可能是您问题的解决方案。如果你想避免测试用例和自述文件等等,你可能仍然需要在git中做一些标记。但是,您从一个相当小的列表开始,而且您显然排除了要排除的大部分内容。

答案 5 :(得分:-1)

我认为您正在寻找npm prune

  

npm prune [<name> [<name ...]]

     

此命令删除&#34;无关&#34;包。如果包名是   提供,然后只有匹配提供的名称之一的包   除去。

     

无关的包是未在父级上列出的包   包的依赖列表。

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