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

typ*_*ror 441 node.js coffeescript npm node-modules

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

npm install coffee-script
Run Code Online (Sandbox Code Playgroud)

这将安装它./node_modules并且coffee命令在./node_modules/.bin/coffee.当我在项目的主文件夹中时,有没有办法运行此命令?我想我正在寻找类似于bundle exec捆绑器的东西.基本上,我想指定一个与项目有关的每个人都应该使用的咖啡脚本版本.

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

reg*_*lar 520

更新:正如Seyeong Jeong在下面的回答中指出的,因为你可以使用npm 5.2.0 npx [command],这样更方便.

对于5.2.0之前的版本,OLD ANSWER:

推杆的问题

./node_modules/.bin
Run Code Online (Sandbox Code Playgroud)

进入你的PATH是它只有当你的当前工作目录是项目目录结构的根目录(即位置node_modules)时才有效

与您的工作目录无关,您可以获取本地安装的二进制文件的路径

npm bin
Run Code Online (Sandbox Code Playgroud)

coffee独立于项目目录层次结构中的位置执行本地安装的二进制文件,可以使用此bash构造

PATH=$(npm bin):$PATH coffee
Run Code Online (Sandbox Code Playgroud)

我把这个别名给了npm-exec

alias npm-exec='PATH=$(npm bin):$PATH'
Run Code Online (Sandbox Code Playgroud)

所以,现在我可以

npm-exec coffee
Run Code Online (Sandbox Code Playgroud)

无论我在哪里,都要运行正确的咖啡副本

