1

我正在尝试检测是否未安装某些 ruby​​ gem,请先安装它然后继续。

例如:

gem which rails

如果 gem 存在,则返回 gem 的驱动程序文件 ( .rb)的路径stdout,如果不存在,则检查将在stderr.

我该如何解决?

伪代码:

if throws "gem which example1" ( gem install example1 )
if throws "gem which example2" ( gem install example2 )
if throws "gem which example3" ( gem install example3 )

:: install other stuff

cmd 或 powershell 都可以。

我需要在 AppVeyor CI yaml 配置文件中添加这些。AppVeyor CI 具有缓存 DRY 安装目录以提高构建性能的出色功能。所以我已经缓存了 gems 目录,它在运行构建时恢复正常,但gem install无论如何都会重新安装 gem!

4

2 回答 2

1

通过使用 powershell 运行命令,您可以使用错误重定向来检查命令是否成功:

$gemPath = gem which example3 2>$null

if ($gemPath)
{
    # We got a path for the gem driver
}
else
{
    # Failed, gem might not be installed
}

说明:我们告诉 powershell 将“gem which example3”的结果存储在变量$gemPath中,但是如果出现错误,我们希望$null通过使用将错误重定向到变量2>$null

您还可以将 2 替换为与您要捕获的流相对应的数字(成功、错误、警告等)

    *   All output
    1   Success output
    2   Errors
    3   Warning messages
    4   Verbose output
    5   Debug messages

有关重定向的更多信息,请点击About_Redirection

于 2015-03-04T02:16:02.510 回答
1

尝试,在 .cmd 脚本中:

gem which rails 1>nul 2>&1
IF ERRORLEVEL 1 (gem install rails)

我在这里假设您希望输出到此批处理脚本的目的stdout并被stderr扼杀 - 否则,删除1>nul 2>&1.

于 2015-03-04T06:31:38.130 回答