执行当前目录下的npm包而不是全局的npm包

本文探讨了在npm中如何避免全局安装包,转而使用局部安装的包。当全局安装npm包时,系统会创建软链接,使得在任何目录下都能调用。然而,局部安装时,包位于`node_modules`目录下,并且`.bin`目录包含指向可执行文件的软链接。要运行局部安装的包,可以通过`npm run`、修改`PATH`环境变量或使用`./node_modules/.bin/`前缀。文章提供了多种在命令行中运行局部npm包的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Reference:(http://firstdoit.com/npm-scripts/)[http://firstdoit.com/npm-scripts/]

1.使用全局安装发生了什么事

一般情况下,我们会使用npm install -g pkg来安装包,在任何目录下,都可以使用该pkg包提供的命令行工具来执行命令。例如,出名的broserify。在官方的文档中有说明该包的用法,大致分为两步.

第一步是install

安装:

npm install -g browserify

第二步是编译:

$ browserify main.js > bundle.js

那么计算机怎么知道$ browserify命令执行的是哪个js文件呢?
系统中命令的目标执行文件是按照$PATH这个系统变量来查找的,那么通过-g参数安装的包都是放到$PATH路径下的.

那么通过npm install -g安装的包都放在’/usr/local/lib/node_modules’,在包的package.json中配置了"bin":{"命令名A":"可执行文件的路径",},在install命令执行时,在/usr/local/bin目录下,就会生成一个命令名A的软连接,该软连接指向的是可执行文件的路径

以安装tldr包为例子,(该工具是一个命令行工具,和man <command>类似,参考https://github.com/tldr-pages/tldr
1.npm install -g tldr 这里写图片描述
2.查看其中的package.json
这里写图片描述
3.在/usr/local/bin中生成了一个名为「tldr」的软连接,指向的是package.json中配置的目标文件
这里写图片描述

2 .局部安装发生了什么事

但是,如果我们不想安装成全局的,安装成本地目录下,那么如何在本地目录下通过命令行形式来运行这个npm包提供的命令呢?

还是以tldr为例,只不过这次安装没有-g,只是安装在本地的一个名为nodejs的文件夹下,看看安装的时候,发生了什么事情。

1.在nodejs文件夹下面生成了一个node_modules的文件夹,安装的tldr源码就位于这个文件夹下。
这里写图片描述
2.但是同时,在node_modules中也有一个.bin的文件夹。里面有一个tldr的软连接,指向的是../tldr/bin/tldr
这里写图片描述

3.如何命令行运行局部安装的npm包

那么现在的问题是如何在本地通过命令行的方式来运行这个../tldr/bin/tldr 文件

为了说明方法,卸载了全局的tldr,npm uninstall tldr -g ,此时再运行tldr命令,这里写图片描述

此时可以使用最傻的办法,当然是这样的,使用node命令(因为是一个js文件)来运行这个命令,(其中的ls是该命令行的参数,请无视。。。),或者直接/node_modules/.bin/tldr ls 也是可以的(因为在tldr文件的顶部有这样一句#!/usr/bin/env node它告诉shell,可以用node命令来执行我,这和普通给的.sh文件是类似的。)
这里写图片描述,

方法有很多种,
方法一:使用npm run scriptname,在局部的package.json中配置了script字段,那么就可以在该目录下,通过npm run来运行该脚本,nodejs/package.json中配置如下:

{
  "name": "nodeTestDemo",
  "version": "1.0.0",
  "description": "my own node project",
  "main": "index.js",
  "scripts": {
    "tldr":"./node_modules/.bin/tldr"
  },
  "keywords": [
    "kiwizhang.zd"
  ],
  "author": "kiwi",
  "license": "ISC",
  "dependencies": {
    "iconv-lite": "^0.4.13",
    "tldr": "^1.4.0"
  },
  "devDependencies": {
    "mocha": "^2.3.4"
  }
}

在nodejs这个目录下运行:
这里写图片描述

方法二:
通过修改$PATH这个环境变量,让其优先查找当前的./node_modules/.bin目录,比较野蛮的方法,具体可以参考:
http://stackoverflow.com/questions/9679932/how-to-use-package-installed-locally-in-node-modules下 Linus Gustav Larsson Thiel的回答。同时他也提到了该方法可能安全性方面的问题,具体为何有安全性的问题,我就没有仔细去读了

方法三:
和方法一类似,只不过,此时的script配置略显不同,采用的$(npm bin)来获取当前目录的node_modules/.bin

"scripts": {
    "tldr":"$(npm bin)/tldr"
  },
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值