Ich lief in ein Problem , dass nichts passiert nach dem Hinzufügen (package-install 'org)
in .emacs
. Ich wollte die aktuelle Version von installieren org-mode
und die eingebaute org-mode
ist ziemlich alt.
Ich habe den Quellcode package-install
von Emacs 25.3.1 ausgegraben. Die Funktion selbst prüft bereits, ob ein Paket installiert ist oder nicht, und lehnt die Installation ab, wenn das Paket bereits installiert ist. Der Scheck (unless (package-installed-p package) ...)
aus Antwort 10093312 ist also in der Tat unangebracht.
(defun package-install (pkg &optional dont-select)
"Install the package PKG.
PKG can be a package-desc or a symbol naming one of the available packages
in an archive in `package-archives'. Interactively, prompt for its name.
If called interactively or if DONT-SELECT nil, add PKG to
`package-selected-packages'.
If PKG is a package-desc and it is already installed, don't try
to install it but still mark it as selected."
(interactive
(progn
;; Initialize the package system to get the list of package
;; symbols for completion.
(unless package--initialized
(package-initialize t))
(unless package-archive-contents
(package-refresh-contents))
(list (intern (completing-read
"Install package: "
(delq nil
(mapcar (lambda (elt)
(unless (package-installed-p (car elt))
(symbol-name (car elt))))
package-archive-contents))
nil t))
nil)))
(add-hook 'post-command-hook #'package-menu--post-refresh)
(let ((name (if (package-desc-p pkg)
(package-desc-name pkg)
pkg)))
(unless (or dont-select (package--user-selected-p name))
(package--save-selected-packages
(cons name package-selected-packages)))
(if-let ((transaction
(if (package-desc-p pkg)
(unless (package-installed-p pkg)
(package-compute-transaction (list pkg)
(package-desc-reqs pkg)))
(package-compute-transaction () (list (list pkg))))))
(package-download-transaction transaction)
(message "`%s' is already installed" name))))
Das integrierte Gerät gilt org-mode
auch als installiert und package-install
weigert sich, die neuere Version von ELPA zu installieren. Nachdem ich einige Zeit damit verbracht hatte, package.el zu lesen, kam ich auf die folgende Lösung.
(dolist (package (package-compute-transaction
() (list (list 'python '(0 25 1))
(list 'org '(20171211)))))
;; package-download-transaction may be more suitable here and
;; I don't have time to check it
(package-install package))
Der Grund, warum es funktioniert, ist, dass package-*
Familienfunktionen die Argumente unterschiedlich behandeln, je nachdem, ob es sich um ein Symbol oder ein package-desc
Objekt handelt. Sie können Versionsinformationen nur package-install
über ein package-desc
Objekt angeben .