如何在node.js中使用一个模块的本地版本。例如,在我的应用程序中,我安装了coffee-script:
npm install coffee-script
这会将其安装在。/node_modules中,而coffee命令则安装在。/node_modules/.bin/coffee中。当我在项目的主文件夹中时,是否有一种方法可以运行此命令?我想我在寻找类似于捆绑执行者的东西。基本上,我想指定一个参与项目的每个人都应该使用的coffee-script版本。
我知道我可以添加-g标志来在全球范围内安装它,这样咖啡在任何地方都可以正常工作,但是如果我想在每个项目中使用不同版本的咖啡呢?
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官方文档。
使用npm run[-script] <脚本名>
使用npm将bin包安装到本地的。/node_modules目录后,修改package。Json添加<脚本名称>,如下所示:
$ npm install --save learnyounode
$ edit packages.json
>>> in packages.json
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"learnyounode": "learnyounode"
},
...
$ npm run learnyounode
如果npm install有——add-script选项之类的,或者如果npm run不添加脚本块也能正常工作,那就太好了。
更新:如果你在最近的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
我很想知道这是否是一个不安全的/坏主意,但在思考了一会儿之后,我不认为这是一个问题:
修改Linus的不安全解决方案,将其添加到末尾,使用npm bin查找目录,并使脚本只在包时调用npm bin。json是存在于一个父(速度),这是我为zsh:
find-up () {
path=$(pwd)
while [[ "$path" != "" && ! -e "$path/$1" ]]; do
path=${path%/*}
done
echo "$path"
}
precmd() {
if [ "$(find-up package.json)" != "" ]; then
new_bin=$(npm bin)
if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
export NODE_MODULES_PATH=$new_bin
fi
else
if [ "$NODE_MODULES_PATH" != "" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}
export NODE_MODULES_PATH=""
fi
fi
}
对于bash,不使用precmd钩子,你可以使用$PROMPT_COMMAND变量(我还没有测试过,但你知道的):
__add-node-to-path() {
if [ "$(find-up package.json)" != "" ]; then
new_bin=$(npm bin)
if [ "$NODE_MODULES_PATH" != "$new_bin" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}:$new_bin
export NODE_MODULES_PATH=$new_bin
fi
else
if [ "$NODE_MODULES_PATH" != "" ]; then
export PATH=${PATH%:$NODE_MODULES_PATH}
export NODE_MODULES_PATH=""
fi
fi
}
export PROMPT_COMMAND="__add-node-to-path"