如何使用在node_modules中本地安装的软件包?

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

npm install coffee-script

这会将其安装在中./node_modules,coffee命令在中./node_modules/.bin/coffee当我位于项目的主文件夹中时,是否可以运行此命令?我想我正在寻找类似于bundle exec捆扎机中的东西基本上,我想指定一个咖啡脚本的版本,参与该项目的每个人都应该使用。

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

GO前端2020/03/16 22:20:27

在package.json中包含coffee-script以及每个项目所需的特定版本,通常是这样的:

"dependencies":{
  "coffee-script": ">= 1.2.0"

Then run npm install to install dependencies in each project. This will install the specified version of coffee-script which will be accessible locally to each project.

村村达蒙LEY2020/03/16 22:20:27

对于Windows,使用以下命令:

/* cmd into "node_modules" folder */
"%CD%\.bin\grunt" --version
西里神乐2020/03/16 22:20:27

我很想知道这是否是一个不安全/不好的主意,但经过一番思考,我在这里看不到任何问题:

修改Linus的不安全的解决方案将其添加到年底,用npm bin找到的目录,使脚本只调用npm binpackage.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
}

对于bashprecmd您可以使用$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"
西门樱Eva2020/03/16 22:20:27

我是Windows用户,这对我有用:

// First set some variable - i.e. replace is with "xo"
D:\project\root> set xo="./node_modules/.bin/"

// Next, work with it
D:\project\root> %xo%/bower install

祝好运。

小小理查德2020/03/16 22:20:27

zxc就像是nodejs的“ bundle exec”。它类似于使用PATH=$(npm bin):$PATH

$ npm install -g zxc
$ npm install gulp
$ zxc which gulp
/home/nathan/code/project1/node_modules/.bin/gulp
L泡芙Jim2020/03/16 22:20:27

您也可以使用direnv并仅在工作文件夹中更改$ PATH变量。

$ cat .envrc
> export PATH=$(npm bin):$PATH
ItachiNear2020/03/16 22:20:27

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

scripts您的部分添加一条简单的代码package.json,您可以运行本地npm命令,例如

npm run webpack

package.json

{
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack"
  },
  "devDependencies": {
    "webpack": "^4.1.1",
    "webpack-cli": "^2.0.11"
  }
}
番长千羽2020/03/16 22:20:27

如果您希望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

HarryGO理查德2020/03/16 22:20:27

与@regular的解决方案相同,但具有鱼壳的味道

if not contains (npm bin) $PATH
    set PATH (npm bin) $PATH
end
神奇Green2020/03/16 22:20:27

我一直使用与@guneysus相同的方法来解决此问题,该方法是在package.json文件中创建一个脚本,并使用它运行npm run script-name。

但是,在最近几个月中,我一直在使用npx,并且我喜欢它。

例如,我下载了一个Angular项目,但是我不想全局安装Angular CLI。因此,在安装npx的情况下,不要像这样使用全局角度cli命令(如果已安装):

ng serve

我可以从控制台执行此操作:

npx ng serve

这是我写的有关NPX 的文章,并且深入其中。

理查德十三Davaid2020/03/16 22:20:27

如果要保留npm,则npx应该做您需要的事情。


如果您选择切换到yarn(由npm替换为facebook),则可以致电:

 yarn yourCmd

package.json内的脚本优先,如果找不到脚本,则查找./node_modules/.bin/文件夹内的脚本

它还输出运行结果:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"

因此,您不必为.NET中的每个命令设置脚本package.json


如果你有一个脚本在定义.scripts你的里面package.json

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first

yarn tsc将等于yarn run tscnpm run tsc

 yarn tsc
 yarn tsc v0.27.5
 $ tsc
路易阳光2020/03/16 22:20:26

PATH解决方案存在以下问题:如果将$(npm bin)放在.profile / .bashrc / etc中,则将对其进行一次评估,并将其永久设置为该路径首先在其中评估的目录。如果相反,则修改当前路径,则每次运行脚本时,路径都会增加。

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

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

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

npm-exec r.js <args>
小胖神奇前端2020/03/16 22:20:26

采用 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块的情况下可以运行,那就太好了。

梅十三Near2020/03/16 22:20:26

更新:出于上述安全原因,并且至少不是较新的npm bin命令,我不再推荐此方法原始答案如下:

如您所知,任何本地安装的二进制文件都在中./node_modules/.bin为了始终在此目录中运行二进制文件,而不是在全球可用的二进制文件中运行二进制文件(如果存在),建议您./node_modules/.bin首先输入路径:

export PATH="./node_modules/.bin:$PATH"

如果将其放在您的中~/.profilecoffee则始终./node_modules/.bin/coffee可用(否则)/usr/local/bin/coffee(或要在其下安装节点模块的任何前缀)。

小小蛋蛋2020/03/16 22:20:26

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

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

例如

$ $(npm bin)/bower install
老丝村村Stafan2020/03/16 22:20:26

使用npm-run

从自述文件:

npm运行

从node_modules查找并运行本地可执行文件

可用于npm生命周期脚本的任何可执行文件都可用于npm-run

用法

$ npm install mocha # mocha installed in ./node_modules
$ npm-run mocha test/* # uses locally installed mocha executable 

安装

$ npm install -g npm-run