Cách dễ nhất để hạ cấp gói được cài đặt qua MELPA


22

Đôi khi, các bản cập nhật gói từ MELPA có thể phá vỡ một số phần của emacs và khi điều đó xảy ra, tôi muốn có thể quay trở lại sử dụng phiên bản cũ hơn của gói.

Ngay bây giờ, tôi có thể làm theo hai cách:

  • Tôi đã đặt emacs để xóa các tệp bằng cách di chuyển vào thùng rác và khi tôi cập nhật một gói, phiên bản cũ hơn bị hỏng. Tôi có thể lấy phiên bản cũ hơn và thay thế phiên bản trong ~/.emacs.d/elpa.

  • Chuyển đến repo github của gói đã phá vỡ chức năng, tìm nạp phiên bản cũ hơn của gói, thay thế phiên bản cũ bằng gói ~/.emacs.d/elpatừ gitub, biên dịch lại byte tệp (s).

Cả hai cách này liên quan đến rất nhiều công việc thủ công di chuyển mọi thứ xung quanh. Có cách nào dễ dàng hơn (tốt nhất là tự động) để hạ cấp các gói được cài đặt từ MELPA không?


4
Bạn chỉ có thể cài đặt phiên bản mới nhất thông qua ELPA / pack.el, Melpa và Melpa-ổn định thậm chí không giữ các phiên bản cũ của gói. Để cài đặt gói theo cách thủ công, 1) tải xuống mã nguồn 2) M-x package-install-file. Ngoài ra còn có các cách khác để quản lý các gói ngoài ELPA / pack.el, chẳng hạn như el-getquelpa , chúng dường như có thể được sử dụng mà không cần ELPA, có thể chúng có thể làm những gì bạn muốn.
xuchunyang

2
Nếu bạn không nhận được câu trả lời đơn giản , khả thi cho câu hỏi này, vui lòng xem xét việc gửi yêu cầu nâng cao tới Emacs: M-x report-emacs-bug(nó cũng dành cho các yêu cầu nâng cao).
vẽ

Câu trả lời:


9

Khi bạn cập nhật các gói của mình thông qua M-x list-packagesgiao diện, sau khi cài đặt gói thành công, bạn sẽ được hỏi nếu bạn muốn xóa gói cũ. Đừng xóa chúng để chúng giữ nguyên vị trí và sau đó bạn có thể xóa gói mới hơn thông qua giao diện này.

Danh sách gói hiện tại của tôi hiển thị 4 phiên bản magit được cài đặt trong cây thư mục ~ / .emacs.d / elpa / của tôi.

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

Bạn có thể dọn sạch các phiên bản cũ sau đó bằng phím ~(gói-menu-mark-lỗi thời để xóa) để đánh dấu tất cả các gói lỗi thời. Để xóa một phiên bản cũ nhất định, di chuyển đến dòng của nó và nhấn dđể đánh dấu chúng để xóa. Sau khi bạn đánh dấu các gói bạn sử dụng xđể thực hiện các hành động như bình thường.

Trong Emacs 25 , đánh dấu tất cả các gói cho Uchức năng nâng cấp sẽ tự động đặt tất cả các gói cũ để xóa và không nhắc xác nhận sau khi cài đặt. Bạn phải tìm kiếm các dòng bắt đầu bằng chữ "D", mà bạn chỉ có thể bỏ đánh dấu (tốt nhất với macro sau)

Nhập phím hoặc hợp âm ở bên trái của dấu gạch ngang từ các dòng sau.

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

Nếu không có kết quả phù hợp nào cho tìm kiếm, macro sẽ rung chuông và dừng lại, vì vậy bạn có thể C-u 0 <F4>bỏ đánh dấu tất cả các gói được đánh dấu để xóa. Sau này, bạn có thể tính xtoán cài đặt.

Hàm tôi đã tuyên bố sẽ được thay đổi trong nhận xét của tôi phải được thay đổi theo cách mà tôi chưa thể nắm bắt được, vì điều quan trọng là khối (cond) cuối cùng phải thành công để không lặp lại vô tận.


Oh hey, Nó không yêu cầu xác nhận để xóa trong emacs của tôi. Nó chỉ xóa gói cũ: / tôi nghĩ nó được sử dụng để hỏi trong emacs 24? tôi không nhớ
Chakravarthy Raghunandan

