特定の実行可能ファイルまたはファイルを提供するパッケージをインストールするディストリビューションに拘束されない方法を見つけようとしています。完璧に実行することは不可能であることを知っていますが、ほぼ十分だと思い、誰かがそれを改善する方法についてのアイデアを持っていることを願っています。
基本的に、私は最も一般的なパッケージマネージャの周りに抽象化層を提供するスクリプトを書いています。
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では機能しません。
うまくいかないもう一つのことは、vlc
Fedoraのようなものをインストールすることです。 Fedoraは通常、RPM Fusion
この目的のためにリポジトリを有効にします。
他のディストリビューションにも同様の状況があると確信しています。
私が考えたのは、--force
設定時にこれらのリポジトリを検索し、必要に応じて追加するフラグを追加することでした。ただし、リポジトリのリストを維持する必要がある状況は発生したくありません。私はほとんどのディストリビューションがこれらの半信頼性リポジトリを何らかの方法で参照して、各ディストリビューションのリポジトリリストを維持する必要がないようにしたいと思います。
どんなアイデアがありますか?
答え1
私は、Debianの50,000を超えるインストール可能なパッケージを使用すると、Debianミラーを超えて見る必要はないと思いました。あなたのアイデアは素晴らしいですが、リポジトリのリストを更新する必要があるかもしれません。さらに、Frankenのリリースを生成します。これは、状況が本当に混乱する可能性があります!
詰まりを解消するのに役立つさまざまな強度オプションがありますが、毎日の使用はお勧めできません。使用する添え字を追加することもできますalien
。このアイデアは、利用可能なすべての余暇時間を制限なく使用するのに適しています。
私は既存のすべてのLinux文書を含むことができるHTMLシステムを考えていました。長く考える必要はありません!
答え2
私はこれを前に見たことがありませんが、良い運動になります...
私はArch Linuxユーザーです。私もGNOMEユーザーです。 GNOMEアプリストアがあることを知っています[1]Archが提供し、UbuntuとFedoraも提供するので、ディストリビューションに拘束されるべきではありません。
だから調べてください。gnome-software
[2]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/