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 如下图所示: 问题原因 如果待删除文件中包含的小 ...
随机推荐
- UML的三项基础
UML的定义 UML语义:描述基于UML的精确元模型定义. UML表示法:定义UML符号和文本语法提供标准. 五类模型图 用例视图:用例图 逻辑视图:类图.对象图.包图(我把包放在一起的图) 静态视图 ...
- 得到知识服务app原型设计比较与实践
一.几种原型设计工具的比较 墨刀 优点: 拥有PC端.手机端.网页版,让你随时随地可以进行产品原型设计: 其定位是主要用于设计移动APP原型,其控件的拖拉.大小的调整,都会自然去匹配相应的母版大小,非 ...
- 源码解析Synchronous Queue 这种特立独行的队列
摘要:Synchronous Queue 是一种特立独行的队列,其本身是没有容量的,比如调用者放一个数据到队列中,调用者是不能够立马返回的,调用者必须等待别人把我放进去的数据消费掉了,才能够返回. 本 ...
- 99乘法表 java for循环
public static void main(String[] args) { //0-100的奇数和偶数和 int jsum=0; int osum=0; for (int i = 0; i &l ...
- Matlab学习笔记 绘图
1.二维曲线(1)plot函数①plot函数的基本用法:plot(x,y),其中x和y分别用于存储x坐标和y坐标数据. >>x=[1,2,3]; >>y=[4,5,6]; &g ...
- go-websocket服务端/客户端
目录 websocket 服务端 客户端 websocket websocket.Upgrader升级为websocket协议 服务端 package main import ( "fmt& ...
- SmartDialog迁移至4.0:一份真诚的迁移说明
前言 一个开源库,随着不断的迭代优化,难免会遇到一个很痛苦的问题 最初的设计并不是很合理:想添加的很多新功能都受此掣肘 想使得该库更加的强大和健壮,必须要做一个重构 因为重构涉及到对外暴露的api,所 ...
- Focal and Global Knowledge Distillation for Detectors
一. 概述 论文地址:链接 代码地址:链接 论文简介: 此篇论文是在CGNet上增加部分限制loss而来 核心部分是将gt框变为mask进行蒸馏 注释:仅为阅读论文和代码,未进行试验,如有漏错请不吝指 ...
- python之贪婪算法
贪婪算法 贪婪算法也称为最优算法,这种算法并不是最准确的答案,但确认最接近答案的近似算法. 这时候有人会问,不是最准确的答案我要她干嘛?但是在日常中,我们有时候会遇到一些我们无法处理的问题,甚至是要花 ...
- 134_Power BI Report Server之某消费品运营数据监控
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一背景 最近很久都没有更新文章了,研究了下Power BI Report Server(下文简称pbirs). 今天把pb ...