如何在node.js中使用一个模块的本地版本。例如,在我的应用程序中,我安装了coffee-script:
npm install coffee-script
这会将其安装在。/node_modules中,而coffee命令则安装在。/node_modules/.bin/coffee中。当我在项目的主文件夹中时,是否有一种方法可以运行此命令?我想我在寻找类似于捆绑执行者的东西。基本上,我想指定一个参与项目的每个人都应该使用的coffee-script版本。
我知道我可以添加-g标志来在全球范围内安装它,这样咖啡在任何地方都可以正常工作,但是如果我想在每个项目中使用不同版本的咖啡呢?
我遇到了同样的问题,我不特别喜欢使用别名(正如常规的建议),如果你也不喜欢它们,那么这里有另一个我使用的解决方案,你首先必须创建一个小的可执行bash脚本,说setenv.sh:
#!/bin/sh
# Add your local node_modules bin to the path
export PATH="$(npm bin):$PATH"
# execute the rest of the command
exec "$@"
然后,您可以使用以下命令使用本地/bin中的任何可执行文件:
./setenv.sh <command>
./setenv.sh 6to5-node server.js
./setenv.sh grunt
如果你在包中使用脚本。json:
...,
scripts: {
'start': './setenv.sh <command>'
}
将此脚本添加到您的.bashrc。然后你可以叫咖啡或当地的任何东西。这对你的笔记本电脑很方便,但不要在你的服务器上使用。
DEFAULT_PATH=$PATH;
add_local_node_modules_to_path(){
NODE_MODULES='./node_modules/.bin';
if [ -d $NODE_MODULES ]; then
PATH=$DEFAULT_PATH:$NODE_MODULES;
else
PATH=$DEFAULT_PATH;
fi
}
cd () {
builtin cd "$@";
add_local_node_modules_to_path;
}
add_local_node_modules_to_path;
注意:这个脚本使cd命令的别名,在每次调用cd之后,它会检查node_modules/.bin并将其添加到$PATH中。
注2:你可以把第三行改为NODE_MODULES=$(npm bin);但这将使cd命令太慢。
如果您正在使用fish shell,并且出于安全原因不想添加到$path。我们可以添加下面的函数来运行本地节点可执行文件。
### run executables in node_module/.bin directory
function n
set -l npmbin (npm bin)
set -l argvCount (count $argv)
switch $argvCount
case 0
echo please specify the local node executable as 1st argument
case 1
# for one argument, we can eval directly
eval $npmbin/$argv
case '*'
set --local executable $argv[1]
# for 2 or more arguments we cannot append directly after the $npmbin/ since the fish will apply each array element after the the start string: $npmbin/arg1 $npmbin/arg2...
# This is just how fish interoperate array.
set --erase argv[1]
eval $npmbin/$executable $argv
end
end
现在你可以这样运行:
n咖啡
或者更多像这样的论点:
N浏览器同步——版本
注意,如果您是bash用户,则可以使用bash的$@来回答@ bob9630,这在fishshell中是不可用的。
如果你想让你的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来启用和禁用它。
更新:如果你在最近的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