MELPA를 통해 설치된 패키지를 다운 그레이드하는 가장 쉬운 방법


22

때때로, MELPA의 패키지 업데이트는 emacs의 일부를 손상시킬 수 있으며, 이런 일이 발생하면 이전 버전의 패키지를 사용하여 다시 되돌릴 수 있기를 원합니다.

지금은 두 가지 방법으로 할 수 있습니다.

  • 휴지통으로 이동하여 파일을 삭제하도록 emacs를 설정했으며 패키지를 업데이트하면 이전 버전이 휴지통으로 이동합니다. 이전 버전을 검색하고에서 버전을 바꿀 수 있습니다 ~/.emacs.d/elpa.

  • 기능을 깨뜨린 패키지의 github 저장소로 이동하여 이전 버전의 패키지를 가져오고 ~/.emacs.d/elpagitub 의 패키지로 바꾸고 파일을 바이트 다시 컴파일하십시오.

이 두 가지 방법에는 많은 수동 작업이 필요합니다. MELPA에서 설치된 패키지를보다 쉽게 ​​다운 그레이드하는 방법이 있습니까?


4
ELPA / package.el, Melpa 및 Melpa-stable을 통해서만 최신 버전을 설치할 수 있으며 이전 버전의 패키지도 보관하지 않습니다. 패키지를 수동으로 설치하려면 1) 소스 코드를 다운로드하십시오 2) M-x package-install-file. el-get 및 quelpa 와 같이 ELPA / package.el 외에도 패키지를 관리하는 다른 방법이 있습니다 .ELPA 없이 사용할 수있는 것 같습니다. 아마도 원하는 것을 할 수 있습니다.
— xuchunyang

2
이 질문에 대한 간단 하고 실행 가능한 답변을 얻지 못하면 개선 요청을 Emacs로 보내는 것을 고려하십시오 : M-x report-emacs-bug(향상 요청에도 해당).
— Drew

답변:


9

M-x list-packages인터페이스를 통해 패키지를 업데이트하면 패키지를 성공적으로 설치 한 후 이전 패키지를 제거 할 것인지 묻는 메시지가 표시됩니다. 제자리에 그대로두면 나중에이 인터페이스를 통해 최신 패키지를 제거 할 수 있습니다.

현재 패키지 목록에는 ~ / .emacs.d / elpa / 디렉토리 트리에 설치된 4 가지 버전의 magit이 표시됩니다.

  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

나중에 키 ~(package-menu-mark-obsolete-deletion) 키를 사용하여 이전 버전을 정리하여 사용되지 않는 모든 패키지를 표시 할 수 있습니다. 특정 이전 버전을 삭제하려면 해당 라인으로 이동 한 후을 눌러 d삭제 표시하십시오. 패키지를 표시 한 후 x평소와 같이 작업을 실행하는 데 사용 합니다.

에서 이맥스 (25) 마크에 대한 모든 패키지 Upgrade 기능은 자동으로 삭제 기존의 모든 패키지를 설정하고, 설치 한 후 확인을 묻는 메시지를 표시하지 않습니다. 대문자 "D"로 시작하는 줄을 찾아야합니다.이 마크는 표시를 해제 할 수 있습니다 (다음 매크로에서 가장 좋습니다).

다음 줄에서 대시 왼쪽에 키 또는 코드를 입력하십시오.

<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

검색에 더 이상 일치하는 항목이 없으면 매크로가 벨을 울리고 중지되므로 C-u 0 <F4>삭제 표시된 모든 패키지의 표시를 해제 할 수 있습니다. 그런 다음 x설치를 중단 할 수 있습니다 .

내 의견에서 변경되었다고 선언 한 함수는 끝까지 반복하지 않기 위해 마지막 (cond) 블록이 성공해야한다는 점에서 아직 파악할 수없는 방식으로 변경해야합니다.


오, 내 emacs에서 삭제 확인을 요청하지 않습니다. 그것은 단지 오래된 패키지를 삭제합니다 : / 나는 그것이 emacs 24에서 묻는 데 사용 된 것 같아? 기억이 안나요
— Chakravarthy Raghunandan

