MELPAを介してインストールされたパッケージをダウングレードする最も簡単な方法


22

MELPAからのパッケージの更新により、emacsの一部が破損する場合があります。その場合は、古いバージョンのパッケージを使用するように戻すことができます。

今、私は2つの方法でそれを行うことができます:

  • ゴミ箱に移動してファイルを削除するようにemacsを設定しました。パッケージを更新すると、古いバージョンはゴミ箱に移動します。古いバージョンを取得して、のバージョンを置き換えることができます~/.emacs.d/elpa

  • 機能を壊したパッケージのgithubリポジトリに移動し、古いバージョンのパッケージを取得し、~/.emacs.d/elpagitub のパッケージと置き換えて、ファイルをバイト再コンパイルします。

どちらの方法も、物事を動かす多くの手作業を伴います。MELPAからインストールされたパッケージをダウングレードする簡単な方法(できれば自動)がありますか?


4
ELPA / package.elを介してのみ最新バージョンをインストールできます。MelpaおよびMelpa-stableは、パッケージの古いバージョンも保持しません。パッケージを手動でインストールするには、1)ソースコードをダウンロードします2)M-x package-install-fileel-getquelpaなど、ELPA / package.el以外のパッケージを管理する他の方法もあります。ELPAなしでも使用できるようです。
-xuchunyang

2
この質問に対して単純実行可能な答えが得られない場合は、Emacsに機能拡張要求を送信することを検討してください:(M-x report-emacs-bug機能拡張要求でもあります)。
ドリュー

回答:


9

M-x list-packagesインターフェイスを介してパッケージを更新すると、パッケージのインストールが成功した後、古いパッケージを削除するかどうかを尋ねられます。それらが所定の位置に留まるようにそれらを削除しないでください。その後、このインターフェースを介して新しいパッケージを削除できます。

現在のパッケージリストには、〜/ .emacs.d / elpa /ディレクトリツリーにインストールされているmagitの4つのバージョンが表示されています。

  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-for-deletion)を使用して古いバージョンを後でクリーンアップし、古いパッケージをすべてマークできます。特定の古いバージョンを削除するには、その行に移動し、を押しdて削除のマークを付けます。x通常のようにアクションを実行するために使用するパッケージをマークした後。

ではEmacsの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元の回答で編集する関連行を追加して、回答を受け入れることができますか?ありがとう
チャクラヴァル

はい。私は自分がやりたいことをする関数を作成できないことに気づいたので、マクロを介してすべてのマークを解除する方法を説明しました。
p_wiersig

7

「核オプション」は、そのままで、package.el完全に捨てて、代わりに私が書いたパッケージマネージャーを使用することstraight.elです。利点はstraight.el、Gitリポジトリーのクローンを作成してパッケージをインストールすることです。これにより、希望するバージョンを使用するのが簡単になります。また、straight.elリビジョンロックファイルを処理する機能を提供します。これにより、パッケージ管理構成の正確な状態を最小の詳細まで記録できます。次に、緊急の場合に、すべてのパッケージを既知の正常なバージョンに戻すことができます。

これらの種類の操作は、一般に、では不可能でありpackage.el、全体的な設計のため、常に不可能です。

パッケージを更新するたびにコミットすることを避けたいという要望に応えて、これはで必要ありませんstraight.el。バージョンロックファイルを作成し、パッケージを更新するたびにコミットすることをお勧めします。これにより、アップグレード後にEmacsの設定が破損し、元に戻す方法がわからない状態になることができなくなります。しかし、あなたが端の生活をするのが好きなら、あなたはこれをする必要はありません。


4

ダウングレードする簡単な方法を見つけました:独自のmelpaアーカイブを管理します。

  1. クローンmelpaレポ。
  2. melpaのカスタムmelpaアーカイブwikiページに従って、すべてのレシピを削除してください
  3. ダウングレードするパッケージのコミットを見つけて、そのコミットでパッケージの新しいレシピを作成します。(コミットの指定方法については、melpaのreadmeをご覧ください)
  4. 実行makeして、ダウングレードされたパッケージをビルドします
  5. 独自のmelpaアーカイブ(ローカルディレクトリにすることができます)をpackage-archivesリストに追加します。
  6. パッケージメニューを使用して、ダウングレードされたパッケージをインストールします。またはpackage-pinned-packages、パッケージのダウンロード元のアーカイブを制限するために使用できます。

3

多くの人がELPAパッケージをバージョン管理にコミットしないことを選択しますが、これはあなたがそうするべきだと思う理由の例です。

元に戻す何もすることは、それがすべてコミットなら簡単です。

アップストリームELPAパッケージの状態によってはリスクがあります。


ただし、パッケージを更新するたびにコミットすることを忘れないでください。それは私が望むものではありません。または、パッケージの更新を行うたびに、更新されたパッケージを自動的にステージングしてコミットできるようにする方法はありますか?
チャクラヴァルシーラグナナンダン

1
構成の変更を意図的な決定にしたくない理由がわかりません。自動コミットに関しては、自動化できると確信していますが、その解決策はありません。ただし、このようなソリューションを検索すると、生産性が向上する場合があります。
phils
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.