일부 패키지를 설치하고 일부 구성 작업을 수행하는 스크립트를 작성 중입니다. 스크립트를 통해 패키지의 특정 주 버전을 설치하고 싶지만 패키지의 부 버전이 무엇인지는 상관하지 않습니다.
더 중요한 것은 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'에 대한 공급자를 찾을 수 없습니다.
그러나 해당 메시지 이후에도 지정된 두 번째 패키지 버전을 만족하므로 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
누군가 실제 예제가 필요하다면 여기에 하나가 있습니다.
내 경우에는 를 설치해야 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
그렇지 않으면 더 복잡한 마법이 필요할 것입니다.