thật. Emacs 24 lời nhắc, 25 dường như đánh dấu cái cũ để xóa và điều đó sẽ kích hoạt việc thực hiện các dấu. Bạn có thể đánh dấu các gói để cài đặt bằng tay hoặc bỏ đánh dấu xóa hoặc thay đổi các (t (package-menu-mark-delete))dòng package-menu--mark-upgrades-1để dòng đầu tiên là kiểm tra biến cấu hình hoặc thứ gì đó trả về nilkhi bạn không muốn xóa các gói cũ ngay lập tức
p_wiersig

Bạn có thể vui lòng thêm các dòng có liên quan để chỉnh sửa trong package.elcâu trả lời ban đầu, để tôi có thể chấp nhận câu trả lời không? Cảm ơn
Chakravarthy Raghunandan

Chắc chắn rồi. Tôi nhận thấy rằng tôi không thể thực hiện chức năng để làm những gì tôi muốn, vì vậy tôi đã giải thích cách bỏ đánh dấu tất cả thông qua một macro.
p_wiersig

7

"Tùy chọn hạt nhân", như đã từng, sẽ là bỏ package.elhoàn toàn và thay vào đó sử dụng trình quản lý gói mà tôi đã viết straight.el. Ưu điểm là straight.elcài đặt các gói bằng cách sao chép kho Git của chúng, do đó làm cho nó trở nên tầm thường khi sử dụng bất kỳ phiên bản nào bạn muốn. Ngoài ra, straight.elcung cấp chức năng để xử lý các tệp khóa sửa đổi, cho phép bạn ghi lại trạng thái chính xác của cấu hình quản lý gói của bạn xuống chi tiết nhỏ nhất. Sau đó, trong trường hợp khẩn cấp, bạn có thể chỉ cần hoàn nguyên tất cả các gói về các phiên bản đã biết của chúng.

Nói chung, những loại hoạt động này là không thể package.el, và chúng sẽ luôn luôn là không thể, do thiết kế tổng thể.

Để đáp ứng mong muốn của bạn để tránh thực hiện một cam kết mỗi khi bạn cập nhật các gói của mình, điều này là không cần thiết với straight.el. Tôi khuyên bạn nên viết một phiên bản lockfile và cam kết rằng mỗi khi bạn cập nhật các gói của mình, vì điều đó khiến bạn không thể vào trạng thái cấu hình Emacs của bạn bị hỏng sau khi nâng cấp và bạn không biết cách hoàn nguyên. Nhưng bạn không phải làm điều này, nếu bạn thích cuộc sống bên lề.


4

Tôi tìm thấy một cách dễ dàng để hạ cấp: quản lý kho lưu trữ melpa của riêng bạn.

  1. Clone melpa repo.
  2. Theo dõi trang wiki lưu trữ melpa tùy chỉnh của melpa để xóa tất cả các công thức nấu ăn.
  3. Tìm cam kết của gói bạn muốn xuống lớp và tạo một công thức mới với cam kết đó cho gói. (xem phần đọc của melpa về cách chỉ định cam kết)
  4. Chạy makeđể xây dựng gói hạ cấp
  5. Thêm kho lưu trữ melpa của riêng bạn, có thể là một thư mục địa phương, vào package-archivesdanh sách.
  6. Cài đặt gói hạ cấp bằng menu gói. Hoặc bạn có thể sử dụng package-pinned-packagesđể hạn chế kho lưu trữ nơi gói nên được tải xuống từ đó.

3

Nhiều người chọn không cam kết các gói ELPA để kiểm soát phiên bản, nhưng đây là một ví dụ về lý do tại sao tôi tin rằng bạn nên làm như vậy.

Hoàn nguyên bất cứ điều gì là tầm thường nếu tất cả đã cam kết.

Tùy thuộc vào trạng thái của các gói ELPA ngược dòng là một rủi ro.


Nhưng điều đó có nghĩa là tôi phải nhớ cam kết mỗi khi cập nhật các gói. Đó không phải là điều tôi muốn. HOẶC có cách nào để tôi có thể tự động tạo giai đoạn và cam kết các gói được cập nhật bất cứ khi nào tôi thực hiện cập nhật gói không?
Chakravarthy Raghunandan

1
Tôi không hiểu tại sao bạn không muốn thay đổi cấu hình của mình thành quyết định có chủ ý. Về cam kết tự động, tôi chắc chắn rằng có thể được tự động hóa, nhưng tôi không có giải pháp cho việc đó. Tìm kiếm các giải pháp như vậy có thể cung cấp hiệu quả, tuy nhiên.
phils
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.