我正在尝试检测是否未安装某个ruby gem,先安装然后继续。
例如:
gem which rails
返回.rb
上gem的驱动程序文件(stdout
)的路径,如果gem存在,如果不存在则检查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
无论如何重新安装了宝石!
答案 0 :(得分: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的结果,其中示例3"在变量$gemPath
中,如果出现错误,我们希望使用$null
将错误重定向到变量2>$null
您还可以使用与您要捕获的流相对应的数字替换2(成功,错误,警告等)
* All output
1 Success output
2 Errors
3 Warning messages
4 Verbose output
5 Debug messages
有关此处重定向的更多信息About_Redirection
答案 1 :(得分:1)
尝试使用.cmd脚本:
gem which rails 1>nul 2>&1
IF ERRORLEVEL 1 (gem install rails)
我假设您希望输出stdout
和stderr
为此批处理脚本的目的而扼杀 - 否则,请删除1>nul 2>&1
。