如何在node.js中使用一个模块的本地版本。例如,在我的应用程序中,我安装了coffee-script:
npm install coffee-script
这会将其安装在。/node_modules中,而coffee命令则安装在。/node_modules/.bin/coffee中。当我在项目的主文件夹中时,是否有一种方法可以运行此命令?我想我在寻找类似于捆绑执行者的东西。基本上,我想指定一个参与项目的每个人都应该使用的coffee-script版本。
我知道我可以添加-g标志来在全球范围内安装它,这样咖啡在任何地方都可以正常工作,但是如果我想在每个项目中使用不同版本的咖啡呢?
我很想知道这是否是一个不安全的/坏主意,但在思考了一会儿之后,我不认为这是一个问题:
修改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"
如果您正在使用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中是不可用的。
如果你想保留npm,那么npx应该做你所需要的。
如果切换到yarn (facebook的npm替代品)是你的一个选择,那么你可以调用:
yarn yourCmd
包中的脚本。Json将优先,如果没有找到,它将在./node_modules/.bin/文件夹中查找。
它还输出它运行的内容:
$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"
因此,您不必为package.json中的每个命令设置脚本。
如果你在package.json中有一个定义在.scripts的脚本:
"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first
纱线TSC相当于纱线运行TSC或NPM运行TSC:
yarn tsc
yarn tsc v0.27.5
$ tsc
更新:正如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