मैं कोई समस्या हुई थी कि कुछ भी नहीं जोड़ने के बाद हुआ (package-install 'org)
में .emacs
। मैं अप-टू-डेट संस्करण स्थापित करना चाहता था org-mode
और बिल्ट-इन org-mode
काफी पुराना है।
मैंने package-install
Emacs के स्रोत कोड को 25.3.1 से खोदा। फ़ंक्शन स्व पहले से ही जांच करता है कि पैकेज स्थापित है या नहीं और यदि पैकेज पहले से ही स्थापित है तो इसे स्थापित करने से इंकार कर दें। तो (unless (package-installed-p package) ...)
उत्तर 10093312 से जांच वास्तव में के लिए बिना रुके है।
(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))))
अंतर्निहित org-mode
इनस्टॉल भी गिना जाता है और package-install
ELPA से नया संस्करण स्थापित करने से इंकार करता है। कुछ समय पैकेज पढ़ने में बिताने के बाद, मैं निम्नलिखित समाधान के साथ आया।
(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))
कारण यह है कि यह काम करता है package-*
परिवार के कार्य अलग-अलग तर्कों को संभालते हैं, भले ही यह एक प्रतीक या package-desc
वस्तु हो। आप केवल ऑब्जेक्ट के package-install
माध्यम से संस्करण जानकारी निर्दिष्ट कर सकते हैं package-desc
।