Tôi gặp phải một vấn đề mà không có gì xảy ra sau khi thêm (package-install 'org)
vào .emacs
. Tôi muốn cài đặt phiên bản cập nhật org-mode
và cài sẵn org-mode
này khá cũ.
Tôi đã đào ra mã nguồn của package-install
Emacs 25.3.1. Chức năng tự kiểm tra xem một gói đã được cài đặt hay chưa và từ chối cài đặt nó nếu gói đó đã được cài đặt. Vì vậy, kiểm tra (unless (package-installed-p package) ...)
từ câu trả lời 10093312 trên thực tế là không được gọi.
(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))))
Tích hợp sẵn org-mode
cũng được tính là đã cài đặt và package-install
từ chối cài đặt phiên bản mới hơn từ ELPA. Sau một thời gian đọc package.el, tôi đã nghĩ ra giải pháp sau.
(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))
Lý do tại sao nó hoạt động là các package-*
hàm gia đình xử lý các đối số khác nhau dựa trên việc liệu nó là một biểu tượng hay một package-desc
đối tượng. Bạn chỉ có thể chỉ định thông tin phiên bản cho package-install
thông qua một package-desc
đối tượng.