Como faço para escolher pacotes de um PPA?

45

Existe uma maneira de escolher pacotes a partir de um repositório ppa que você adiciona? Ou seja, excluir algumas das atualizações e incluir outras?

Por exemplo, quero apenas o pacote chromium-browser deste repositório, mas não os outros. Portanto, não quero que meus sudo apt-get upgradeoutros pacotes do ppa (além do chromium-browser) sejam instalados sobre os existentes, apenas esse.

Percebo que é uma licença para me dar um tiro no pé se eu interpretar mal as dependências e excluir as necessárias para as que eu incluí, mas sei que, nesse caso, os outros pacotes não são dependências para aquele.

Tudo isso é possível? Talvez haja algum arquivo da lista branca / lista negra ou algo assim?

yuvilio
fonte
Eu transmitia o synaptic por três razões: o Ubuntu o abandonou como atualizador de software a favor do Ubuntu Software Center; não vi uma maneira do Synaptic parar as atualizações de um ppa sobre os arquivos instalados (que era o meu problema); e eu prefira uma solução de linha de comando a uma solução de GUI. Acabamos encontrando algo que funcionou (veja minha resposta abaixo).
Yuvilio 31/07/12
2
O Centro de Software é usado para Instalação e Remoção de Software, o Update Manager é usado para Atualização; você poderia ter utilizado o Synaptic para que os outros pacotes não fossem atualizados, também para um novo usuário que não gostaria de mexer com o Terminal. A GUI seria preferida, é claro que a sua é praticamente a resposta correta.
Uri Herrera
Existem algumas coisas que você simplesmente não pode fazer via Software-Center (que são fáceis com o Synaptic). E nem todo mundo (especialmente iniciantes) se sente à vontade com a linha de comando.
31712 Mrokii
@Mrokii Concordo que minha abordagem não é para iniciantes. A resposta sináptica que você escreveu e Uri Herrera sugeriu, que suponho que funciona, é melhor nesse sentido. Vou deixar que outros que experimentem avaliem.
yuvilio 31/07/2012

Respostas:

61

Encontrou uma maneira de fazê-lo.

O truque é usar duas cláusulas de fixação. O primeiro a proibir TODOS os pacotes do PPA e o segundo a selecionar os que você deseja.

Portanto, para o exemplo acima, primeiro adiciono o ppa como de costume:

$ sudo add-apt-repository ppa:webapps/preview
...
$ sudo apt-get update
...

Agora, se eu executar a política do apt-cache, ele me mostrará que há uma versão mais recente do navegador cromo disponível e que será instalada com uma atualização porque está na mesma prioridade (500) do meu navegador cromo atual.

$ sudo apt-cache policy chromium-browser
chromium-browser:
  Installed: 18.0.1025.168~r134367-0ubuntu0.12.04.1
  Candidate: 20.0.1132.47~r144678-0precise1+webapps3
  Version table:
     20.0.1132.47~r144678-0precise1+webapps3 0
        500 http://ppa.launchpad.net/webapps/preview/ubuntu/ precise/main amd64 Packages
 *** 18.0.1025.168~r134367-0ubuntu0.12.04.1 0
        500 http://us.archive.ubuntu.com/ubuntu/ precise-updates/universe amd64 Packages
        500 http://security.ubuntu.com/ubuntu/ precise-security/universe amd64 Packages
        500 http://ppa.launchpad.net/chromium-daily/beta/ubuntu/ precise/main amd64 Packages
        100 /var/lib/dpkg/status
     18.0.1025.151~r130497-0ubuntu1 0
        500 http://us.archive.ubuntu.com/ubuntu/ precise/universe amd64 Packages
E: Unable to parse package file /etc/apt/preferences.d/webapps-preview-pin-400 (1)
$ 

Isso é ótimo no que diz respeito a esse pacote, mas eu não quero que os outros neste ppa (que também têm prioridade 500) sejam instalados. No momento, se eu tentar atualizar, receberei mais do que apenas os pacotes chromium que eu quero desse repositório:

$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages have been kept back:
  bamfdaemon gwibber gwibber-service gwibber-service-facebook gwibber-service-twitter indicator-appmenu libbamf0 libbamf3-0 shotwell
