Open
Description
1. 背景
node 应用开发中,我们不可避免的需要使用或拆分为 npm 模块,经常遇到的一个问题是:
新开发或修改的 npm 模块,如何在项目中试验?
新同学一般会有以下几种方式:
为了方便示范,我们假设项目是 my-project
, 需要用到一个独立的 my-utils
模块
1.1 发布一个 beta 版本
- 优点:你高兴就好。
- 缺点: 无趣+无趣+无趣,麻烦+麻烦+麻烦。
1.2 直接用相对路径安装
$ cd path/to/my-project
$ npm install path/to/my-utils
- 优点:简单明了
- 缺点: 调试过程中往往需要微调,此时需要切换到 my-utils 目录修改,然后反复重新 install,很麻烦
1.3 使用软链
$ cd path/to/my-project/node_modules
$ ln -s path/to/my-utils my-utils
- 优点:软链后,两边修改直接同步
- 缺点: 指令操作麻烦,不同操作系统语法不一样
2. 正解 - npm link
但其实 npm 本身已经对此类情况提供了专门的 npm link
指令。
相关文档: https://docs.npmjs.com/cli/link
下面我们简单介绍下用法:
$ cd path/to/my-project
$ npm link path/to/my-utils
简单的替换一个单词,就搞定了,cool~
如果这两种的目录不在一起,那还有一种方法:
$ # 先去到模块目录,把它 link 到全局
$ cd path/to/my-utils
$ npm link
$
$ # 再去项目目录通过包名来 link
$ cd path/to/my-project
$ npm link my-utils
该指令还可以用来调试 node cli 模块,譬如需要本地调试我们的 egg-init,可以这样:
$ cd path/to/egg-init
$ npm link
$ # 此时全局的 egg-init 指令就已经指向你的本地开发目录了
$ egg-init # 即可
想去掉 link 也很简单:
$ npm unlink my-utils
3. 写在最后
- 该方法只是为了最后一步调试,模块本身的正确性,应该更多的通过单元测试来保证。
- 单元测试相关内容,可以参见:单元测试
Activity
[-]你所不知道的调试技巧 - npm link[/-][+]你所不知道的模块调试技巧 - npm link[/+]rccoder commentedon Feb 9, 2017
👍,当年修改 node_modules 后发布了一次导致 node_modules 里面的代码直接没了给我留下了 深刻 的记忆 😂
XadillaX commentedon Feb 28, 2017
问题是一个项目里面被 flatten 出来几千个目录,你就算开个软连,编辑器里面展开 node_modules 目录也会被卡死。
atian25 commentedon Feb 28, 2017
@XadillaX 这个跟 link 关系不大,是 npm@2,npm@3,cnpm 的包安装方式区别导致的吧。
这是编辑器的问题,很容易解决的,vscode 和 webstorm 配置几个 ignore 就 ok 了。(局部 ignore,不用全部屏蔽整个 node_modules)
XadillaX commentedon Feb 28, 2017
@atian25 为什么大家都喜欢把 NPM 自身机制问题总要归结到编辑器问题上去呢 -。 -
atian25 commentedon Feb 28, 2017
monkindey commentedon Jul 13, 2017
呀, 感觉如果是用
yarn install
的话用yarn link
会好一点的呢。具体原因不太清楚, 在yarn下载然后用npm(npm5) link感觉npm会去处理环境生成一个lock文件, 处理起来有点慢的呢, 用yarn就一秒左右就搞定了。不过确实link的方式在开发的时候确实是不错的思路。感谢分享。lightWey commentedon Aug 16, 2017
那,如果我的js插件直接放到项目目录下呢
atian25 commentedon Aug 16, 2017
@lightWey 然后你的问题是?
ahonn commentedon Aug 16, 2017
🤔 我居然每次都 npm install path/to/my-project --save 一次,没有想到用 link...
sunlandong commentedon Nov 27, 2017
有一个模块,开始是直接通过npm install gitlab地址,运行项目没错,但是在本地,我通过npm link之后,运行就出错了,
atian25 commentedon Nov 27, 2017
@sunlandong 这种反馈对交流是没有任何帮助的,出什么错?错误信息是啥?复现步骤是啥?挤牙膏似的交流是最没效率的。
38 remaining items
coconilu commentedon Mar 8, 2020
对npm install指令和npm link指令更加理解了。
Mr-xue commentedon Apr 20, 2020
1.通过
npm link
给公共组件建立软链接2.在项目中通过
npm link 包名
引入后,Module not found: Error: Can't resolve 'vue-loader/node_modules/vue-hot-reload-api
出现这个报错是什么情况,有朋友解答下么,这个依赖在vuecli创建的时候就已经有了啊atian25 commentedon Apr 20, 2020
可能是 vuecli 对软链的处理不好。
Mr-xue commentedon Apr 21, 2020
找到问题了,需要把webpack配置中的
symlinks设为false
,否则就会报错,为了解决这个问题头都秃了。。。youngjuning commentedon Jul 8, 2020
wml这个才是最屌的,因为React Native 不支持 npm link,https://www.bram.us/2018/03/10/working-with-symlinked-packages-in-react-native/
youngjuning commentedon Jul 10, 2020
Metro 不支持跟随软链: facebook/metro#1
littlepoolshark commentedon Sep 28, 2020
npm link贼好用
tian0o0 commentedon Sep 28, 2020
💥就是这个害我浪费了半天时间
afishhhhh commentedon Oct 19, 2020
我发现 1.2 相对路径安装 修改代码后不需要重新 install 呀
LS-LILEI commentedon Jun 6, 2021
在引用的项目中使用安装插件导致被引用的插件废掉,被引用的模块需要清理掉node_modules重新安装才能成功启动
wmasfoe commentedon Sep 5, 2022
npm yarn pnpm 这三个的 link 都是互通的吗?
我有个场景:项目用 yarn 的 monorepo,组件库用的 pnpm 的 monorepo
我在组件库使用:
pnpm build
yarn link
,输出:Registered "xxx-design-monorepo".
项目中使用:
yarn link "xxx-design-monorepo"
,输出:Invalid destination; Can't link the project to itself.
版本:
atian25 commentedon Sep 5, 2022
不要混用包管理器
wmasfoe commentedon Sep 5, 2022
这玩意是我可以左右的吗🙈🙈,
yarn
用的learn
,pnpm
用自带的monorepo
。项目分别有
package-lock.json
/yarn.lock
。👀wmasfoe commentedon Sep 8, 2022
组件库
yarn link
之后,在一般项目里 (不是 lerna 架构)yarn link "xxx-design-monorepo"
就没问题