升级或安装自制程序

时间:2017-04-25 19:35:02

标签: homebrew

在我的CI设置中,我想确保安装了给定公式的最新版本,无论它是否已安装。

我目前正在使用类似的内容:

brew update
brew install FORMULA || (brew upgrade FORMULA && brew cleanup FORMULA)

这种方法有哪些缺陷?有没有更好的方法解决问题(例如,首先查询是否已安装FORMULA,而不是仅在安装了FORMULA时依赖brew install失败)?

2 个答案:

答案 0 :(得分:2)

我想安装Homebrew软件包(如果它尚不存在),否则升级它,最好的解决方案是使用正式属于Homebrew系列的Homebrew Bundle。如果这对您不起作用,并且您想推出自己的解决方案,则应参考以下建议。

除了已经安装的软件包之外,还有其他情况brew install可能会失败。我不确定,但看起来brew install命令在失败时会发出1以外的退出状态,所以你有两个选择:

  1. 搜索stderr“未安装”并检查
  2. 使用不同的方法
  3. 我见过用于此目的的最常见方法是使用命令brew ls --versions检查软件包是否已安装:

    function install_or_upgrade {
        if brew ls --versions "$1" >/dev/null; then
            HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade "$1"
        else
            HOMEBREW_NO_AUTO_UPDATE=1 brew install "$1"
        fi
    }
    

    如果您要安装多个软件包,那么您将需要使用HOMEBREW_NO_AUTO_UPDATE=1,以便Homebrew不会尝试在每次安装/升级之间进行更新。

答案 1 :(得分:0)

我一直在使用以下内容。根据使用情况,我将使用以下shell函数:

function smart_brew() {
  HOMEBREW_NO_AUTO_UPDATE=1 brew `brew ls --versions "$1" | wc -l | xargs expr | sed 's/0/install/' | sed 's/1/upgrade/'` "$1"
}

有时作为Makefile中的定义:

define smart_brew
    HOMEBREW_NO_AUTO_UPDATE=1 brew `brew ls --versions "$(1)" | wc -l | xargs expr | sed 's/0/install/' | sed 's/1/upgrade/'` "$(1)"
endef

dev:
    $(call smart_brew,formula)

相同的基本思想