npm uninstall和rm直接删除的区别
结论:
- 1. npm uninstall会备份包本身依赖的node_modules,rm -f会删除整个目录
- 2. npm uninstall不会删除被依赖的包。即使显式要删除这个包,但它被依赖不会删除。rm -f会
- 3. npm uninstall有全局模式,还会删除软链,rm -r只删目录,可能漏掉软链
- 4. npm uninstall会删除package.json中的dependencies条目,rm -r不会
- 5. npm uninstall会安装那些在package.json中漏装的包,rm -r当然不可能有这个副作用
总之,npm uninstall和npm install是同一套代码,同一逻辑,都是【同步当前包环境】的操作。而rm -r是强制删除一个目录。
从名称上看,uninstall确实命名不佳,它非常复杂,和install一样复杂,是整个npm设计的核心,容易误解成删除。
没有文档,只能看代码,哎
分析:
比如,要删除 mkdirp
npm uninstall mkdir
会执行下列操作
第一步 加载本地实际存在的包列表
第二步 加载 package.json 得到理想包列表
通过分析package.json得到列表
loadAllDepsIntoIdealTree
在IdealTree中过滤掉要删除的包,这样就得到两个Tree,一个是 CurrentTree,一个是 IdealTree
第三步 同步CurrentTree和IdealTree
- 1. 如果CurrentTree中存在,IdealTree中不存在,忽略
- 2. 如果CurrentTree中不存在,IdealTree中存在,则安装
- 2. 如果CurrentTree中存在,IdealTree中不存在,则删除
第四步 执行删除操作的逻辑
- 1. 如果要删除的包被当前IdealTree中其它包依赖,则不删除
- 2. 如果要删除的包中有依赖的包,则备份它们,稍候恢复
mv ./node_modules/mkdirp/node_modules ./node_modules/.mkdirp.MODULES
rm -rf ./node_modules/mkdirp/
mkdir ./node_modules/mkdirp
mv ./node_modules/.mkdirp.MODULES ./node_modules/mkdirp/node_modules
使用 rimraf删除目录,rimraf是个包,它提供类似rm -rf的功能,递归的删除目录和文件,有重试逻辑等。
看似简单的 rm -rf为什么要单独实现呢?
nodejs fs模块早期确实没提供rm -r的功能,fs模块只提供了删除单个目录和单个文件的能力。
在 v12.10.0 后提供了递归删除目录的api,在 v14.14.0 提供了rm -rf的api。
来的太迟了,所以在开发npm的时候,就采用了rimraf这个包。
如果要删除的包中,没有node_modules,则不会执行备份的操作。
npm uninstall和rm直接删除的区别的更多相关文章
- rm(操作系统的删除文件)与git rm的区别
git rm:1.删除了一个文件2.把这个删除的文件纳入暂存区如果想要恢复这个文件,则需要做2个操作a.git reset HEAD file_name --将文件从暂存区恢复到工作区b.git ch ...
- npm install、npm init、npm update、npm uninstall和package.json
npm install 安装本地包 npm install <package_name>:这个命令将在当前目录中创建node_modules目录(如果尚不存在),并将该软件包下载到该目录. ...
- npm 常用指令 使用指令删除 node_modules 包
查看 npm 命令 npm help 全局命令参数 -g npm install -g 安装全局 npm uninstall -g 卸载全局 全局node包中 i5ting_toc 这个包可以把md文 ...
- rm: 无法删除"/run/user/root/gvfs": 是一个目录 问题
2013-03-02 bxd@linux:~$ sudo su [sudo] password for bxd: root@linux:/home/bxd# exit exit rm: 无法删 ...
- Linux中RM快速删除大量文件/文件夹方法
昨天遇到一个问题,在Linux中有一个文件夹里面含有大量的Cache文件(夹),数量级可能在百万级别,使用rm -rf ./* 删除时间慢到不可接受.Google了一下,查到了一种方法,试用了下确实比 ...
- Linux下通过rm -f删除大量文件时提示"-bash: /bin/rm: Argument list too long"的解决方法
Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long& ...
- rm: 无法删除 "xxxxx.o" : 输入/输出错误.
rm: 无法删除 "xxxxx.o" : 输入/输出错误. 碰到无法删除的文件,以为完蛋了,要重装. 后面重启一下就可以了
- 一文看懂npm、yarn、pnpm之间的区别
文作者对比了当前主流的包管理工具npm.yarn.pnpm之间的区别,并提出了合适的使用建议,以下为译文: NPM npm是Node.js能够如此成功的主要原因之一.npm团队做了很多的工作,以确保n ...
- Linux下通过 rm -f 删除大量文件时报错:Argument list too long
Linux下通过 rm -f 删除大量的小文件时出现类似如下错误信息: -bash: /bin/rm: Argument list too long 如下图所示: 问题原因 如果待删除文件中包含的小 ...
随机推荐
- Ubuntu Qt5 Firebird 数据库驱动安装
Ubuntu Qt5 Firebird 数据库驱动安装 apt install libqt5sql5-ibase
- v-show与v-if的一次事故
v-show等同于设置dom元素的display为none,dom元素没有消失而是被隐藏了 v-if是删除或添加dom元素,频繁地删除和添加dom元素会比较耗费性能
- k8s入门之ConfigMap(九)
ConfigMap是k8s的配置管理工具,通常用来保存明文的配置信息,以key-value形式传递配置. 一.使用命令创建ConfigMap对象 1.通过--from-literal参数创建 kube ...
- 为什么建议大家使用 Linux 开发?
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ Linux 能用吗? 我身边还有些朋友对 linux 的印象似乎还停留在黑乎乎的命令行界面上. ...
- 面试官给我挖坑:rm删除文件之后,空间就被释放了吗?
在Linux,你是不是曾经天真的以为,使用rm删除一个文件,占用的空间就释放了?事情可能不是常常如人意. 产生一个指定大小的随机内容文件 我们先看一下当前各个挂载目录的空间大小: $ df -h /d ...
- Svelte3.x网页聊天实例|svelte.js仿微信PC版聊天svelte-webchat
基于Svelte3+SvelteKit+Sass仿微信Mac界面聊天实战项目SvelteWebChat. 基于svelte3+svelteKit+sass+mescroll.js+svelte-lay ...
- spring boot 统一接口异常返回值
创建业务 Exception 一般在实际项目中,推荐创建自己的 Exception 类型,这样在后期会更容易处理,也比较方便统一,否则,可能每个人都抛出自己喜欢的异常类型,而造成代码混乱 Servic ...
- DevOps之敏捷开发
初步了解一下敏捷开发及其流程 1 为什么要敏捷开发? 敏捷开发描述了一套软件开发的价值和原则,在这些开发中,需求和解决方案皆通过自组织跨功能团队达成. 1.1 背景与动机 当需求的不明确性和工程实现的 ...
- linux篇-linux iptables配置
1 iptables默认系统自带 setup 2重启防火墙 /etc/init.d/iptables restart 3接受端口 Vi /etc/sysconfig/iptables -A INPUT ...
- 跨域问题及其解决方法(JSONP&CORS)
一.什么是跨域 当a.qq.com域名下的页⾯或脚本试图去请求b.qq.com域名下的资源时,就是典型的跨域行为.跨域的定义从受限范围可以分为两种,⼴义跨域和狭义跨域. (一)广义跨域 ⼴义跨域通常包 ...