The following packages will be upgraded:
  chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg gwibber-service-identica indicator-messages indicator-status-provider-mc5
  indicator-status-provider-pidgin libindicator-messages-status-provider1
8 upgraded, 0 newly installed, 0 to remove and 9 not upgraded.
Need to get 25.3 MB of archives.
After this operation, 5,034 kB of additional disk space will be used.
Do you want to continue [Y/n]? 

Então, o que posso fazer é dizer ao apt que quero que todos os pacotes nesse ppa, webapps-preview neste caso, tenham uma prioridade mais baixa, exceto aqueles com "chromium" em seu nome. O mecanismo para isso é fixar um pacote

Eu crio um arquivo no /etc/apt/preferences.d/ com duas cláusulas. O primeiro diz que concede a todos os pacotes no webapps-preview ppa uma prioridade mais baixa que a normal (para que eles não sejam preferidos, mesmo que possuam um número de versão mais alto. A segunda cláusula substitui parcialmente o primeiro dizendo: dê os pacotes em que ppa com "chromium" em seu nome tenha a mesma prioridade que outros pacotes para que seja instalado (por ter um número de versão mais alto).

$ cat /etc/apt/preferences.d/webapps-preview-pin-400
Package:  *
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 400


Package:  *chromium*
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 500

Para identificar a string correta para a opção "Pin: release", podemos usar a política apt-cache novamente.

$ apt-cache policy
...
500 http://ppa.launchpad.net/webapps/preview/ubuntu/ precise/main i386 Packages
    release v=12.04,o=LP-PPA-webapps-preview,a=precise,n=precise,l=preview,c=main
    origin ppa.launchpad.net
...

Para versões apt <0.8.14, pacotes fixados devem ser especificados explicitamente, pois os curingas não funcionam:

$ cat /etc/apt/preferences.d/webapps-preview-pin-400
Package:  *
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 400


Package:  chromium-browser chromium-codecs-ffmpeg chromium-browser-l10n chromium-codecs-ffmpeg-extra
Pin: release o=LP-PPA-webapps-preview
Pin-Priority: 500

E agora, quando tento atualizar, recebo apenas os pacotes que quero desse ppa e não os outros. Tudo bem escolhido cereja para mim:

$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be upgraded:
  chromium-browser chromium-browser-l10n chromium-codecs-ffmpeg
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 25.1 MB of archives.
After this operation, 5,026 kB of additional disk space will be used.
Do you want to continue [Y/n]?
yuvilio
fonte
5
muito complicado, imho.
31712 Mrokii
5
Eu discordo, isso é bastante direto para o que alguém gosta quer. E é bom ter todas as instruções para identificar o nome do ppa do ppa.
27614 Nicholi
Esta resposta específica é para aqueles que desejam garantir que o apt sempre prefira pacotes de um repositório específico. Se você quiser uma solução pontual, tente esta resposta ou esta
#
8

Você também pode selecionar a versão da qual deseja instalar com o ?originseletor:

Corresponde às versões do pacote cuja origem corresponde à origem da expressão regular. Por exemplo, “!? Origin (debian)” encontrará pacotes não oficiais em seu sistema (pacotes que não são do repositório Debian).

Portanto, no seu caso específico, você pode usar:

sudo aptitude install !?origin(LP-PPA-webapps-preview) chromium

Ou você pode especificar a versão usando <packagename>=<version>:

sudo apt-get install chromium=20.0.1132.47~r144678-0precise1+webapps3
Braiam
fonte
5

Você pode realmente "escolher" certos pacotes via Synaptic e é muito fácil. Funciona assim:

  • Se você quiser fazer isso apenas para determinados PPAs, escolha "Origem" (canto inferior esquerdo) na janela do Synaptic e escolha o PPA que deseja alterar

  • escolha todos os pacotes que você não deseja atualizar automaticamente mais.

  • escolha o menu "Versão do pacote / bloqueio". Todos os pacotes que você escolheu não serão mais atualizados automaticamente até que você os desbloqueie novamente.

Mrokii
fonte