Cara memuat hanya sebagian dari paket yang diinstal

13

Saya menemukan bug yang melibatkan interaksi antara beberapa paket. Untuk melaporkan bug, saya harus memberikan resep yang dapat direproduksi menggambarkan masalah. Ini membutuhkan pemuatan paket yang sesuai, tetapi tidak ada yang lain dari init saya, dan tidak ada paket lain. Apa cara terbaik untuk melakukan ini?

MEMPERBARUI

Untuk memperjelas, saya akrab dengan konsep memilah-milah .emacs saya dalam pencarian biner untuk mengidentifikasi kode yang menyebabkan masalah. Dalam situasi ini, saya sudah tahu persis paket apa yang menyebabkan masalah. Yang saya tidak tahu, adalah bagaimana menggunakan package-sistem untuk memuat hanya beberapa paket itu.

(package-initialize)akan memuat paket, tetapi juga segala sesuatu yang lain di .emacs.d/elpadirektori saya . package-load-listmemungkinkan saya untuk menentukan versi paket tertentu untuk dimuat, atau paket tertentu untuk secara eksplisit mengecualikan . Saya perlu sebaliknya - bagaimana cara memasok Emacs dengan daftar paket untuk disertakan , tanpa memuat paket lain dalam sistem elpa / paket.

Tyler
sumber
Jika Anda telah mengisolasi masalah ke sejumlah paket, maka Anda dapat mencoba mereproduksi masalah dengan mulai dari .emacsfile kosong - instal setiap paket satu per satu dan kemudian lihat apakah masalahnya masih ada. Anda dapat mengejutkan diri sendiri dan menemukan paket yang bertanggung jawab yang tidak cocok dengan paket lainnya. Ketika Anda sudah sejauh yang Anda bisa, tulis langkah-langkah yang Anda gunakan untuk mereproduksi masalah dan kirimkan laporan bug - misalnya, mulai dari Emacs -Q , instal paket A, lalu instal paket B, kemudian instal paket C, kemudian buka *Scratch*buffer dan ketik ...
hukum
Apa yang dikatakan @lawlist. Jika Anda tidak yakin telah mempersempit semuanya, gunakan pencarian biner: hapus 1/2 dari apa yang Anda miliki yang mengulangi masalah tersebut (mis. Hapus 2 pkg dari 4). Kemudian hapus 3/4, 7/8, ... potong kode yang diperlukan untuk mem-repro menjadi dua setiap kali. Anda juga dapat memotong kode pkg yang diberikan dalam 1/2, dll., Untuk mempersempit ke sedikit kode yang diperlukan untuk repro. Anda dapat menggunakan perintah comment-regionuntuk mengomentari (atau, dengan C-u, untuk menghilangkan komentar) suatu wilayah teks.
Drew
Saya mengerti ini pada level pseudo-code. Saya tidak mengerti bagaimana, menggunakan paket-keluarga dari perintah, Anda memuat hanya sebagian dari paket di Anda. direktori emacs.d / elpa
Tyler
Sebelumnya seorang pengelola mengindikasikan bahwa saya memuat semuanya dengan inisialisasi paket, dan saya tidak yakin bagaimana cara menghindari ini github.com/emacs-ess/ESS/issues/140
Tyler
1
package-load-list adalah cara untuk secara eksplisit memasukkan paket, cukup hapus allsimbol.
npostavs

Jawaban:

10

The package-load-listvariabel dapat digunakan untuk menentukan secara tepat paket dan versi memuat:

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

Satu-satunya hal yang harus diperhatikan adalah bahwa nilai default termasuk all, jika Anda setqmaka Anda akan baik-baik saja karena itu benar-benar menimpa nilai asli.

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

Opsi yang akan bekerja dengan baik dalam konteks di mana pengembang bekerja mereproduksi bug mungkin belum memiliki (atau ingin) dependensi yang diinstal adalah menggunakan trypaket ( https://melpa.org/#/try ). Yang lain dapat memuat paket dari manajemen paket tanpa mengubah instalasi lokal mereka.

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

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

(steps (to reproduce) (the (problem)))
Epa
sumber
2

Kasing ini adalah kekurangan yang parah package.el, jadi jangan gunakan package.el. Sebaliknya, gunakan manajer paket sukastraight.el (Saya penulis), yang secara khusus dirancang untuk mendukung kasus penggunaan ini.

Untuk dokumentasi lisan pada straight.el, termasuk perbandingan dengan manajer paket lain, lihat README . Di bawah, saya telah mengutip bagian yang relevan dengan pertanyaan Anda.

Menggunakan straight.eluntuk mereproduksi bug

Salah satu alasan utama saya ingin menulis straight.eladalah bahwa manajer paket yang ada tidak baik untuk mereproduksi bug. Sebagai contoh, beberapa dari mereka akan memuat semua paket yang diinstal ketika manajer paket diinisialisasi! Jelas itu tidak dapat diterima untuk "kasus uji minimal".

Sebaliknya, bootstrap straight.eltidak memuat apa pun kecuali untuk straight.eldirinya sendiri (repositori resep default terdaftar, tetapi tidak dikloning sampai diperlukan). Anda seharusnya memuat straight.elmelalui cuplikan bootstrap , tetapi ketika Anda berada di emacs -Qsini, inilah cara Anda dapat menginisialisasi straight.el:

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

Anda juga dapat melakukan ini dari baris perintah, mungkin dengan membuat alias untuknya:

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

Katakanlah Anda membuat laporan bug untuk Proyektil. Untuk memuat hanya Proyektil dan semua dependensinya, jalankan:

M-x straight-use-package RET projectile RET

Perhatikan bahwa ini akan menggunakan revisi Proyektil dan semua dependensinya yang saat ini telah dikeluarkan, jadi Anda harus mencatat semua itu untuk membuat laporan bug Anda.

Radon Rosborough
sumber
0

Ketika Anda membutuhkannya untuk sekali saja (misalnya untuk mencoba dan menguji resep untuk mereproduksi bug), Anda sering dapat lolos dengan:

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

Saya mengatakan "sering" karena tidak akan memperhatikan dependensi, jadi dalam beberapa kasus Anda perlu menambahkan lebih banyak -l ...argumen untuk memuat paket lain yang diperlukan.

Stefan
sumber