npm-link将本地的两个npm包建立软链接,方便在开发阶段快速调测.

假设项目my-project是我们开发项目, 需要用到独立my-utils模块. 在开发阶段my-utils中的修改我们希望可以实时同步到my-project项目中.

将两个npm包建立链接只需要2步.

将包发布到本地全局

通过命令进入my-utils工程目录:

1
2
3
4
# 进入 my-utils工程目录
$ cd path/to/my-utils
# 将my-utils发布到全局
$ npm link

npm link之后,在你操作系统中保存npm包全局的目录就会出现my-utils的npm 包,但不是实体的只是软链接的方式存在.

建立npm 包引用关系

通过命令进入my-project工程目录:

1
2
3
4
# 进入工程目录
$ cd path/to/my-project
# 建立依赖关系
$ npm link my-utils

通过上面的命令,在my-project项目中就可以引用本地的my-utils工程了,并且my-utils工程如果有变化会实时更新到my-project中.

其他建立引用关系方式

你可以不将my-utils工程发布到全局,而让my-project能够建立依赖.

npm link支持路径建立引用关系

1
2
$ cd path/to/my-project
$ npm link path/to/my-utils

移除引用关系

如果my-project不想于本地的my-utils建立引用关系了,可以移除掉.

1
$ npm unlink my-utils

npm link命令

1
2
3
4
$ npm link (in package dir)
$ npm link [<@scope>/]<pkg>[@<version>]

# alias: npm ln

npm link原理

npm link 可以帮助我们模拟包安装后的状态,它会在系统中做一个快捷方式映射,让本地的包就好像install过一样,可以直接使用。

在mac中,我们在终端可以直接敲的命令,其实是在执行/usr/local/bin目录下的脚本,这个目录可以认为是我们的全局命令所在的地方。

而当我们在npm install -g的时候,其实是将相关文件安装在/usr/local/lib/node_modules目录下,同时在全局命令/usr/local/bin目录下会有一个映射脚本,将其指向/usr/local/lib下的真实文件。这么做的好处是,可以在保证只有一份可执行文件的前提下,给命令取别名。

同样的,npm link 做的事情也是一样,唯一的区别是,它在 /usr/local/lib 下的 node_modules 里不是存的真实的文件,而是存了一个快捷方式,指向你当前执行 npm link 的目录。如果开发的的是node包,则执行的命令名和真实执行的文件入口,会根据项目的 package.jsonbin 的配置来获取。

1
2
$ cd projectdir
$ npm link

你会看到如下信息:

1
2
/usr/local/bin/yourpakagename -> /usr/local/lib/node_modules/yourpackagename/xxx
/usr/local/lib/node_modules/yourpackagename/xxx -> /Users/username/Documents/xxx(your real project path)

测试 node 环境下运行的包时,需要使用全局 link。并且做npm link之前,需要在 package.json 里配置 bin 字段。

1
2
3
4
# package.json
"bin" : {
"your-command-name": "./path-to/your-command-entry-file"
}

然后再在当前目录下运行

1
$ npm link

成功后,就可以直接在终端执行全局命令 your-command-name 了。

参考

https://docs.npmjs.com/cli/v6/commands/npm-link

https://juejin.cn/post/6844903625899294727

https://champyin.com/2019/08/27/npm-link%E8%AF%A6%E8%A7%A3/