インストール済みパッケージのサブセットのみをロードする方法


13

複数のパッケージ間の相互作用に関係するバグに遭遇しました。バグを報告するには、問題を説明する再現可能なレシピを提供する必要があります。これには適切なパッケージをロードする必要がありますが、私のinitからは何もロードせず、他のパッケージもロードしません。これを行う最良の方法は何ですか?

更新

明確にするために、問題の原因となっているコードを特定するために、バイナリ検索で.emacsを選別する概念に精通しています。この状況では、どのパッケージが問題を引き起こしているのかを正確に把握しています。私が知らないのは、package-システムを使用してこれらの少数のパッケージだけをロードする方法です。

(package-initialize)パッケージをロードしますが、.emacs.d/elpaディレクトリ内の他のすべてもロードします。package-load-listロードするパッケージの特定のバージョン、または明示的に除外する特定のパッケージを指定できます。私は逆が必要です-elpa / packageシステムに他のパッケージをロードせず含めるパッケージのリストをEmacsに提供する方法。


問題を限られた数のパッケージに切り分けた場合は、空の.emacsファイルから開始して問題を再現してみてください。各パッケージを1つずつインストールし、問題がまだ存在するかどうかを確認してください。あなたは自分自身を驚かせ、他のパッケージでうまく動作しない責任のあるパッケージを見つけるかもしれません。可能な限り進んだら、問題を再現するために使用した手順を書き、バグレポートを提出します。たとえば、Emacs -Qから開始し、パッケージAをインストールし、次にパッケージBをインストールし、次にパッケージCをインストールします。その後、開い*Scratch*バッファとタイプ...
lawlist

@lawlistが言ったこと。完全に絞り込んだかどうかわからない場合は、バイナリ検索を使用します。問題を再現するものの任意の1/2を削除します(4つのうち2つのパッケージを削除します)。次に、3 / 4、7 / 8、...を削除し、毎回半分に再現するために必要なコードを切り刻みます。同様に、与えられたpkgのコードを1/2などに切り刻んで、再現に必要な非常に小さなコードに物事を絞り込むことができます。コマンドcomment-regionを使用してC-u、テキストの領域をコメントアウト(または、とコメント解除)できます。
ドリュー

これは擬似コードレベルで理解できます。コマンドのpackage-familyを使用して、パッケージのサブセットのみをロードする方法がわかりません。emacs.d / elpaディレクトリ
タイラー

以前、メンテナーは、すべてをpackage-initializeでロードしていることを示していましたが、これを避ける方法がわからないgithub.com/emacs-ess/ESS/issues/140
タイラー

1
package-load-list 明示的にパッケージを含める方法、単に削除allシンボルを。
npostavs

回答:


10

package-load-list変数は、負荷に正確にどのパッケージとバージョンを指定するために使用することができます。

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").

注意する唯一のことは、デフォルト値にが含まれallsetqいることです。もしそれがあれば、元の値を完全に上書きするので問題ありません。

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

4

バグの再現に取り組んでいる開発者がこれらの依存関係をまだインストールしていない(または望んでいない)状況でうまく機能するオプションは、tryパッケージ(https://melpa.org/#/try)を使用することです。他のユーザーは、ローカルインストールを変更せずにパッケージ管理からパッケージを読み込むことができます。

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

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

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

2

このユースケースはのひどい不足でpackage.elあるので、使用しないでくださいpackage.el。代わりに、straight.elこの使用例をサポートするために特別に設計された(私は著者です)などのパッケージマネージャーを使用してください。

の詳細なドキュメントについてはstraight.el、他のパッケージマネージャーとの比較など、READMEを参照してください。以下に、あなたの質問に関連するセクションを引用しました。

straight.elバグを再現するために使用する

私が書きたかった主な理由の1つは、straight.el既存のパッケージマネージャーがバグの再現に適していないことでした。たとえば、パッケージマネージャーが初期化されたときに、インストールされているすべてのパッケージが読み込まれます。明らかに、「最小限のテストケース」には受け入れられません。

それどころか、ブートストラップstraight.elstraight.elそれ自体以外はロードしません(デフォルトのレシピリポジトリは登録されますが、必要になるまでクローンは作成されません)。通常straight.elブートストラップスニペットを使用してロードする必要がありますが、起動しているときにemacs -Q初期化する方法は次のstraight.elとおりです 。

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

おそらくエイリアスを作成して、コマンドラインからこれを行うこともできます。

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

Projectileのバグレポートを作成しているとしましょう。Projectileとそのすべての依存関係をロードするには、次を実行します:

M-x straight-use-package RET projectile RET

これは、Projectileの現在チェックアウトされているリビジョンとそのすべての依存関係を使用することに注意してください。したがって、バグレポートを作成するためにそれらをメモする必要があります。


0

一度だけ必要な場合(たとえば、レシピを試してバグを再現する場合)、次の方法で回避できます。

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

依存関係に注意を払わないため、「よく」と言ったので、場合によって-l ...は、必要な他のパッケージをロードするためにこれらの引数をさらに追加する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.