Cách tải chỉ một tập hợp con các gói đã cài đặt


13

Tôi gặp phải một lỗi liên quan đến sự tương tác giữa một số gói. Để báo cáo lỗi, tôi cần cung cấp một công thức tái tạo minh họa vấn đề. Điều này yêu cầu tải các gói thích hợp, nhưng không có gì khác từ init của tôi và không có gói nào khác. Cách tốt nhất để làm việc này là gì?

CẬP NHẬT

Để làm rõ, tôi quen thuộc với khái niệm sàng lọc thông qua .emacs của tôi trong tìm kiếm nhị phân để xác định mã gây ra sự cố. Trong tình huống này, tôi biết chính xác gói nào đang gây ra sự cố. Những gì tôi không biết, là làm thế nào để sử dụng package-hệ thống để tải chỉ vài gói đó.

(package-initialize)sẽ tải các gói, nhưng tất cả mọi thứ khác trong .emacs.d/elpathư mục của tôi . package-load-listcho phép tôi chỉ định các phiên bản cụ thể của các gói để tải hoặc các gói cụ thể để loại trừ rõ ràng . Tôi cần điều ngược lại - cách cung cấp Emacs một danh sách các gói để bao gồm , mà không cần tải bất kỳ gói nào khác trong hệ thống elpa / gói.


Nếu bạn đã tách vấn đề thành một số gói hữu hạn, thì bạn có thể thử tái tạo vấn đề bằng cách bắt đầu từ một .emacstệp trống - cài đặt từng gói một và sau đó xem vấn đề còn tồn tại không. Bạn có thể làm mình ngạc nhiên và thấy gói chịu trách nhiệm không chơi đẹp với gói kia. Khi bạn đã đi xa hết mức có thể, hãy viết ra các bước bạn đã sử dụng để tái tạo sự cố và gửi báo cáo lỗi - ví dụ: bắt đầu từ Emacs -Q , cài đặt gói A, sau đó cài đặt gói B, sau đó cài đặt gói C, sau đó mở *Scratch*bộ đệm và gõ ...
luật

Những gì @lawlist nói. Nếu bạn không chắc chắn mình đã thu hẹp hoàn toàn mọi thứ, hãy sử dụng tìm kiếm nhị phân: loại bỏ 1/2 tùy ý những gì bạn có để khắc phục vấn đề (ví dụ: loại bỏ 2 pkgs trong số 4). Sau đó xóa 3/4, 7/8, ... cắt mã cần thiết để repro nó một nửa mỗi lần. Bạn có thể cắt mã tương tự của một pkg đã cho trong 1/2, v.v., để thu hẹp mọi thứ xuống một chút mã cần thiết để repro nó. Bạn có thể sử dụng lệnh comment-regionđể nhận xét (hoặc, với C-u, để bỏ ghi chú) một vùng văn bản.
vẽ

Tôi hiểu điều này ở cấp mã giả. Tôi không hiểu làm thế nào, bằng cách sử dụng nhóm lệnh, bạn chỉ tải một tập hợp con của các gói trong. thư mục emacs.d / elpa
Tyler

Trước đây, một người bảo trì đã chỉ ra rằng tôi đang tải mọi thứ với khởi tạo gói và tôi không chắc chắn làm thế nào để tránh github.com/emacs-ess/ESS/issues/140
Tyler

1
package-load-list một cách để bao gồm rõ ràng các gói, chỉ cần loại bỏ allbiểu tượng.
npostavs

Câu trả lời:


10

Các package-load-listbiến thể được sử dụng để xác định một cách chính xác mà các gói và các phiên bản để tải:

List of packages for `package-initialize' to load.
Each element in this list should be a list (NAME VERSION), or the
symbol `all'.  The symbol `all' says to load the latest installed
versions of all packages not specified by other elements.

For an element (NAME VERSION), NAME is a package name (a symbol).
VERSION should be t, a string, or nil.
If VERSION is t, the most recent version is activated.
If VERSION is a string, only that version is ever loaded.
 Any other version, even if newer, is silently ignored.
 Hence, the package is "held" at that version.
If VERSION is nil, the package is not loaded (it is "disabled").

Điều duy nhất cần chú ý là giá trị mặc định bao gồm all, nếu bạn setqthì nó sẽ ổn vì điều đó hoàn toàn ghi đè lên giá trị ban đầu.

(require 'package)
(setq package-load-list
      '((package1 "4.2")
        (package2 "0.5.1")))
(package-initialize)

4

Một tùy chọn sẽ hoạt động tốt trong các bối cảnh nơi các nhà phát triển làm việc tái tạo lỗi có thể chưa có (hoặc muốn) các phụ thuộc được cài đặt là sử dụng trygói ( https://melpa.org/#/try ). Những người khác có thể tải một gói từ quản lý gói mà không sửa đổi cài đặt cục bộ của họ.

(package-install 'try)
(require 'try)

(try 'some-package)
(try 'some-other-package)

(steps (to reproduce) (the (problem)))

2

Trường hợp sử dụng này là một thiếu sót khủng khiếp package.el, vì vậy đừng sử dụng package.el. Thay vào đó, hãy sử dụng trình quản lý gói như straight.el(Tôi là tác giả), được thiết kế riêng để hỗ trợ trường hợp sử dụng này.

Để biết tài liệu dài dòng trên straight.el, bao gồm các so sánh với các trình quản lý gói khác, xem README . Dưới đây, tôi đã trích dẫn phần có liên quan đến câu hỏi của bạn.

Sử dụng straight.elđể tái tạo lỗi

Một trong những lý do chính tôi muốn viết straight.ellà các trình quản lý gói hiện tại không tốt cho việc tái tạo lỗi. Chẳng hạn, một số trong số chúng sẽ tải tất cả các gói đã cài đặt khi trình quản lý gói được khởi tạo! Rõ ràng điều đó không được chấp nhận đối với "trường hợp thử nghiệm tối thiểu".

Ngược lại, bootstrapping straight.elkhông tải bất cứ thứ gì ngoại trừ straight.elchính nó (kho công thức mặc định được đăng ký, nhưng không được sao chép cho đến khi cần). Thông thường bạn nên tải straight.elbằng đoạn mã bootstrap , nhưng khi bạn vào emacs -Q, đây là cách bạn có thể khởi tạo straight.el:

M-x load-file RET ~/.emacs.d/straight/bootstrap.el RET

Bạn cũng có thể làm điều này từ dòng lệnh, có lẽ bằng cách tạo bí danh cho nó:

$ emacs -Q -l ~/.emacs.d/straight/bootstrap.el

Giả sử bạn đang tạo báo cáo lỗi cho Projectile. Để chỉ tải Projectile và tất cả các phụ thuộc của nó, hãy chạy:

M-x straight-use-package RET projectile RET

Lưu ý rằng điều này sẽ sử dụng các bản sửa đổi hiện đang được kiểm tra của Projectile và tất cả các phụ thuộc của nó, vì vậy bạn nên lưu ý những điều đó để báo cáo lỗi của mình.


0

Khi bạn cần một lần (ví dụ: để thử và kiểm tra công thức để tạo lại lỗi), bạn thường có thể thoát khỏi:

emacs -Q -l ~/.emacs.d/elpa/<pkg>-<vers>/<pkg>-autoloads.el

Tôi đã nói "thường" bởi vì nó sẽ không chú ý đến các phụ thuộc, vì vậy trong một số trường hợp, bạn sẽ cần thêm nhiều đối số đó -l ...để tải các gói khác cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.