如何在node.js中使用一个模块的本地版本。例如,在我的应用程序中,我安装了coffee-script:

npm install coffee-script

这会将其安装在。/node_modules中,而coffee命令则安装在。/node_modules/.bin/coffee中。当我在项目的主文件夹中时,是否有一种方法可以运行此命令?我想我在寻找类似于捆绑执行者的东西。基本上,我想指定一个参与项目的每个人都应该使用的coffee-script版本。

我知道我可以添加-g标志来在全球范围内安装它,这样咖啡在任何地方都可以正常工作,但是如果我想在每个项目中使用不同版本的咖啡呢?


当前回答

使用npm bin命令获取项目的节点模块/bin目录

$ $(npm bin)/<binary-name> [args]

e.g.

$ $(npm bin)/bower install

其他回答

如果你想让你的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

我不喜欢依赖shell别名或其他包。

向包的脚本部分添加简单的一行。Json,你可以运行本地NPM命令像

pm网络包装

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}

你不必再操纵$PATH了!

从npm@5.2.0, npm附带了npx包,它可以让你从本地node_modules/.bin或中央缓存运行命令。

简单地运行:

$ npx [options] <command>[@version] [command-arg]...

默认情况下,npx将检查<命令>是否存在于$PATH或本地项目二进制文件中,并执行它。

当<命令>不在$PATH中时调用npx <命令>将自动从NPM注册表中为你安装一个带有该名称的包,并调用它。当它完成时,安装的包将不会在你的全局包的任何地方,所以你不必担心长期的污染。你可以通过提供——no-install选项来防止这种行为。

对于npm < 5.2.0,您可以通过执行以下命令手动安装npx包:

$ npm install -g npx

将此脚本添加到您的.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命令太慢。