npm link的探究

每次和电脑直接的交互都是给电脑下达一定的指令,电脑根据指令调用执行相应任务。
(待~~~~)

npm line 方式

一. 操作流程

  1. 我们在开发的目录下,编写一个最简单的node可执行文件a.js
    1
    2
    #!/usr/bin/env node
    console.log('hello Ryan');

#!/usr/bin/env node这句很重要,后面解释。

  1. 建立package.json文件

    1
    2
    3
    4
    5
    6
    {
    "name":"npm-link",
    "bin":{
    "ryan":"a.js"
    }
    }
  2. 在该文件夹下执行npm link

  3. 可在任意文件夹下运行ryan

二. 问题就来了

  • npm link执行,发生了什么?
  • 命令行输入ryan,怎么调用的?

第一个问题 npm link执行,发生了什么?

官方解释点这里;

1
2
cd ../dev/node-redis
npm link

在开发的目录下执行npm link,会在npm全局的文件夹根据package.json的描述创建引用文件指向本地

1
2
cd ../dev/node-bloggy
npm link redis

在其他要用到redis的文件夹下执行npm link redis,该文件夹
下的node_modules文件夹夹的向redis所在文件的引用文件
npm link的源码文件中的注解说的相当明白:

1
2
// link with no args: symlink the folder to the global location
// link with package arg: symlink the global to the local


我在windows环境下相应开发文件夹下执行npm link

  1. npm全局的文件夹~\AppData\Roaming\npm目录下多了两个文件:ryan,ryan.cmd

    • ryan是shell编程的脚本
    • ryan.cmd dos编程的脚本
  2. 相应的在全局的node_moudules多一个npm-link的引用文件夹

注: package.json如果不写name属性,会导致node_moudules文件直接是引用文件夹,所以name属性是必须的

问题就来了为什么生成ryan的文件的?而不是其他的?
这就看npm link 命令都做了什么!
查看文件..\nodejs\node_modules\npm\lib\link.js

1
2
3
4
5
6
7
function link (args, cb) {
....
if (args.length) return linkInstall(args, cb)
linkPkg(npm.prefix, cb)
}
function linkInstall (pkgs, cb) {...}
function linkPkg (folder, cb_) {...}

linkInstall:引用链接到
linkPkg:
调用了bulid.js
#!/usr/bin/env node这句注释什么作用?

第二个问题 命令行输入ryan,怎么调用的?
path