ディストリビューションに依存しないパッケージの検索とインストール

ディストリビューションに依存しないパッケージの検索とインストール

特定の実行可能ファイルまたはファイルを提供するパッケージをインストールするディストリビューションに拘束されない方法を見つけようとしています。完璧に実行することは不可能であることを知っていますが、ほぼ十分だと思い、誰かがそれを改善する方法についてのアイデアを持っていることを願っています。

基本的に、私は最も一般的なパッケージマネージャの周りに抽象化層を提供するスクリプトを書いています。

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-fileUniverse提供するリポジトリを有効にしない限り)Ubuntuでは機能しません。
うまくいかないもう一つのことは、vlcFedoraのようなものをインストールすることです。 Fedoraは通常、RPM Fusionこの目的のためにリポジトリを有効にします。
他のディストリビューションにも同様の状況があると確信しています。

私が考えたのは、--force設定時にこれらのリポジトリを検索し、必要に応じて追加するフラグを追加することでした。ただし、リポジトリのリストを維持する必要がある状況は発生したくありません。私はほとんどのディストリビューションがこれらの半信頼性リポジトリを何らかの方法で参照して、各ディストリビューションのリポジトリリストを維持する必要がないようにしたいと思います。

どんなアイデアがありますか?

ベストアンサー1

私は、Debianの50,000を超えるインストール可能なパッケージを使用すると、Debianミラーを超えて見る必要はないと思いました。あなたのアイデアは素晴らしいですが、リポジトリのリストを更新する必要があるかもしれません。さらに、Frankenのリリースを生成します。これは、状況が本当に混乱する可能性があります!

詰まりを解消するのに役立つさまざまな強度オプションがありますが、毎日の使用はお勧めできません。使用する添え字を追加することもできますalien。このアイデアは、利用可能なすべての余暇時間を制限なく使用するのに適しています。

私は既存のすべてのLinux文書を含むことができるHTMLシステムを考えていました。長く考える必要はありません!

おすすめ記事