Podaj opcjonalne zależności za pomocą Pacmana na Arch Linux

23

Używam arch Linux.

Czy istnieje sposób na wyświetlenie listy opcjonalnych zależności wszystkich zainstalowanych pakietów? A jeśli tak, czy mogę przefiltrować tę listę, aby zobaczyć tylko brakujące (niezainstalowane) pakiety?

vonPetrushev
źródło
1
Nie korzystałem z Arch, ale „zależność” nie brzmi opcjonalnie (nie ma go w innych dystrybucjach).
jordanm
AFAIK, nie sądzę, że możesz to zrobić od razu z Pacmanem. Ale jest bardzo możliwe, aby napisać mały skrypt, aby to zrobić. Zapytanie pacman o listę zainstalowanych pakietów. Poproś Yaourt o pobranie danych PKGBUILD i przeczytanie listy optdeps. Najnowsza wersja pacman-git ma zatwierdzenie, które określa, czy optdeps zostały już zainstalowane.
darnir
@jordanm: Podobnie jak zależności kompilacji i zależności opcjonalne. Optdeps są wymagane tylko w przypadku niektórych funkcji pakietu. Tak więc, chyba że używasz tej funkcji, tak naprawdę nie musisz nadmuchać swojego systemu z mnóstwem zależności.
darnir
Użyłempacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed
stewSquared

Odpowiedzi:

5

Możesz użyć expac do zapytania do pacmanbazy danych.

Coś jak:

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

wypisze listę wszystkich zainstalowanych pakietów na twoim komputerze i optdependsdla każdego z nich ( %O) 1 do pliku o nazwie optdeps. Następnie możesz posortować to na liście zainstalowanych pakietów optdepends.

Zobacz man expacpełną listę opcji.


1. To jest wielka litera O, a nie zero. Ponieważ nie możemy mieć czcionki, która odróżniałaby te dwa ...

jasonwryan
źródło
[poke] Mamy teraz taką czcionkę. :)
muru
4

Ładne narzędzie znajduje się w repozytorium AUR (aur / pacdep).

pacdep ma wiele opcji - tylko jeden przykład - znajdź opcjonalne pakiety dla „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
[...]

Powyższe dane wyjściowe oznaczają, że żaden z opcjonalnych pakietów nie jest zainstalowany. Po zainstalowaniu „xarchiver” wygląd wygląda jak

[...]
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
[...]

Znalazłem (pierwszą część) tę odpowiedź na
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies

Martin Schneeweis
źródło
3

Nie jest to do końca wydajne, ale znajdziesz to, czego chcesz (w KOLORZE!):

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 
Ciemne serce
źródło
Nie jestem do końca pewien, ale czy nie powinno to być ||zamiast &&po grep, a potem nawiasach wokół reszty linii?
Rörd
I, co ważniejsze, powinno to prawdopodobnie wykorzystywać sekcję „Opcjonalne Deps” zamiast sekcji „Depends On” wyjścia pacman.
Rörd
Na przykład z xmms2 :pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1
i336_
2

Chociaż zauważyłem, że rozwiązanie @ DarkHeart tak naprawdę nie działa, zainspirowało mnie do stworzenia działającego. (bez kolorów)

Używam zapytania pakietowego , podobnego narzędzia zamiast expac, które zostało zasugerowane przez @jasonwryan, ponieważ już go zainstalowałem (to zależność od twojego). To powinno być trywialne, aby to zmienić, aby zamiast tego używać EXPAC.

Lista wszystkich opcjonalnych zależności odbywa się głównie przez wywołanie zapytania-pakietu. Pierwsza pętla for usuwa wyjaśnienia, więc pozostają tylko nazwy pakietów dla opcjonalnych zależności; druga pętla for usuwa już zainstalowane zależności w pierwszym wierszu przed wydrukowaniem wyników w drugim.

#!/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
źródło
2

To powinno załatwić sprawę:

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

Pierwsze wejście do commlisty wszystkich opcjonalnych zależności, drugie wejście do wszystkich zainstalowanych pakietów i ich atrybutów „dostarczyć”. Obie listy są posortowane i zawierają każdy element tylko raz sort -u. Następnie wyświetlane są tylko wiersze zawarte na pierwszej, ale nie na drugiej liście.

(edytowane w celu uwzględnienia sugestii @ Archemar)

niedziela
źródło
0

Czasami musisz pracować wstecz ... najpierw znajdź wszystko, co nie jest opcjonalne, a następnie odwołaj się do pełnej listy, a następnie użyj uniq. To wygeneruje listę zainstalowanych opcjonalnych zależy.

Znajdź wszystkie zainstalowane

pacman -Q

Znajdź wszystkie nie opcjonalne:

pacman -Qent

Unikalne wpisy muszą zatem być opcjonalne:

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

Wygeneruj listę brakujących opcjonalnych zależy od opisów, nie ładne, ale to działa.

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
źródło
0

Próbowałem tylko w GNU sed, ale

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

to zadziałało (Użyj sort / uniq, jak chcesz).

Yuki Ito
źródło