升级或安装自制软件
upgrade or install a homebrew formula
在我的 CI-setup 中,我想确保安装了给定公式的最新版本,无论它是否已经安装。
我目前正在使用类似的东西:
brew update
brew install FORMULA || (brew upgrade FORMULA && brew cleanup FORMULA)
这种方法有什么缺陷?有没有更好的方法来解决这个问题(例如,首先查询是否已经安装了 FORMULA,而不是依赖 brew install
只有在安装了 FORMULA 时才会失败)?
我想安装一个 Homebrew 包,如果它不存在,否则升级它,最好的解决方案是使用 Homebrew Bundle,它是 Homebrew 家族的正式成员。如果这对您不起作用,并且您想推出自己的解决方案,您应该参考以下建议。
除了已经安装的包之外,还有其他情况 brew install
可能会失败。我不确定,但它看起来不像 brew install
命令在失败时发出 1
以外的退出状态,所以你有两个选择:
- 在
stderr
中搜索 "not installed" 并检查
- 使用不同的方法
我见过用于此目的的最常见方法是使用命令 brew ls --versions
:
检查软件包是否已安装
function install_or_upgrade {
if brew ls --versions "" >/dev/null; then
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade ""
else
HOMEBREW_NO_AUTO_UPDATE=1 brew install ""
fi
}
如果您要安装多个软件包,您需要使用 HOMEBREW_NO_AUTO_UPDATE=1
,这样 Homebrew 就不会尝试在每个 install/upgrade 之间进行更新。
我一直在使用以下内容。根据用例,我将使用 shell 函数,如下所示:
function smart_brew() {
HOMEBREW_NO_AUTO_UPDATE=1 brew `brew ls --versions "" | wc -l | xargs expr | sed 's/0/install/' | sed 's/1/upgrade/'` ""
}
有时作为 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)
相同的基本想法
在我的 CI-setup 中,我想确保安装了给定公式的最新版本,无论它是否已经安装。
我目前正在使用类似的东西:
brew update
brew install FORMULA || (brew upgrade FORMULA && brew cleanup FORMULA)
这种方法有什么缺陷?有没有更好的方法来解决这个问题(例如,首先查询是否已经安装了 FORMULA,而不是依赖 brew install
只有在安装了 FORMULA 时才会失败)?
我想安装一个 Homebrew 包,如果它不存在,否则升级它,最好的解决方案是使用 Homebrew Bundle,它是 Homebrew 家族的正式成员。如果这对您不起作用,并且您想推出自己的解决方案,您应该参考以下建议。
除了已经安装的包之外,还有其他情况 brew install
可能会失败。我不确定,但它看起来不像 brew install
命令在失败时发出 1
以外的退出状态,所以你有两个选择:
- 在
stderr
中搜索 "not installed" 并检查 - 使用不同的方法
我见过用于此目的的最常见方法是使用命令 brew ls --versions
:
function install_or_upgrade {
if brew ls --versions "" >/dev/null; then
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade ""
else
HOMEBREW_NO_AUTO_UPDATE=1 brew install ""
fi
}
如果您要安装多个软件包,您需要使用 HOMEBREW_NO_AUTO_UPDATE=1
,这样 Homebrew 就不会尝试在每个 install/upgrade 之间进行更新。
我一直在使用以下内容。根据用例,我将使用 shell 函数,如下所示:
function smart_brew() {
HOMEBREW_NO_AUTO_UPDATE=1 brew `brew ls --versions "" | wc -l | xargs expr | sed 's/0/install/' | sed 's/1/upgrade/'` ""
}
有时作为 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)
相同的基本想法