배포판 독립적 패키지 검색 및 설치

배포판 독립적 패키지 검색 및 설치

특정 실행 파일이나 파일을 제공하는 패키지를 설치하는 배포판에 구애받지 않는 방법을 찾으려고 합니다. 완벽하게 수행하는 것이 불가능하다는 것을 알고 있지만 거의 충분하다고 생각하며 누군가가 이를 개선하는 방법에 대한 아이디어를 갖고 있기를 바랍니다.

기본적으로 저는 가장 일반적인 패키지 관리자 주위에 추상화 계층을 제공하는 스크립트를 작성했습니다.

commandAvailable() { command -v $1 &> /dev/null; }

if commandAvailable dnf; then
    updatePackageInfo() { dnf check-update; }
    searchPath() { dnf provides $1 2> /dev/null | grep ' : ' | head -1 | cut -d'.' -f1 | rev | cut -d'-' -f 2- | rev; }
    searchBin() { searchPath {/bin,/sbin,/usr/bin/,/usr/sbin}/$1; }
    install() { dnf install -y $@; }
elif commandAvailable yum; then
    updatePackageInfo() { yum check-update; }
    searchPath() { yum provides $1 2> /dev/null | grep ' : ' | head -1 | cut -d'.' -f1 | rev | cut -d'-' -f 2- | rev; }
    searchBin() { searchPath {/bin,/sbin,/usr/bin/,/usr/sbin}/$1; }
    install() { yum install -y $@; }
elif commandAvailable apt-get; then
    updatePackageInfo() { apt-get update && if ! commandAvailable apt-file; then install apt-file; fi && apt-file update; }
    searchPath() { apt-file search $1 | head -1 | cut -d':' -f1; }
    searchBin() { searchPath {/bin,/sbin,/usr/bin/,/usr/sbin}/$1; }
    install() { apt-get install -y $@; }
elif commandAvailable pacman; then
    updatePackageInfo() { pacman -Sy && pacman -Fy; }
    searchPath() { pacman -F $1 | head -1 | rev | cut -d' ' -f2 | rev; }
    searchBin() { pacman -F $1 | grep -B 1 -P "    (usr/bin|usr/sbin|bin|sbin)/$1" | head -1 | cut -d' ' -f1; }
    install() { pacman -S --noconfirm $@; }
elif commandAvailable zypper; then
    updatePackageInfo() { zypper refresh; }
    searchPath() { zypper search -f $1 | grep " | package" | head -1 | tr -d ' ' | cut -d'|' -f2; }
    searchBin() { searchPath {/bin,/sbin,/usr/bin/,/usr/sbin}/$1; }
    install() { zypper --non-interactive install "$@"; }
elif commandAvailable emerge; then
    updatePackageInfo() { emerge-webrsync -v && if ! commandAvailable e-file; then install app-portage/pfl; fi; }
    searchPath() { e-file $1 | grep -P "(\[I\]| \* )" | sed 's/*//g' | sed 's/\[I\]//g' | tr -d ' '; }
    searchBin() { searchPath /usr/bin/$1; searchPath /usr/sbin/$1; searchPath /bin/$1; searchPath /sbin/$1; }
    install() { emerge $@; }
fi

searchBins() { for executable in "$@"; do searchBin $executable; done | tr "\n" " "; echo; }
searchPaths() { for path in "$@"; do searchPath $path; done | tr "\n" " "; echo; }
installPkgWithPath() { install $(searchPath "$1"); }
installPkgsWithPaths() { install $(searchPaths $@); }
installPkgWithExecutable() { install $(searchBin $1); }
installPkgsWithExecutables() { install $(searchBins $@); }

생성된 함수는 다음과 같이 사용할 수 있습니다.

updatePackageInfo                                  # Equivalent to apt-get update

installPkgWithPath "curl/curl.h"                   # Installs the package containing the header file curl/curl.h

installPkgsWithPaths "curl/curl.h" "/usr/bin/wget" # Installs multiple packages by file paths

installPkgWithExecutable curl                      # Install the package that provides the `curl` executable

installPkgsWithExecutables curl wget make          # Install all packages required to get these 3 executables

이것은 기본적으로 Fedora, RHEL, Debian, Arch, Gentoo, OpenSuse(그리고 더 많은 것)에서 잘 작동합니다. 하지만 Ubuntu에는 필요한 패키지가 없기 때문에 apt-file( Universe제공하는 저장소를 활성화하지 않는 한) Ubuntu에서는 작동하지 않습니다.
작동하지 않은 또 다른 일은 vlcFedora와 같은 것을 설치하는 것입니다. Fedora에서는 일반적으로 RPM Fusion이를 위해 저장소를 활성화합니다.
다른 배포판에도 비슷한 상황이 있을 것이라고 확신합니다.

내가 고려한 것은 --force설정 시 이러한 저장소를 검색하고 필요한 경우 추가하도록 하는 플래그를 추가하는 것이었습니다. 하지만 저장소 목록을 유지해야 하는 상황이 발생하고 싶지는 않습니다. 나는 대부분의 배포판이 이러한 반신뢰 저장소를 어떤 방식으로든 참조하여 각 배포판에 대한 저장소 목록을 유지할 필요가 없도록 하고 싶습니다.

어떤 아이디어가 있나요?

답변1

나는 데비안의 50,000개 이상의 설치 가능한 패키지를 사용하면 데비안 미러 너머를 볼 필요가 없을 것이라고 생각했습니다. 귀하의 아이디어는 훌륭하지만 저장소 목록을 업데이트해야 할 수도 있습니다. 게다가 Franken 릴리스를 생성하게 되는데, 이로 인해 상황이 정말 엉망이 될 수 있습니다!

막힘을 제거하는 데 도움이 되는 다양한 강도 옵션을 사용할 수 있지만 매일 사용하는 것은 권장되지 않습니다. 사용할 첨자를 추가할 수도 있습니다 alien. 이 아이디어는 사용 가능한 모든 여가 시간을 제한 없이 사용하는 데 적합합니다.

나는 기존의 모든 Linux 문서를 담을 수 있는 HTML 시스템을 생각하고 있었습니다. 오래 생각할 필요 없어요!

답변2

나는 이것을 전에 본 적이 없지만 좋은 운동이 될 것입니다 ...

저는 아치 리눅스 사용자입니다. 저도 그놈 사용자입니다. 그놈 앱 스토어가 있다는 걸 알아요[1]Arch가 제공하고 Ubuntu와 Fedora도 제공하기 때문에 배포판에 구애받지 않아야 합니다.

그러니까 조사해봐gnome-software [2]두 가지 종속성이 내 관심을 끌었습니다.

  1. 패키지 키트[삼], 는 다음과 같이 설명됩니다."소프트웨어 패키지의 설치 및 업데이트를 보다 쉽게 ​​하도록 설계된 시스템"
  2. 신청 흐름[4], 는 다음과 같이 설명됩니다."배포 전반에 걸쳐 앱 스토어를 생성하기 위한 표준을 제공합니다"

귀하의 질문에 대한 답변이 저 곳에 있거나 적어도 좋은 출발점이 될 것이라고 생각합니다.


[1]https://wiki.gnome.org/Apps/Software/
[2]https://archlinux.org/packages/extra/x86_64/gnome-software/
[삼]https://www.freedesktop.org/software/PackageKit/
[4]https://www.freedesktop.org/wiki/Distributions/AppStream/

관련 정보