
いくつかのパッケージをインストールし、いくつかの構成タスクを実行するスクリプトを作成しています。スクリプトを使用してパッケージの特定のメジャーバージョンをインストールしたいのですが、パッケージのマイナーバージョンが何であるかは関係ありません。
さらに重要なのは、1.yzまたは3.yz(または他のメジャーバージョン番号)ではなく、最新の2.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'のプロバイダが見つかりません。
ただし、そのメッセージの後も指定された2番目のパッケージバージョンを満たしているため、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
このように、特定のバージョンをターゲットにする代わりに、バージョン制限核を使用しないバージョンを除外できます。
したがって、OPが望むのは実際には次のようになります。
zypper addlock "mypackage < 2"
zypper addlock "mypackage >= 3"
これにより、mypackage バージョン <2 または >=3 はインストールされません。
答え2
マニュアルページから
install(in) [オプション] 名前|関数|rpm_file_uri... パッケージをインストールまたは更新します。 パッケージは、名前または提供する機能に基づいて選択できます。 機能は「NAME [.ARCH] [OP EDITION]」で構成されています。ここで、ARCHはアーキテクチャコード、OPは=または>のいずれかで、EDITIONは「VERSION [-RELEASE]」です。例: zypper=0.8.8-2 機能は、パッケージ名だけでなく、パッケージによって提供されるすべてのシンボル(/bin/vi、libcurl.so.3、perl(Time::ParseDate))です。シェルで特殊文字を保護するには、次のように引用符を使用します。 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
誰かが実際の例が必要な場合は、ここに1つあります。
私の場合はをインストールする必要がありますbinutils
が、「2.39
-something」バージョンのみをインストールする必要があります。
これは、NET環境でも十分に優れた非対話型ソリューションです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
- 正確なクエリに一致する複数のパッケージがないことは幸運です。
binutils
それ以外の場合、より複雑な魔法が必要になります。