如何在node.js
中使用模块的本地版本。 例如,在我的应用中,我安装了coffee-script:
npm install coffee-script
这会将它安装在./node_modules
,而coffee命令在./node_modules/.bin/coffee
。 当我位于项目的主文件夹中时,是否可以运行此命令? 我猜我在寻找与bundler中的bundle exec
类似的东西。 基本上,我想指定一个咖啡脚本的版本,参与该项目的每个人都应该使用。
我知道我可以添加-g
标志以在全球范围内安装它,这样咖啡在任何地方都可以正常工作,但是如果我想每个项目使用不同版本的咖啡怎么办?
#1楼
更新 :正如Seyeong Jeong在下面的答案中指出的那样,从npm 5.2.0开始,您可以使用npx [command]
,这更加方便。
5.2.0之前的版本的旧答案 :
推杆的问题
./node_modules/.bin
进入PATH的地方是,它仅在当前工作目录是项目目录结构的根目录(即node_modules
的位置) 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
#2楼
如果要根据当前工作目录正确更新PATH变量,请将其添加到.bashrc
-equivalent的末尾(或在定义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
在终端中启用和禁用它。
#3楼
使用npm bin
命令获取项目的节点模块/ bin目录
$ $(npm bin)/<binary-name> [args]
例如
$ $(npm bin)/bower install
#4楼
我遇到了同样的问题,我不特别喜欢使用别名(按照常规建议),如果您也不喜欢它们,那么这是我使用的另一种解决方法,您首先必须创建一个很小的可执行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
如果您在package.json中使用scripts
,则:
...,
scripts: {
'start': './setenv.sh <command>'
}
#5楼
使用npm run[-script] <script name>
使用npm将bin软件包安装到本地./node_modules
目录后,修改package.json
以添加<script name>
如下所示:
$ 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在不添加到scripts块的情况下可以运行,那将是很好的。
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3161618