我正在编写一个脚本来安装一些软件包并执行一些配置工作。我希望脚本安装包的特定主要版本,但我不关心它是包的哪个次要版本。
更重要的是,我希望它安装最新的 2.yz 版本的软件包,而不是 1.yz 或 3.yz(或任何其他主要版本号)。
我已经尝试过(没有成功)
zypper install 'mypackage=2'
zypper install 'mypackage>1<3'
zypper install 'mypackage>1' 'mypackage<3'
zypper install 'mypackage>=2.0.0' 'mypackage<3.0.0'
最后一个似乎很有希望,因为 zypper 抱怨道:
在包名称中找不到“mypackage>=2.0.0”。尝试能力。找不到“mypackage >= 2.0.0”的提供者。
但是,在该消息之后,它仍然继续安装 mypackage-1.5.0,因为它满足指定的第二个包版本。
答案1
更好的
起初我在这里尝试了 SailorCire 的答案并提出了一个改进版本:
zypper search -t package -x -s PACKAGE | grep " MIN_NUM" | cut -d '|' -f 4 | tr -d '[:space:]
zypper install
,然后您可以通过执行zypper install PACKAGE
上面的反引号包围命令来将其输入。
例如,这将安装php7-pear 1.*
:
zypper -n in --details php7-pear-`zypper search -t package -x -s php7-pear | grep " 1." | cut -d '|' -f 4 | tr -d '[:space:]'`
最好的
但后来我想出了一个更好的解决方案。我们可以排除没有使用zypper addlock
版本约束的hack 的版本,而不是像这样针对特定版本进行 hack 。
所以,OP想要的其实是这样的:
zypper addlock "mypackage < 2"
zypper addlock "mypackage >= 3"
这些将阻止版本 <2 或 >=3 的 mypackage 安装。
答案2
从手册页
安装(在)[选项] 名称|功能|rpm_file_uri... 安装或更新软件包。 可以通过包的名称或它们提供的功能来选择包。 功能由“NAME[.ARCH][OP EDITION]”形成,其中 ARCH 是体系结构代码,OP 是 = 或 > 之一,EDITION 是“VERSION[-RELEASE]”。例如: zypper=0.8.8-2 a 的 NAME 组件 Capability 不仅是包名称,还可以是包提供的任何符号:/bin/vi、libcurl.so.3、perl(Time::ParseDate)。只需记住引用以保护 shell 中的特殊字符,例如: zypper\>0.8.10 或“zypper>0.8.10”。 如果未指定 EDITION,则将安装最新的可安装版本。这也意味着,如果该软件包已安装并且有更新版本可用,它将升级到最新的可安装版本 版本。 如果未指定 ARCH,或者功能名称字符串的最后一个点后面不是已知的架构,则求解器会将整个字符串视为功能名称。如果 ARCH 已知,求解器将选择 与该架构匹配的包,如果找不到这样的包,则会抱怨。
既然它说一下面的内容,我没有看到任何合取运算符,我会说它不能在本地完成。
你总是可以用类似的东西来编写它
zypper se -n -s package | grep " package " | grep " MIN_NUM" | cut -d '|' -f 4
请注意:以上是非常懒惰,应该写得更好。
另请注意:您应该提出功能请求。 :)
答案3
如果有人需要一个可行的示例,这里就是一个。
就我而言,我需要安装binutils
,但仅限于“ 2.39
-something”版本。
这是一个足够好的非交互式解决方案,即使在Dockerfile
.
export PACKAGE='binutils'
export MAJOR='2.39'
export ZYPP='zypper --non-interactive'
${ZYPP} ref
export LATEST="$(${ZYPP} --no-refresh se -s -x -t package $PACKAGE \
| cut -d '|' -f 4 | fgrep -- $MAJOR | sed -e 's/[[:space:]]*//g' \
| sort -n | head -n 1 | tr -d '\n')"
${ZYPP} in -y --no-recommends --force "$PACKAGE-$LATEST"
${ZYPP} al -- "$PACKAGE"
${ZYPP} up -y --no-recommends
笔记:
in
[...]--force
防止选择“任何”其他版本所必需的se
[...]-x
:仅精确匹配al
锁定已安装的软件包,以便进一步的安装不会用新版本覆盖它- 非常特殊的情况:如果从尚未导入的存储库安装某些软件包,请将此选项添加到变量中
ZYPP
:--gpg-auto-import-keys
- 不要重复我的错误:
选项搞乱了子 shell 逻辑--color
- 我很幸运,没有多个包与确切的查询匹配
binutils
,否则将需要更复杂的魔法