如何在node.js中使用一个模块的本地版本。例如,在我的应用程序中,我安装了coffee-script:
npm install coffee-script
这会将其安装在。/node_modules中,而coffee命令则安装在。/node_modules/.bin/coffee中。当我在项目的主文件夹中时,是否有一种方法可以运行此命令?我想我在寻找类似于捆绑执行者的东西。基本上,我想指定一个参与项目的每个人都应该使用的coffee-script版本。
我知道我可以添加-g标志来在全球范围内安装它,这样咖啡在任何地方都可以正常工作,但是如果我想在每个项目中使用不同版本的咖啡呢?
更新:如果你在最近的npm(版本>5.2)
你可以使用:
npx <command>
NPX在node_modules的.bin目录下查找命令
旧的回答:
对于Windows
将以下内容存储在一个名为npm-exec.bat的文件中,并将其添加到您的%PATH%
@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*
使用
然后你就可以用它
Npm-exec <command> <arg0> <arg1>…
例如
要执行本地node_modules目录下安装的wdio,请执行:
npm-exec wdio wdio.conf.js
例如,它将运行。\node_modules\.bin\wdio wdio.conf.js
如果你想让你的PATH变量根据你当前的工作目录正确地更新,把它添加到你的.bashrc等价文件的末尾(或者任何定义PATH的东西之后):
__OLD_PATH=$PATH
function updatePATHForNPM() {
export PATH=$(npm bin):$__OLD_PATH
}
function node-mode() {
PROMPT_COMMAND=updatePATHForNPM
}
function node-mode-off() {
unset PROMPT_COMMAND
PATH=$__OLD_PATH
}
# Uncomment to enable node-mode by default:
# node-mode
这可能会在每次呈现bash提示符时增加一个短延迟(很可能取决于项目的大小),因此默认情况下禁用它。
您可以在终端中通过分别运行node-mode和node-mode-off来启用和禁用它。
TL;DR:使用npm exec与npm@>=7。
在其他回答中提到的npx命令已经在npm@7中完全重写,该命令默认与node@15一起发布,可以安装在node@>=10上。这个实现现在等于新引入的npm exec命令,它类似于之前的npx命令实现,但不等于。
一个不同之处在于,当一个依赖项还没有安装时,它总是交互式地询问是否应该下载它(也可以用参数——yes或——no来覆盖)。
这里有一个npm exec的例子。双破折号(——)将npm exec参数与实际的命令参数分开:
npm exec --no -- jest --coverage
请参见更新后的npm exec官方文档。
你不必再操纵$PATH了!
从npm@5.2.0, npm附带了npx包,它可以让你从本地node_modules/.bin或中央缓存运行命令。
简单地运行:
$ npx [options] <command>[@version] [command-arg]...
默认情况下,npx将检查<命令>是否存在于$PATH或本地项目二进制文件中,并执行它。
当<命令>不在$PATH中时调用npx <命令>将自动从NPM注册表中为你安装一个带有该名称的包,并调用它。当它完成时,安装的包将不会在你的全局包的任何地方,所以你不必担心长期的污染。你可以通过提供——no-install选项来防止这种行为。
对于npm < 5.2.0,您可以通过执行以下命令手动安装npx包:
$ npm install -g npx
更新:正如Seyeong Jeong在他们的回答中指出的那样,从npm 5.2.0开始,你可以使用npx[命令],这更方便。
5.2.0之前版本的旧答案:
放置的问题
./node_modules/.bin
只有当你的当前工作目录是你的项目目录结构的根目录(即node_modules的位置)时,它才有效。
不管您的工作目录是什么,您都可以使用
npm bin
要执行本地安装的coffee二进制文件,而不依赖于项目目录层次结构中的位置,可以使用这个bash构造
PATH=$(npm bin):$PATH coffee
我把它别名为npm-exec
alias npm-exec='PATH=$(npm bin):$PATH'
现在我可以了
npm-exec coffee
无论我在哪里都能正确地运行咖啡
$ pwd
/Users/regular/project1
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee
$ cd lib/
$ npm-exec which coffee
/Users/regular/project1/node_modules/.bin/coffee
$ cd ~/project2
$ npm-exec which coffee
/Users/regular/project2/node_modules/.bin/coffee