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

npm install coffee-script

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

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


当前回答

PATH解决方案有一个问题,如果$(npm bin)被放在你的.profile/。Bashrc /etc只计算一次,并且永远被设置到路径第一次计算所在的目录。如果您修改当前路径,那么每次运行脚本时,路径都会增长。

为了解决这些问题,我创建了一个函数并使用它。它不会修改您的环境,使用简单:

function npm-exec {
   $(npm bin)/$@  
}

然后可以像这样使用,而不需要对环境进行任何更改:

npm-exec r.js <args>

其他回答

PATH解决方案有一个问题,如果$(npm bin)被放在你的.profile/。Bashrc /etc只计算一次,并且永远被设置到路径第一次计算所在的目录。如果您修改当前路径,那么每次运行脚本时,路径都会增长。

为了解决这些问题,我创建了一个函数并使用它。它不会修改您的环境,使用简单:

function npm-exec {
   $(npm bin)/$@  
}

然后可以像这样使用,而不需要对环境进行任何更改:

npm-exec r.js <args>

我遇到了同样的问题,我不特别喜欢使用别名(正如常规的建议),如果你也不喜欢它们,那么这里有另一个我使用的解决方案,你首先必须创建一个小的可执行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>'
}

我提出了一个我已经开发的新解决方案(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

我一直使用与@guneysus相同的方法来解决这个问题,即在包中创建一个脚本。Json文件,并使用它运行NPM run script-name。

然而,最近几个月我一直在使用npx,我很喜欢它。

例如,我下载了一个Angular项目,但我不想全局安装Angular CLI。所以,在安装了npx之后,不用使用angular cli的全局命令(如果我已经安装了它),就像这样:

ng serve

我可以从控制台这样做:

npx ng serve

这是我写的一篇关于NPX的文章,更深入地讨论了它。

更新:如果你在最近的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