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目录修改,修改后需重新构建,虽然不需要我们在my-project项目中反复安装(my-project的引用会自动更新),但重新构建my-utils模块也很麻烦
1.3 使用软链(my-utils 代码修改后,需重新构建)
$ cd path/to/my-project/node_modules
# my-utils为你代码中使用到的包名,非目录名
$ ln -s path/to/my-utils my-utils
删除软链:
unlink my-utils
- 优点:软链后,两边修改直接同步
- 缺点: 指令操作麻烦,不同操作系统语法不一样
2. 正解 - npm link(my-utils 代码修改后,需重新构建)
但其实 npm 本身已经对此类情况提供了专门的 npm link 指令。
相关文档: docs.npmjs.com/cli/link
下面我们简单介绍下用法:
$ cd path/to/my-utils # go into the package directory
$ npm link # creates global link
$
$ cd path/to/my-project # go into some other package directory.
$ npm link my-utils # link-install the package,my-utils为package.json文件中定义的包名
上述方法的简写方式为:
$ cd path/to/my-project
$ npm link path/to/my-utils # link the dir of your dependency
my-utils模块代码修改后,需重新打包
该指令还可以用来调试 node cli 模块,譬如需要本地调试我们的 egg-init,可以这样:
$ cd path/to/egg-init
$ npm link
$ # 此时全局的 egg-init 指令就已经指向你的本地开发目录了
$ egg-init # 即可
想去掉 link 也很简单:
$ npm unlink my-utils,如果想确认一下当前的link包有没有被删除掉,可使用如下命令看:npm ls my-utils(包名),如果删除成功,会显示empty