如何在node.js中使用一个模块的本地版本。例如,在我的应用程序中,我安装了coffee-script:
npm install coffee-script
这会将其安装在。/node_modules中,而coffee命令则安装在。/node_modules/.bin/coffee中。当我在项目的主文件夹中时,是否有一种方法可以运行此命令?我想我在寻找类似于捆绑执行者的东西。基本上,我想指定一个参与项目的每个人都应该使用的coffee-script版本。
我知道我可以添加-g标志来在全球范围内安装它,这样咖啡在任何地方都可以正常工作,但是如果我想在每个项目中使用不同版本的咖啡呢?
我提出了一个我已经开发的新解决方案(05/2021)
您可以使用lpx https://www.npmjs.com/package/lpx来
运行本地node_modules/.bin文件夹中的二进制文件
在工作空间的任何地方运行工作空间根目录的node_modules/.bin中的二进制文件
如果在本地找不到二进制文件,LPX不会下载任何包(即不像npx)
例子:
LPX TSC -b -w将与本地typescript包一起运行TSC -b -w
如果你想让你的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来启用和禁用它。
我很想知道这是否是一个不安全的/坏主意,但在思考了一会儿之后,我不认为这是一个问题:
修改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"
我遇到了同样的问题,我不特别喜欢使用别名(正如常规的建议),如果你也不喜欢它们,那么这里有另一个我使用的解决方案,你首先必须创建一个小的可执行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>'
}