$ 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
Run Code Online (Sandbox Code Playgroud)

  • 你甚至可以更进一步"alias coffee ="npm-exec coffee"` (17认同)
  • 您始终可以使用[npm scripts](https://docs.npmjs.com/cli/run-script),因为它们始终首先搜索本地二进制文件.您可以在那里为每个二进制文件设置别名,或者只使用"build"这样的通用名称. (16认同)
  • 哦,天哪!我真的必须做这样的事情才能让我的本地模块工作吗?向团队解释它是不切实际的!没有什么比这简单一点了吗? (10认同)
  • 当你进入另一个项目时输出会改变.在项目中进行cd时,它不会改变.`npm bin`在'ancestor目录'链中搜索node_modules目录的cwd.如果您特别想要使用项目的package.json中列出的模块的二进制文件,这正是所希望的行为. (6认同)
  • @philosodad,其实不,你没有.`PATH`将返回到命令调用之前的状态.在运行命令之前,在同一行中设置环境变量只会影响该命令的环境. (6认同)
  • 此解决方案的唯一问题是每次使用该命令时都会扩展路径. (5认同)
  • 这个答案已经过时了.使用[npx](/sf/answers/3161540441/)或[yarn](/sf/answers/3194342231/). (4认同)
  • 无论如何在Windows上以类似的方式执行此操作? (2认同)
  • 这个答案需要 NPM 9 的更新,它[删除](https://github.blog/changelog/2022-10-24-npm-v9-0-0-released/) `npm bin` 命令。发行说明表示今后将使用“npx”。请注意,“npx”的[当前版本](https://docs.npmjs.com/cli/v9/commands/npx?v=true) 不再重新安装已在本地安装的软件包。如果您不喜欢使用官方推荐的“npx”命令,您可能仍然可以使用“npm root”创建解决方案,但无论哪种方式,这个答案都需要更新。 (2认同)

Sey*_*ong 363

很好的例子

你不必再操纵$PATH了!

npm@5.2.0开始,npm附带了一个npx包,它允许您从本地node_modules/.bin或中央缓存运行命令.

简单地运行:

$ npx [options] <command>[@version] [command-arg]...
Run Code Online (Sandbox Code Playgroud)

默认情况下,npx将检查是否<command>存在于$PATH本地项目二进制文件中,并执行该操作.

调用npx <command>何时<command>尚未在您的$PATH遗嘱中自动从NPM注册表中为您安装具有该名称的包,并调用它.完成后,安装的软件包将不会出现在全局文件中的任何位置,因此您不必长期担心污染问题.您可以通过提供--no-install选项来阻止此行为.

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

$ npm install -g npx
Run Code Online (Sandbox Code Playgroud)

  • 这个答案很好。但我只想说“npx”很蹩脚。它应该是“npm run”或“npm exec”之类的。 (8认同)
  • 我不喜欢安装 3rd 方全局 npm 包,而 `npm` 和 `package.json` 提供几乎相同的功能。 (2认同)

jas*_*ssa 92

使用该npm bin命令获取项目的node modules/bin目录

$ $(npm bin)/<binary-name> [args]
Run Code Online (Sandbox Code Playgroud)

例如

$ $(npm bin)/bower install
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个糟糕的解决方案,但它不能在带有$的标准Windows命令行上运行.将它放在package.json脚本部分是一种更好的方法,因为它更兼容. (5认同)
  • 我喜欢这个简单而通用的解决方案.使别名看起来没必要. (4认同)

jla*_*jla 76

使用 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
Run Code Online (Sandbox Code Playgroud)

如果npm install有一个--add-script选项或者某个东西,或者如果npm run在没有添加脚本块的情况下运行会很好.

  • 这需要更多的赞成!在`-`之后将args传递给你的脚本:`npm run learnyounode - --normal-switches --watch -d*.js` (10认同)
  • 我发现在处理项目中的多个开发人员时这种方法更加统一 - 它避免了在本地配置任何东西的需要......你只需要'npm install`然后就可以访问你的dev依赖项了.唯一的小问题是你需要`npm run eslint`(或其他).你可以创建一个名为"start"的脚本来运行gulp,这样你只需要输入`npm start`来启动你的d​​ev服务器.非常酷的东西,没有bash善良,所以你的Windows朋友仍然喜欢你.:) (5认同)

mig*_*iam 42

使用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 
Run Code Online (Sandbox Code Playgroud)

安装

$ npm install -g npm-run
Run Code Online (Sandbox Code Playgroud)

  • 不再,请参阅上面提到的npx ... /sf/answers/3161540441/ (6认同)

Lin*_*iel 40

更新:我不再推荐这种方法,既出于上述安全原因,也不是最新的npm bin命令.原答案如下:

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

export PATH="./node_modules/.bin:$PATH"
Run Code Online (Sandbox Code Playgroud)

如果你把它放在你的中~/.profile,coffee将永远是./node_modules/.bin/coffee可用的,否则/usr/local/bin/coffee(或者你在下面安装节点模块的任何前缀).

  • 威尔罗宾逊,危险!在$ PATH中使用相对路径会打开一个与行星大小相当的安全漏洞,特别是如果你把它们放在前面作为第一个项目.如果你所在的目录是可写的(比如`/ tmp`中的某个地方),任何进程或用户都可以通过将普通命令的恶意版本(如`ls`,`cp`等)放在那里来劫持你的会话.这些可能会产生捕获密码的"隐形"子shell,等等. (71认同)

Bob*_*630 22

PATH解决方案的问题是,如果将$(npm bin)放在.profile/.bashrc/etc中,它将被评估一次,并永远设置为首先评估路径的目录.如果改为修改当前路径,则每次运行脚本时,您的路径都会增长.

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

function npm-exec {
   $(npm bin)/$@  
}
Run Code Online (Sandbox Code Playgroud)

然后可以像这样使用它而不对您的环境进行任何更改:

npm-exec r.js <args>
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个!我简单地命名我的函数`n` (2认同)

k0p*_*kus 21

如果你想保持npm,那么npx应该做你需要的.


如果切换到纱线(由facebook替换为npm)是您的选择,那么您可以致电:

 yarn yourCmd
Run Code Online (Sandbox Code Playgroud)

package.json中的脚本优先,如果没有找到,它将在./node_modules/.bin/文件夹中查找.

它还输出它运行的内容:

$ yarn tsc
yarn tsc v0.27.5
$ "/home/philipp/rate-pipeline/node_modules/.bin/tsc"
Run Code Online (Sandbox Code Playgroud)

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


如果你.scripts在你的内部定义了一个脚本package.json:

"tsc": "tsc" // each command defined in the scripts will be executed from `./node_modules/.bin/` first
Run Code Online (Sandbox Code Playgroud)

yarn tsc相当于yarn run tscnpm run tsc:

 yarn tsc
 yarn tsc v0.27.5
 $ tsc
Run Code Online (Sandbox Code Playgroud)


Dhe*_*kar 8

更新:如果您使用的是最近的npm(版本> 5.2)

您可以使用:

npx <command>
Run Code Online (Sandbox Code Playgroud)

npx.bin目录中查找命令node_modules

旧答案:

对于Windows

将以下内容存储在一个名为的文件中npm-exec.bat,并将其添加到您的%PATH%

@echo off
set cmd="npm bin"
FOR /F "tokens=*" %%i IN (' %cmd% ') DO SET modules=%%i
"%modules%"\%*
Run Code Online (Sandbox Code Playgroud)

用法

然后你可以像 npm-exec <command> <arg0> <arg1> ...

例如

要执行wdio安装在本地node_modules目录中的操作,请执行以下操作:

npm-exec wdio wdio.conf.js
Run Code Online (Sandbox Code Playgroud)

即它将运行 .\node_modules\.bin\wdio wdio.conf.js


gun*_*sus 6

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

scripts你的部分添加一个简单的行package.json,你可以运行本地的npm命令

npm run webpack

的package.json

scripts


nam*_*uol 5

如果您希望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
Run Code Online (Sandbox Code Playgroud)

这可能会在每次呈现bash提示时添加一个短暂的延迟(最有可能取决于项目的大小),因此默认情况下禁用它.

您可以分别通过运行node-mode和在终端内启用和禁用它node-mode-off.


Jai*_*ina 5

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

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

例如,我下载了一个Angular项目,我不想全局安装Angular CLI.因此,安装了npx,而不是使用全局角度cli命令(如果我已安装它),如下所示:

ng serve
Run Code Online (Sandbox Code Playgroud)

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

npx ng serve
Run Code Online (Sandbox Code Playgroud)

这是我写的一篇关于NPX 的文章,并且深入探讨了它.


ssc*_*ep3 5

TL;DR:npm execnpm@>=7.


npx其他答案中提到的命令已完全重写,npm@7默认情况下随附node@15并可以安装在node@>=10. 该实现现在等同于新引入的npm exec命令,它与之前的npx命令实现类似但不等于。

一个区别是,例如,当依赖项尚未安装时,它总是以交互方式询问是否应下载依赖项(也可以用参数--yes或覆盖--no)。

下面是一个例子npm exec。双破折号 ( --) 将npm exec参数与实际命令参数分开:

npm exec --no -- jest --coverage
Run Code Online (Sandbox Code Playgroud)

另请参阅更新的官方文档npm exec