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

10
当准备部署代码时,我应该如何清理 node_modules 文件夹?
我正在使用 node-webkit 制作一个应用程序,并希望在打包最终版本的应用程序时尽可能少地包含文件,因为解压缩过程需要一些时间。
我查看了 npm dedupe 并使用 npm install --production 来去除重复项并仅获取生产文件,但是还剩下一些我不需要的 Readme 文件、benchmarkstestsbuild 文件。
我想要的是每个模块在 node_modules 文件夹中只有一个 LICENSE 文件(如果存在),一个 package.json 和运行模块所需的其他内容,但是没有多余的东西。
这个问题:How to automatically clean a node_modules directory for a SCM commit 也算是朝着同一个方向前进的,但它是关于提交的,不是我想要的。
这个问题:NPM clean modules 也与我的类似,但还不完全相同。 这个 答案对于为最终应用程序打包而言会更有效率。 更新
我尝试了从这里链接的自定义模块,但即使经过一些调整,它似乎仍无法正常工作。
总之,我还没有找到正确的答案。
以下是我要寻找的示例。
在我的项目中,我当前有两个依赖项:socket.iosocket.io-client
它们共占用 15 MB ,包含 550 个文件和 110 个文件夹。
手动清理不必要的文件,如 readmemakefile、VC++ 的构建文件(例如 .pdb.obj)和其他不必要的文件后,我将其缩小到了只有 2.74 MB,其中包含 265 个文件和 73 个文件夹。这只是两个模块而已。
我想知道是否有一种自动化的方式来实现这一点,最好使用 npm

你可以编写 .bat | .sh 脚本来自动化你的发布等任务,但很快你就会使用 grunt - Gntem
我愿意创建一个Grunt任务,但我想知道是否有适当的方法来完成这个任务... - Hayko Koryun
如果还没有现成的依赖检查器,你可以自己制作一个。 - Ariaan
请查看 modclean npm 包。 - idbehold
6个回答

9

这个模块试图智能清理node_modules文件夹:

modclean

安装:

npm install modclean -g

或者

npm install modclean --save-dev

使用方法:

modclean

它使用一组默认模式来从依赖树中的模块中删除不必要的冗余内容。

3
也许你对我逐渐整合的这个小的“查找”命令很感兴趣。请注意,这不是“一刀切”的解决方案!您需要根据自己的需求仔细检查它。它适用于node.js环境,但会破坏浏览器环境。我将其作为npm中的“postinstall”脚本在bash脚本中运行。 不要盲目复制粘贴。已经警告过您了!
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。您可以安全地执行上述命令,而无需删除任何内容,稍后使用xargsrm管道来使其真正发生。
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 \) => 在引号中匹配目录名的文本中搜索目录。星号*是通配符。

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

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

请随意改进!

3
清理 node_modules 目录以进行 webkit 应用程序的部署有点困难,因为 node_modules 目录中的模块可能会安装测试文件和其他杂项文件,也可能不会。如果模块的所有者声明了一个包含目录/文件(如 testsexamples)的 .npmignore 文件,则在所有者发布其模块时,这些目录/文件将被排除在打包过程之外,但它们将像平常一样存在于存储库(git)中。

如何在 npm 包中排除测试代码?

上述内容留给模块所有者处理,如果他/她“忘记”制作一个,那么包将包含几乎所有内容。
请注意,由于您不使用socket.io或socket.io-client的开发包,这并不意味着您必须npm install socket.io --save-dev,只需npm install socket.io -V即可安装生产包,因为它是由其所有者上传的。
一个可能的解决方法是创建一个grunt任务,清理您希望的整个node_modules。
一些规则可能是:
- test或tests目录或*test*.js文件 - build目录(不确定,有时可能包含一些必要的二进制文件) - history.md

GruntJS(一种JavaScript任务运行器,用于自动化工作流程)希望我在某种程度上有所帮助,还可以看看Tilemill以及他们如何部署他们的应用程序。


2

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

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

之前已经有人建议过,在grunt中添加一个deploy任务可能是个好主意。只要确保清理后进行test。使用grunt-contrib-clean可以很好地进行清理。

请参考connect.npmignore,了解哪些文件/目录不应该在生产包中。


1
我正在研究将其部署到AWS的弹性beanstalk。当我运行eb deploy命令时,它会神奇地找到要上传的文件,并且不会获取任何bower_componentsnode_modules。我想知道是如何做到的。
原来eb deploy在内部调用git archivegit archive检出您指定的分支并对所有文件进行压缩。
假设您不会将像node_modules或bower_components目录之类的内容提交到git中,因此git archive可能是解决问题的方法。如果您想避免诸如测试用例、README文件等内容,则可能仍需要在git中进行一些标记。但是您要开始的列表要小得多,显然可以排除大部分要排除的内容。

0

我认为你正在寻找npm prune

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

此命令会删除“多余”的软件包。如果提供了软件包名称,则只会删除与所提供名称之一匹配的软件包。

多余的软件包是指未列在父软件包依赖项列表中的软件包。

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


npm prune 只会删除 node_modules 文件夹中不存在于 package.json 中的包,而不会对它们进行“清理”。 - aluxian
使用 --production 标志将从 node_modules 中删除 devDependencies,这正是 OP 所寻找的。 - Eric Jeker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接