zypper 安装特定的主要版本而不指定次要版本

zypper 安装特定的主要版本而不指定次要版本

我正在编写一个脚本来安装一些软件包并执行一些配置工作。我希望脚本安装包的特定主要版本,但我不关心它是包的哪个次要版本。

更重要的是,我希望它安装最新的 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

从手册页

安装(在)[选项] 名称|功能|rp​​m_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
  • 不要重复我的错误:--color选项搞乱了子 shell 逻辑
  • 我很幸运,没有多个包与确切的查询匹配binutils,否则将需要更复杂的魔法

相关内容