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-modeund die eingebaute org-modeist ziemlich alt.
Ich habe den Quellcode package-installvon 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-modeauch als installiert und package-installweigert 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-descObjekt handelt. Sie können Versionsinformationen nur package-installüber ein package-descObjekt angeben .