Skip to content

你所不知道的模块调试技巧 - npm link #17

Open
@atian25

Description

@atian25
Owner

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

changed the title [-]你所不知道的调试技巧 - npm link[/-] [+]你所不知道的模块调试技巧 - npm link[/+] on Jan 24, 2017
rccoder

rccoder commented on Feb 9, 2017

@rccoder

👍,当年修改 node_modules 后发布了一次导致 node_modules 里面的代码直接没了给我留下了 深刻 的记忆 😂

XadillaX

XadillaX commented on Feb 28, 2017

@XadillaX

问题是一个项目里面被 flatten 出来几千个目录,你就算开个软连,编辑器里面展开 node_modules 目录也会被卡死。

atian25

atian25 commented on Feb 28, 2017

@atian25
OwnerAuthor

@XadillaX 这个跟 link 关系不大,是 npm@2,npm@3,cnpm 的包安装方式区别导致的吧。

这是编辑器的问题,很容易解决的,vscode 和 webstorm 配置几个 ignore 就 ok 了。(局部 ignore,不用全部屏蔽整个 node_modules)

XadillaX

XadillaX commented on Feb 28, 2017

@XadillaX

@atian25 为什么大家都喜欢把 NPM 自身机制问题总要归结到编辑器问题上去呢 -。 -

atian25

atian25 commented on Feb 28, 2017

@atian25
OwnerAuthor
monkindey

monkindey commented on Jul 13, 2017

@monkindey

呀, 感觉如果是用yarn install的话用yarn link会好一点的呢。具体原因不太清楚, 在yarn下载然后用npm(npm5) link感觉npm会去处理环境生成一个lock文件, 处理起来有点慢的呢, 用yarn就一秒左右就搞定了。不过确实link的方式在开发的时候确实是不错的思路。感谢分享。

lightWey

lightWey commented on Aug 16, 2017

@lightWey

那,如果我的js插件直接放到项目目录下呢

atian25

atian25 commented on Aug 16, 2017

@atian25
OwnerAuthor

@lightWey 然后你的问题是?

ahonn

ahonn commented on Aug 16, 2017

@ahonn

🤔 我居然每次都 npm install path/to/my-project --save 一次,没有想到用 link...

sunlandong

sunlandong commented on Nov 27, 2017

@sunlandong

有一个模块,开始是直接通过npm install gitlab地址,运行项目没错,但是在本地,我通过npm link之后,运行就出错了,

atian25

atian25 commented on Nov 27, 2017

@atian25
OwnerAuthor

@sunlandong 这种反馈对交流是没有任何帮助的,出什么错?错误信息是啥?复现步骤是啥?挤牙膏似的交流是最没效率的。

38 remaining items

coconilu

coconilu commented on Mar 8, 2020

@coconilu

对npm install指令和npm link指令更加理解了。

Mr-xue

Mr-xue commented on Apr 20, 2020

@Mr-xue

1.通过npm link给公共组件建立软链接
2.在项目中通过npm link 包名引入后,Module not found: Error: Can't resolve 'vue-loader/node_modules/vue-hot-reload-api出现这个报错是什么情况,有朋友解答下么,这个依赖在vuecli创建的时候就已经有了啊

atian25

atian25 commented on Apr 20, 2020

@atian25
OwnerAuthor

可能是 vuecli 对软链的处理不好。

Mr-xue

Mr-xue commented on Apr 21, 2020

@Mr-xue

可能是 vuecli 对软链的处理不好。

找到问题了,需要把webpack配置中的 symlinks设为false,否则就会报错,为了解决这个问题头都秃了。。。

youngjuning

youngjuning commented on Jul 8, 2020

@youngjuning

wml这个才是最屌的,因为React Native 不支持 npm link,https://www.bram.us/2018/03/10/working-with-symlinked-packages-in-react-native/

youngjuning

youngjuning commented on Jul 10, 2020

@youngjuning

Metro 不支持跟随软链: facebook/metro#1

littlepoolshark

littlepoolshark commented on Sep 28, 2020

@littlepoolshark

npm link贼好用

tian0o0

tian0o0 commented on Sep 28, 2020

@tian0o0

可能是 vuecli 对软链的处理不好。

找到问题了,需要把webpack配置中的 symlinks设为false,否则就会报错,为了解决这个问题头都秃了。。。

💥就是这个害我浪费了半天时间

afishhhhh

afishhhhh commented on Oct 19, 2020

@afishhhhh

我发现 1.2 相对路径安装 修改代码后不需要重新 install 呀

LS-LILEI

LS-LILEI commented on Jun 6, 2021

@LS-LILEI

在引用的项目中使用安装插件导致被引用的插件废掉,被引用的模块需要清理掉node_modules重新安装才能成功启动

wmasfoe

wmasfoe commented on Sep 5, 2022

@wmasfoe

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.

版本:

  • yarn: 3.0.1
  • pnpm: 7.3.0
  • node: 14.20.0
atian25

atian25 commented on Sep 5, 2022

@atian25
OwnerAuthor

不要混用包管理器

wmasfoe

wmasfoe commented on Sep 5, 2022

@wmasfoe

不要混用包管理器

这玩意是我可以左右的吗🙈🙈,yarn 用的 learnpnpm 用自带的 monorepo
项目分别有 package-lock.json / yarn.lock。👀

wmasfoe

wmasfoe commented on Sep 8, 2022

@wmasfoe

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.

版本:

  • yarn: 3.0.1
  • pnpm: 7.3.0
  • node: 14.20.0

组件库 yarn link 之后,在一般项目里 (不是 lerna 架构)yarn link "xxx-design-monorepo" 就没问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @atian25@mytharcher@zhbhun@foxundermoon@XadillaX

        Issue actions

          你所不知道的模块调试技巧 - npm link · Issue #17 · atian25/blog