大家好,我是前端西瓜哥。最近在研究React源码,使用yarnlink命令链接了两个项目。对其底层原理产生了兴趣,所以写了这样一篇文章,希望通过故事的形式让大家了解yarnlink的使用场景和用法。另外,npmlink和yarnlink的效果是一样的,npmlink下面不再赘述。有一天,小瓜维护的一个名为xigua的npm包被提了个issue。小瓜看了看问题描述,以他对项目的熟悉程度,大概知道哪里出了问题。为了测试,小瓜建了一个demo-project工程,这个工程通过yarnaddxiga安装了这个包,并在代码中使用。└──demo-project└──node_modules├──apple└──xigua├──old.js└──package.json理论上小瓜直接修改这个demo-project工程的node_module/xigua目录下的代码足够的。但遗憾的是,里面的代码是编译过的,不能直接修改。小瓜接着跑到xigua-project包的源码工程,运行了一个可以监控源码的命令修改生成npm包的内容。小瓜修改了一段代码,然后自动编译成xigua-project/build/。└──xigua-project└──build└──xigua(编译后的文件夹)├──fix.js└──package.json然后小瓜将编译后的代码复制过来,覆盖原来的demo-project/node_module/xigua,并且然后检查效果是否错误。小瓜发现不对,又改了一遍,然后又抄了一遍,连续重复了好几遍。“我受不了了,我得想办法。”小瓜说。每次编译完成,都要手动进行拷贝操作,太烦人了。机智的小瓜想了想,终于想出了一个办法。删除demo-project下的xigua依赖包,然后创建一个xigua软链接文件链接到xigua-project下的编译文件夹(软链接可以理解为快捷方式文件,可以重定向文件位置)。├──demo-project│└──node_modules│├──apple│└──xigua(redirect)->/xigua/build/node_modules/xigua└──xigua-project└──build└──xigua(链接location)├──fix.js└──package.json使用软链接,我们将两个项目关联起来。yarnlink这时室友小润牵着他的猫路过,那是他家猫的名字。小瓜为自己的奇思妙想得意洋洋,立刻向小润吹嘘起来。小润:“对于这个需求,包管理器有相关命令支持。”小瓜:“原来如此!说说怎么用吧。”接着小润解释道。其实很简单。我们进入xigua/build/xigua目录,执行yarnlink。$yarnlinkyarnlinkv1.22.17successRegistered"xigua".info你现在可以在你想使用这个包的项目中运行`yarnlink"xigua"`,它将被使用。?在0.01秒内完成。包管理工具会全局注册一个名为xiuga的链接。具体就是创建一个xigua软链接文件指向这个xigua目录。在macOS中,它位于~/.config/yarn/link/xigua目录中。链接指向如下:~/.config/yarn/link/xigua->/xigua-project/build/xigua更准确地说,yarnlink会从当前工作目录中找到第一个有正确package.json文件的目录,作为链接的对象,因为npm包中必须有package.json。接下来,我们进入demo-project工程目录,执行yarnlinkxigua。$yarnlinkxiguaynlinkv1.22.17success使用“xigua”的链接包。?在0.01秒内完成。它会做两个操作:删除demo-project下的xigua依赖包。然后创建一个xigua软链接文件,链接到yarn/link/xigua。形成demo-project->yarn/link->xigua-project链。小瓜惊道:“这操作不和我一样吗?不过多了一个中间人,yarn。”是的,但是纱线更方便。yarnunlink您已经完成了演示项目中的测试。如果你想断开链接,你需要执行:$yarnunlinkxiguayarnunlinkv1.22.17successRemovedlinkedpackage"xigua".info你需要运行`yarninstall--force`重新安装之前的包链接。?在0.01秒内完成。断开链接后,因为原来的包被删除,换成了一个链接文件,所以我们需要重新打包这个包,执行yarninstall--force。你说我删除node_modules,然后执行yarn。可以,前提是你的node_modules没有其他包的链接,否则其他包的链接也会被干掉。如果要删除全局注册的名为xigua的链接,需要进入链接目录执行yarnunlink。$yarnunlinkyarnunlinkv1.22.17successUnregistered"xigua".info你现在可以在你不想再使用这个包的项目中运行`yarnunlink"xigua"`。?在0.01秒内完成。最后的yarnlink的作用是帮助我们调试开发npm包。因为普通项目的依赖包安装都是从网上下载安装的,如果想使用本地编译好的npm包,比较好的办法是删除依赖包,通过快捷方式链接我们本地编译好的包。为了简化这个过程,出现了yarnlink,通过中介的形式,实现快速链接和取消链接。
