指定Yarn用于运行脚本的shell。
指定Yarn用于运行脚本的shell。
我的package.json
文件中有一个脚本,如下所示:\n\"buildTslint\": \"node_modules/typescript/bin/tsc node_modules/awesomeLibrary_node_tslint/{,helpers/}*.ts\",
\n请注意{,helpers/}*.ts
这部分,这被称为花括号展开,只能在bash
中使用,而不能在sh
中使用。\n当运行yarn buildTslint
时,我得到以下输出:\n
# yarn buildTslint yarn buildTslint v0.22.0 $ node_modules/typescript/bin/tsc node_modules/awesomeLibrary_node_tslint/{,helpers/}*.ts error TS6053: 文件 'node_modules/awesomeLibrary_node_tslint/{,helpers/}*.ts' 未找到。 error 命令执行失败,退出码为2。
\n看起来Yarn使用sh
来执行这些脚本,但我想在这里使用bash
,以便能够使用花括号展开。
问题出现的原因是Yarn目前还没有提供一种配置运行脚本时使用的默认shell的方法。然而,由于yarn使用Node来生成其进程,可以通过更改Node本身使用的默认shell来解决这个问题。
在Ubuntu上,如果您拥有root权限,可以通过更改符号链接/bin/sh来指向除dash之外的其他内容来实现:
sudo ln -sf /bin/bash /bin/sh
在Windows的Git-bash中,您可以将COMSPEC环境变量更改为其他内容而不是C:\Windows\system32\cmd.exe,但这对我来说并没有起作用。
您可以参考以下链接了解更多信息:
- Force node to use git bash on windows: https://stackoverflow.com/questions/35462422
此问题的链接已于2018年初得到解决。因此,我认为`yarn config set script-shell bash`应该可以解决问题。
问题的出现原因是Yarn在运行脚本时使用了默认的shell(/bin/sh),而不是用户想要的shell(比如bash)。这可能导致脚本无法按预期执行。
解决方法是将命令更改为使用bash来运行,可以通过修改命令为“bash -c 'command ..'”来实现。这样Yarn将使用bash作为默认的shell来执行脚本。
但是,这种解决方法只是针对当前的命令,如果想要设置默认的shell,以后不再出现这个问题,似乎并没有直接的方法可以通过Yarn的系统调用来设置默认的shell。这是Yarn的具体实现方式决定的,并且根据man手册中的说明,系统调用和exec函数使用的是/bin/sh作为默认的shell。
因此,目前来看,似乎不能通过Yarn的系统调用来设置默认的shell。
Yarn在1.19版本中新增了一个配置参数`script-shell`,用于指定运行脚本的shell。现在可以通过以下方式来使用该参数:
设置为`/bin/bash`:
yarn config set script-shell /bin/bash
重置为默认值:
yarn config delete script-shell
让Yarn使用Powershell(在Powershell中运行以下命令):
yarn config set script-shell (Get-Command powershell.exe).Definition
官方文档在哪里?在v1的文档中找不到这个信息。
今天你救了我,谢谢!