과연. Emacs 24 프롬프트, 25는 오래된 것을 삭제 표시하고 표시를 실행하면 트리거됩니다. 당신은 손으로 설치를위한 패키지를 표시하거나 삭제를 해제하거나 변경할 수 (t (package-menu-mark-delete))에 줄을 package-menu--mark-upgrades-1첫 번째 줄은 구성 변수 또는 반환하는 것이 무엇인가에 대한 테스트가되도록 nil즉시 기존 패키지를 삭제하지 않으
— p_wiersig

package.el원래 답변에서 편집 할 관련 줄을 추가하여 답변을 수락 할 수 있습니까? 감사합니다
— Chakravarthy Raghunandan

확실한. 원하는 기능을 수행하기 위해 함수를 만들 수 없다는 것을 알았으므로 매크로를 통해 모두 표시를 해제하는 방법을 설명했습니다.
— p_wiersig

7

"핵 옵션"은 그대로 버리고 package.el대신 내가 작성한 패키지 관리자를 사용하는 straight.el것이다. 장점은 straight.elGit 리포지토리를 복제하여 패키지 를 설치하여 원하는 버전을 사용하는 것이 쉽지 않다는 것입니다. 또한 straight.el개정 잠금 파일을 처리하기위한 기능을 제공하여 패키지 관리 구성의 정확한 상태를 가장 세밀하게 기록 할 수 있습니다. 그런 다음 응급 상황의 경우 모든 패키지를 알려진 정상 버전으로 되돌릴 수 있습니다.

이러한 종류의 작업은 일반적으로 불가능 package.el하며 전체 디자인으로 인해 항상 불가능합니다.

패키지를 업데이트 할 때마다 커밋을하지 않으려는 경우에는이 기능이 필요하지 않습니다 straight.el. 나는 것이 좋습니다 그 어느 이맥스 구성이 업그레이드 후 파손 된 상태로 도착하는 것이 불가능하게하고 되돌릴 방법을 알고하지 않기 때문에, 버전 잠금 파일을 작성하고 때마다 당신이 당신의 패키지를 업데이트하는 것이 커밋. 그러나 가장자리에 사는 삶을 좋아한다면이 작업을 수행 할 필요가 없습니다.


4

다운 그레이드하는 쉬운 방법을 찾았습니다. 자신 만의 melpa 아카이브 관리.

  1. 복제 멜파 레포.
  2. 모든 레시피를 제거하려면 melpa의 사용자 정의 melpa 아카이브 위키 페이지 를 따르십시오 .
  3. 다운 그레이드하려는 패키지의 커밋을 찾아 패키지에 대한 해당 커밋으로 새로운 레시피를 작성하십시오. ( 커밋을 지정하는 방법에 대한 melpa의 readme 참조 )
  4. make다운 그레이드 된 패키지를 빌드하기 위해 실행
  5. 로컬 디렉토리 일 수있는 고유 한 melpa 아카이브를 package-archives목록에 추가하십시오.
  6. 패키지 메뉴를 사용하여 다운 그레이드 된 패키지를 설치하십시오. 또는 package-pinned-packages패키지를 다운로드 할 아카이브를 제한하는 데 사용할 수 있습니다 .

3

많은 사람들이 ELPA 패키지를 버전 제어에 적용하지 않기로 선택했지만 이것이 내가 그렇게해야한다고 믿는 이유의 예입니다.

모든 것이 최선을 다하면 되돌릴 수 있습니다.

업스트림 ELPA 패키지의 상태에 따라 위험이 있습니다.


그러나 이는 패키지를 업데이트 할 때마다 커밋해야한다는 것을 의미합니다. 그것은 내가 원하는 것이 아닙니다. 또는 패키지 업데이트를 수행 할 때마다 emacs가 자동으로 스테이징되고 업데이트 된 패키지를 커밋 할 수있는 방법이 있습니까?
— Chakravarthy Raghunandan

1
구성 변경을 의도적으로 결정하지 않으려는 이유를 이해하지 못합니다. 자동 커밋에 관해서는 자동화 할 수 있다고 확신 하지만 그에 대한 해결책은 없습니다. 그러나 이러한 솔루션을 검색하면 생산성이 높아질 수 있습니다.
— phils
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.