Atualizar de maneira não interativa todos os pacotes


13

Quero que o meu emacs atualize automaticamente todos os pacotes sob certas condições.

Qual é a melhor maneira de fazer isso?


Aqui está um comando para atualizar todos os pacotes desatualizados: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (substitua todos paradoxpor package).
xuchunyang

@xuchunyang Ah. Vejo que não parece tão ruim. Se você der uma resposta, eu aceitaria.
precisa saber é o seguinte

Respostas:


9

Não tenho certeza de que é isso que você deseja (não sei o que você quer dizer com "sob certas condições"), mas aqui está uma função que eu uso para atualizar todos os pacotes sem mostrar *Packages*buffer, o que acho irritante quando eu só quero para atualizar pacotes.

(defun package-upgrade-all ()
  "Upgrade all packages automatically without showing *Packages* buffer."
  (interactive)
  (package-refresh-contents)
  (let (upgrades)
    (cl-flet ((get-version (name where)
                (let ((pkg (cadr (assq name where))))
                  (when pkg
                    (package-desc-version pkg)))))
      (dolist (package (mapcar #'car package-alist))
        (let ((in-archive (get-version package package-archive-contents)))
          (when (and in-archive
                     (version-list-< (get-version package package-alist)
                                     in-archive))
            (push (cadr (assq package package-archive-contents))
                  upgrades)))))
    (if upgrades
        (when (yes-or-no-p
               (message "Upgrade %d package%s (%s)? "
                        (length upgrades)
                        (if (= (length upgrades) 1) "" "s")
                        (mapconcat #'package-desc-full-name upgrades ", ")))
          (save-window-excursion
            (dolist (package-desc upgrades)
              (let ((old-package (cadr (assq (package-desc-name package-desc)
                                             package-alist))))
                (package-install package-desc)
                (package-delete  old-package)))))
      (message "All packages are up to date"))))

Isso é bem experimentado. Também impede que os buffers de compilação sejam exibidos.


Agradável. Vou usar isso com uma ligeira variação que não avisa antes de atualizar os pacotes.
precisa saber é o seguinte

Existe alguma razão específica para você fazer, em (y-or-n-p (message ..))vez de apenas (y-or-n-p ...)?
precisa saber é o seguinte

@ PythonNut, bem, eu preciso construir uma mensagem rápida, não me lembro agora porque eu uso message, parece que isso pode ser feito formattambém.
22815 Mark-Karpov

Ah sim. Eu quis dizer usando format. Obviamente, você não pode fazer isso sem nenhum tipo de interpolação de string.
precisa saber é o seguinte

8

Você pode usar a atualização automática de pacotes .

Instale-o por M-x package-install auto-update-package. Ele fornece uma função chamada auto-package-update-now. Você pode escrever uma ifcondição simples e adicioná-la ao seu .emacs.

(if your-condition
   (auto-package-update-now))

Hum ... Vou lembrar disso, mas a idéia é tentar corrigir automaticamente o pacote se eles estiverem quebrados. Dependendo de um pacote para fazer isso é meio absurdo. :-)
PythonNov

1

O pacote agora é chamado de atualização automática de pacotes. (Reputação muito baixa para escrevê-la como um comentário no post de Chillar acima).

(Copiado de seu post e mesclado com esta resposta):

Instale-o por M-x package-install auto-package-update. Ele fornece uma função chamada auto-package-update-now. Você pode escrever uma condição if simples e adicioná-la ao seu ~/.emacs.

(if your-condition
   (auto-package-update-now))

Eu editei a resposta de Chillar para corrigir o nome do pacote, podemos excluir este agora, eu acho.
joelittlejohn
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.