有没有办法在预启动 npm 脚本中自动运行“nvm use”?

Posted

技术标签:

【中文标题】有没有办法在预启动 npm 脚本中自动运行“nvm use”?【英文标题】:Is there a way to run "nvm use" automatically in a prestart npm script? 【发布时间】:2016-03-21 22:42:10 【问题描述】:

我希望在运行“npm start”时自动调用“nvm use”。 所以我想出了这个解决方案:

package.json 文件

"scripts": 
  "prestart": "sh test.sh",
  "start": "nodemon index.js"

.nvmrc 文件

4

test.sh 文件

#!/bin/bash

if [ -d ~/.nvm ]
  then
    source ~/.nvm/nvm.sh

    nvm use
fi

这工作并在 nvm 版本之间切换控制台输出是:

> sh test.sh

Found '/my-user-path/.nvmrc' with version <4>
Now using node v4.2.2 (npm v2.14.7)

> app@1.0.0 start /app-path/
> nodemon index.js

但是当我调用表单 index.js “console.log(process.versions);” nvm 脚本可能在不同的进程中执行,因此输出为:

 
  http_parser: '2.6.0',
  node: '5.1.0',
  v8: '4.6.85.31',
  uv: '1.7.5',
  zlib: '1.2.8',
  ares: '1.10.1-DEV',
  icu: '56.1',
  modules: '47',
  openssl: '1.0.2d' 

关于如何以适当的方式处理此问题的任何建议?

谢谢

【问题讨论】:

相关:***.com/q/23556330/320399 【参考方案1】:

通常在 Mac 上,nvm.sh 文件位于您的主路径中。如果您有多个 Mac 用户处理代码,请使用 $HOME 变量。

"scripts": 
    "prestart": "source $HOME/.nvm/nvm.sh; nvm use"

我会将此作为评论添加到上述回复中,但我不允许:(

【讨论】:

这在预启动脚本中不起作用。根据@LLeo 的回答,它必须在启动脚本中。 我必须在命令的开头添加unset PREFIX; 才能使其工作。谢谢! @JonathonHill 今天仍然如此吗?没有理由怀疑,除了 NodeJS/npm 进化 类似于@norfeldt,我添加了--delete-prefix。整个脚本:source $HOME/.nvm/nvm.sh; nvm use --delete-prefix【参考方案2】:

你的 package.json 可能看起来像

"scripts": 
    "start": "source /whereever/located/nvm.sh; nvm use; nodemon index.js"

解释一下。 “开始”行是单个 shell 实例。所以你必须让 nvm 在那个 shell 实例中初始化 PATH 。此外,nvm 是一个 shell 函数,而不是可执行的 shell 脚本。 nvm 函数存在于 shell 实例中,并通过获取 nvm.sh 文件来创建。

抱歉,我没有测试我的前两个。

【讨论】:

谢谢@LLeo。这对我来说效果最好,因为我能够创建不会影响我的团队成员的自己的脚本,因为我不知道谁拥有 nvm 以及它是否安装在与其他人相同的位置。我没有测试它,但顾名思义,prestart 会影响我不需要的所有脚本。 我确实对您的回答有疑问。使用分号是否等同于使用双&? ; =&gt; &amp;&amp;我尝试了两种方法,它们都奏效了。只是希望了解这些差异,如果除了美学之外还有其他差异 分号只是shell中的命令分隔符。 “&&” 仅当左侧的命令返回“true”时才执行该行的其余部分,即退出代码 0(如果为 false,则非零)。 谢谢@LLeo。再次感谢您的出色回答:)【参考方案3】:

Mac 版 例如:

"scripts": 
    "dev": "source $HOME/.nvm/nvm.sh; nvm use;nvm use v14.17.5 && npm run dev"
  ,

【讨论】:

以上是关于有没有办法在预启动 npm 脚本中自动运行“nvm use”?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 codesandbox.io 中使用 npm 脚本?

安装node.js版本管理器nvm以及添加npm

pm2 可以运行“npm start”脚本吗

NPM 和 NVM 的区别

解决办法‘npm‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

nvm的安装,安装node,npm