Lister les dépendances optionnelles avec pacman sur arch linux

23

J'utilise arch linux.

Existe-t-il un moyen de répertorier les dépendances facultatives de tous les packages installés? Et si oui, puis-je filtrer cette liste pour ne voir que les packages manquants (non installés)?

vonPetrushev
la source
1
Je n'ai pas utilisé Arch, mais la "dépendance" ne semble pas facultative (ce n'est pas dans d'autres distributions).
jordanm
AFAIK, je ne pense pas que vous puissiez le faire avec pacman tout de suite. Mais il est très possible d'écrire un petit script pour le faire. Recherchez pacman pour la liste des packages installés. Demandez à Yaourt d'aller chercher leurs PKGBUILD et de lire la liste des optdeps. La dernière version de pacman-git a un commit qui indique si les optdeps ont déjà été installés.
darnir
@jordanm: Tout comme les dépendances de construction et les dépendances facultatives. Optdeps n'est requis que pour certaines fonctionnalités d'un package. Donc, à moins que vous n'utilisiez cette fonctionnalité, vous n'avez pas vraiment besoin de surcharger votre système avec une charge de dépendances.
darnir
J'ai utilisépacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed
stewSquared

Réponses:

5

Vous pouvez utiliser expac pour interroger la pacmanbase de données.

Quelque chose comme:

awk 'NF>=2' <(expac "%n %O") > optdeps

imprimera une liste de tous les packages installés sur votre machine et le optdependspour chacun ( %O) 1 dans un fichier appelé optdeps. Vous pouvez ensuite trier cela par rapport à une liste de packages optdepends installés.

Voir man expacpour la liste complète des options.


1. C'est un O majuscule, pas un zéro. Parce que nous ne pouvons pas avoir une police qui distingue les deux ...

jasonwryan
la source
[poke] Nous avons une telle police maintenant. :)
muru
4

Il y a un bel utilitaire dans le référentiel AUR (aur / pacdep).

pacdep a beaucoup d'options - juste un exemple - découvrez les paquets optionnels pour "thunar-archive-plugin":

> pacdep -oppp thunar-archive-plugin
[...]
Optional dependencies:    6.16 MiB
  extra/file-roller     3.89 MiB
  extra/kdeutils-ark    1.12 MiB
  community/xarchiver   1.16 MiB
[...]

La sortie ci-dessus signifie qu'aucun des packages optionnels n'est installé. Après avoir installé "xarchiver", la sortie ressemble à

[...]
Optional dependencies:    6.16 MiB
 local:    1.16 MiB
  xarchiver            1.16 MiB
 sync:     5.01 MiB
  extra/file-roller    3.89 MiB
  extra/kdeutils-ark   1.12 MiB
[...]

J'ai trouvé (la première partie de) cette réponse sur
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies

Martin Schneeweis
la source
3

Ce n'est pas exactement efficace, mais vous trouverez ce que vous voulez (en COULEUR!):

pacman -Q > /tmp/paccache
for pkg in $(awk '{print $1}' /tmp/paccache) ; do 
   echo -n "$pkg => "; 
   for dep in $(pacman -Qi $pkg | awk -F: '/Optional Deps/{gsub(/[\<\>=].*/,"");print $NF;}' ) ; do 
       grep -q "$dep" /tmp/paccache && COLOR=32 ; echo -en "\e[1;${COLOR:-31}m${dep}\e[0;m " ; unset COLOR ; 
   done 
   echo
done 
Cœur sombre
la source
Je ne suis pas tout à fait sûr, mais cela ne devrait-il pas être ||plutôt &&qu'après le grep, puis entre parenthèses autour du reste de la ligne?
Rörd
Et plus important encore, cela devrait probablement utiliser la section "Deps optionnels" au lieu de la section "Depends On" de la sortie pacman.
Rörd
Par exemple avec xmms2 :pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1
i336_
2

Bien que j'ai dû remarquer que la solution de @ DarkHeart ne fonctionne pas vraiment, cela m'a inspiré pour en faire une qui fonctionne. (pas de couleurs cependant)

J'utilise package-query , un outil similaire au lieu d'expac qui a été suggéré par @jasonwryan, car je l'ai déjà installé (c'est une dépendance de yaourt). Il devrait être trivial de changer cela pour utiliser à la place expac.

La liste de toutes les dépendances facultatives est principalement effectuée par l'appel à package-query. La première boucle for supprime les explications, il ne reste donc que les noms de package pour les dépendances facultatives; la seconde boucle for supprime les dépendances déjà installées dans sa première ligne avant d'imprimer les résultats dans la seconde.

#!/usr/bin/perl
use strict;
use warnings;

my %deps;
for (`package-query -Q -f'%n %O'`) {
    $deps{ (/^(\S+)/)[0] } = [/(\S+):/g];
}
my @pkgs = keys %deps;
for my $pkg (@pkgs) {
    my @missing_deps = grep { !($_ ~~ @pkgs) } @{ $deps{$pkg} };
    print "$pkg => @missing_deps\n" if @missing_deps;
}
Rörd
la source
2

Cela devrait faire l'affaire:

comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)

Première entrée pour commrépertorier toutes les dépendances facultatives, deuxième entrée tous les packages installés et leurs attributs «fournir». Les deux listes sont triées et contiennent chaque élément une seule fois en raison de sort -u. Ensuite, seules les lignes affichées sont contenues dans la première mais pas dans la seconde liste.

(modifié pour intégrer la suggestion de @ Archemar)

dimanche
la source
0

Parfois, vous devez travailler en arrière ... trouvez d'abord toutes les dépendances non facultatives, puis faites une référence croisée avec la liste complète, puis utilisez uniq. Cela va générer une liste des dépendances installées en option.

Trouver tous installés

pacman -Q

Trouver tous non facultatifs:

pacman -Qent

Les entrées uniques doivent donc être facultatives:

(pacman -Q; pacman -Qent) | sort | uniq -u 

Générer la liste des options facultatives manquantes dépend des descriptions, pas joli, mais ça marche.

pacman -Q > /tmp/paccache; for pkg in $(awk '{print $1}' /tmp/paccache); do pacman -Qi $pkg | grep "^Optional Deps" | grep -v None >/dev/null && echo $pkg >> /tmp/hasdeps; done

for pkg in $(awk '{print $1}' /tmp/hasdeps); do echo -ne "Package: $pkg ___ "; (pacman -Qi $pkg | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1) | grep -v installed; echo ___; done | grep -v "___ ___" | sed -e 's/Optional Deps/ /' -e 's/___//' | sed -e 's/ \+/ /g'
kevinf
la source
0

J'ai essayé seulement dans GNU sed mais

yay -Qi | sed -n '/Optional Deps/{:l s/.* \([a-zA-Z0-9.\-]\+\):.*/\1/p; n; /Required By/!bl}'

cela a fonctionné (utilisez sort / uniq comme vous le souhaitez).

Yuki Ito
la source