npm和yarn中软链接的异同

2,226 阅读2分钟

什么是软链接

软链接(符号链接)在linux中是一个很常见的概念,在windows中也很常见,最常见的形式应该就是快捷方式了。创建一个软链接并不会将原来的文件或文件夹复制一份,而是创建了一个文件,指向源文件的地址。类似索引或者指针。这样可以方便文件的多处访问,也减少了硬盘的冗余数据。

软链接在开发中的应用

当我们在开发一个项目时,经常会出现我们所编写的代码中会使用许多工具方法,但是这些工具方法又可以单出抽出作为一个个lib使用的情况,这种情况下一般会采取monorepo的代码仓库形式,以开源社区最常用的文件结构为例:

|-packages
|--pkg1
|---src
|---package.json
|--pkg2
|---src
|---package.json
|-package.json

当项目中pkg1需要依赖pkg2时,如果调试时使用的是发布后的文件会很不方便,这时就需要将依赖链接到本地源文件。

临时软链接

  1. 在全局创建pkg2的链接
cd pkg2
npm link
cd pkg2
yarn link
  1. 在pkg1中引用pkg2的链接
cd pkg1
npm link pkg2
cd pkg1
yarn link pkg2

npm额外提供了一种不需要将pkg2链接到全局中的命令

cd pkg1
npm link ../pkg2

但是上面的两种方法都不会在pkg1package.json中显式声明对pkg2的依赖,每次重新安装依赖时还需要重新进行link,很不方便,所以npmyarn还提供了一种能够显式声明的方式。

持久软链接

cd pkg1
npm install ../pkg2
cd pkg1
yarn add file:../pkg2

这两种方式都会在pkg1package.json的文件中声明依赖"pkg2": "file:../pkg2",但是又有一些区别。 使用npm安装的依赖在node_modules中是以软链接的形式存在的,而yarn则是创建了一个原文件的硬链接,这样在调试时,对pkg2的修改也无法实时反馈到pkg1中了。

如果想使用yarn添加软链接的话,应该使用

cd pkg1
yarn add link:../pkg2

这样获得的效果与npm install ../pkg2是一致的,但是,yarnpackage.json中添加的声明依赖为"pkg2": "link:../pkg2",npm是无法解析这个声明形式的。所以npmyarn请谨慎混用。

参考文档