【发布时间】:2019-09-06 04:31:16
【问题描述】:
我的package.json 中有一个脚本:
{
"scripts": {
"start": "source run-nvm.sh && ..."
}
}
但运行source run-nvm.sh && ... 与yarn start(或npm run start)不同。
为什么?它创建一个子shell。所以我不能改变原始shell的环境,我不能为它export常量或操纵nvm的状态(我不能改变父shell的节点版本)
所以真正的问题
我可以通过不创建子 shell 来执行 yarn/npm 脚本吗? (并使用当前的 shell)
或
如何使用 npm 脚本获取 shell 脚本?
最终,你可能会尝试通过询问来改变话语:“你为什么不只是 source run-nvm.sh && yarn start”但我不想只是添加一些自定义脚本和复杂性,我希望它在 @ 上自动执行987654329@ / npm start(自动更改节点版本)
真正的问题
它目前可以工作(脚本更改节点的版本并运行应用程序)但由于它是一个子shell,它不会保存 nvm 的状态。因此,在每个yarn start 上,它最初都使用默认版本,然后更改版本,然后启动应用程序,因此它为yarn start 命令增加了大约3-4 秒以进行版本更改。虽然它不应该每次都设置版本,但应该只设置一次,第一次。
【问题讨论】:
-
您可以使用相同的启动语法获取环境并运行命令,“start”:“source run-nvm.sh; cmd to run ; second cmd ; etc” 其他命令将在其中运行同一个壳。或者您可以按照您的说法在运行纱线之前获取环境。我认为除了在不使用外部命令的情况下自己设置环境变量之外别无选择。
-
@GaryB,是的,我想这里最接近的解决方案是使用 npm/yarn 以外的东西,这对于 npm 脚本的行为会略有不同,并且不会创建子 shell。不过这有点危险,并且需要所有脚本下所有库的信任。我最初来到这里是因为我想自动使用
nvm use。我最终使用了一个用于 nvm 的 vscode 插件,所以它只是在内置终端的我的项目文件夹中运行nvm use,所以无论打开什么项目 - nvm 都会自动切换到正确的 nodejs。不是一个理想的解决方案,因为它只适用于vscode,但还好 -
我知道它没有被明确要求,但是,bash 解决方案:
[ "$(node -v)" != "v10.24.1" ] && source run-nvm.sh && yarn start || yarn start -
您可以将所有这些都放在一个 bash 脚本中。 start.sh 并使用
bash ./start运行它,您也可以从 package.json grep 获取节点版本。而不是像我那样硬编码。
标签: node.js shell npm yarnpkg nvm