ใช้ package.el เพื่อติดตั้งและอัปเดต แต่ใช้แพ็คเกจสำหรับการโหลดและกำหนดค่า


15

หลังจากเพิ่งเรียนรู้เกี่ยวกับuse-packageฉันตัดสินใจที่จะพอร์ตการกำหนดค่าของฉันไป แต่พบว่าตัวเองลังเลที่จะให้ความสะดวกในpackage.elการติดตั้งแพ็กเกจและปรับปรุงให้ทันสมัยอยู่เสมอ ฉันได้พบมันเล็ก ๆ น้อย ๆ ที่ยุ่งยากในการรวมและuse-packagepackage.el

โดยทั่วไปฉันสนใจที่จะเรียนรู้ว่าผู้คนรวมเข้าuse-packageกับpackage.elระบบได้อย่างไร แต่สำหรับคำถามที่เฉพาะเจาะจงกว่านี้ให้อ่านต่อไป

นี่คือสิ่งที่ฉันต้องการ:

  1. list-packagesจะมีแพคเกจติดตั้งโดยผู้จัดการแพคเกจเพื่อให้สามารถเรียกดูได้อย่างง่ายดายสำหรับแพคเกจและให้พวกเขาปรับปรุงผ่าน
  2. ในการกำหนดค่าและโหลดแพคเกจโดยเฉพาะuse-packageดังนั้นฉันสามารถเห็นได้ง่ายในไฟล์ init ของฉันสิ่งที่ฉันกำลังโหลดและวิธีการกำหนดค่า
  3. เลือกฉันต้องการที่จะยังสามารถติดตั้งแพคเกจผ่านuse-package's :ensureคำหลัก

ถ้าฉันทำความเข้าใจอย่างถูกต้องผมต้องการที่น้อยมากของสิ่งที่package-initializeไม่เพียง load-pathแต่โดยทั่วไปวิธีการที่จะกำหนดขึ้น ขณะนี้ฉันมีสิ่งนี้ในการกำหนดค่าของฉัน:

;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
  (normal-top-level-add-subdirs-to-load-path))
(require 'use-package)

บรรทัดแรกที่ถูกคอมเม้นท์ดังนั้น Emacs 25 จะไม่เพิ่ม(package-initialize)ไฟล์ลงในไฟล์ init ของฉันอย่างมีประโยชน์ บิตที่มีnormal-top-level-add-subdirs-to-load-pathคือการประมาณสิ่งที่package-initializeจะทำให้load-pathการประมาณนั้นดูดีพอ

ดูเหมือนว่าจะบรรลุความต้องการของฉันที่ 1 และ 2 แต่ไม่ใช่ 3 ถ้าฉันพยายามใช้:ensureฉันได้รับข้อความแสดงข้อผิดพลาดpackage.elว่าไม่ได้เริ่มต้น การโทรpackage-initializeจะแก้ไขปัญหานั้น แต่ฉันต้องการหลีกเลี่ยงสิ่งนั้นนับตั้งแต่) ฉันไม่ต้องการให้โหลดโหลดอัตโนมัติจำนวนมาก (ฉันชอบที่จะใช้use-packageสร้าง autoloads ที่ฉันต้องการได้อย่างแม่นยำ) และ b) ฉันต้องการได้อย่างง่ายดาย หลีกเลี่ยงการโหลดแพ็คเกจที่ติดตั้งไว้เมื่อใดก็ตามที่ฉันต้องการ (ซึ่งทำได้ง่ายuse-package)

ใครบ้างมีคำแนะนำสำหรับวิธีการทำเช่นนี้?

คำตอบ:


11

IIUC สิ่งที่คุณต้องการทำคือ:

(package-initialize t)

จดบันทึกtอาร์กิวเมนต์ซึ่งเป็นกุญแจสำคัญสู่ความสุขของคุณที่นี่เนื่องจากมันจะเริ่มต้น (หรืออย่างน้อย) แพ็คเกจเริ่มต้นโดยไม่ต้องเปิดใช้งานแพ็คเกจที่ติดตั้งทั้งหมด


1
นี้ตอบคำถามของฉันแม้ว่าตอนนี้ฉันโน้มตัวไปใช้package-initializeที่ทำให้ moot คำถามของฉัน
โอมาร์

15

ด้วยการกำหนดค่าปัจจุบันของคุณคุณได้ปิดใช้งาน package.el อย่างมีประสิทธิภาพเนื่องจากคุณไม่ได้กำหนดค่าเริ่มต้นตัวจัดการแพคเกจและป้องกัน Emacs จากการเริ่มต้นโดยอัตโนมัติ สิ่งที่คุณทำกลับมาคือการเพิ่ม ELPA ให้กับload-pathแต่นั่นเป็นเพียงส่วนย่อยของสิ่งที่ package.el ทำ ฉันไม่แน่ใจว่าทำไมคุณถึงทำเช่นนั้น แต่ไม่ใช่การตั้งค่าที่ฉันแนะนำ

โดยเฉพาะคุณจะไม่ได้รับ autoloads ของแพ็คเกจด้วยวิธีการของคุณซึ่งหมายความว่าในตอนแรกจะไม่มีคำสั่งจากแพ็คเกจใด ๆ ให้ใช้งาน

กล่าวอีกนัยหนึ่งM-xจะเสนอเฉพาะคำสั่งในตัวเท่านั้น ในการเพิ่มคำสั่งจากแพ็คเกจของคุณคุณจะต้องเพิ่ม:commandsคำจำกัดความที่ชัดเจนลงในการประกาศทั้งหมดของคุณuse-packageซึ่งมีจำนวนมากในการบำรุงรักษา - โดยเฉพาะอย่างยิ่งสำหรับแพ็คเกจขนาดใหญ่เช่น Magit - เพื่อผลประโยชน์เป็นศูนย์โดยหลัก - package.el .


การรวมuse-packageกับ package.el นั้นง่ายมาก - การตั้งค่าทั้งหมดนั้นขึ้นอยู่กับชุดค่าผสมนี้ - แต่มันจะดีกว่ามากถ้าให้ package.el ทำงานจริง เพียง initialise package.el ที่จุดเริ่มต้นของไฟล์ init ของคุณ:

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

เพื่อความสะดวกคุณอาจต้องการ bootstrap ในภายหลังuse-packageหากยังไม่ได้ติดตั้ง:

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

ปล่อยให้เรื่องนี้เป็นคุณเริ่มเซสชัน Emacs บนระบบสดและ init.el use-packageของคุณจะติดตั้งโดยอัตโนมัติ

ท้ายที่สุดคุณต้องโหลดuse-package:

(eval-when-compile
  (require 'use-package))

ตอนนี้คุณสามารถใช้use-packageเพื่อติดตั้งและกำหนดค่าแพ็คเกจ:

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

เมื่อ Emacs ประเมินฟอร์มนี้ในระหว่างการเริ่มต้นuse-packageจะตรวจสอบว่า Magit ติดตั้งอยู่แล้วและติดตั้งโดยอัตโนมัติหากจำเป็น


3
"ฉันไม่แน่ใจว่าทำไมคุณถึงทำอย่างนั้น": เหตุผลเดียวที่ฉันเห็นคือเกี่ยวกับเวลาเริ่มต้น: package-initializeใช้เวลาในการเติมเส้นทางกำหนด autoloads และทำสิ่งที่เหลือ ผมคิดว่าผมอ่านบางที่จอน Wiegley ตัวเอง (ผู้เขียนuse-package) ชอบประกาศคำสั่ง autoloaded ทั้งหมดในบทมากกว่าอาศัยuse-package package.el
FrançoisFévotte

ครั้งสุดท้ายที่ฉันดูเขาไม่ได้ใช้ package.el เลยและในกรณีใด ๆ ฉันไม่คิดว่าคุณจะได้รับมาก คุณจำเป็นต้องเติมload-pathและเพิ่ม autoloads ในทั้งสองกรณีไม่ว่าจะผ่านหรือผ่านทางuse-package package.elฉันสงสัยว่ามีความแตกต่างที่วัดได้โดยเฉพาะอย่างยิ่งถ้าคุณมีระบบที่ทันสมัยพร้อมดิสก์ที่รวดเร็ว
Lunaryorn

3
ตกลง ฉันทำเวลาเอง ด้วยดิสก์ที่รวดเร็วคุณจะไม่เห็นความแตกต่างมากนัก ด้วยดิสก์ช้าเริ่มต้นที่สามารถเห็นได้ชัดช้า (บางอย่างเช่น 0.2s) กับกว่ารายการที่กำหนดเองในpackage-initialize load-pathฉันคุณลักษณะนี้เพื่อ "สำรวจ" ของระบบไฟล์ที่package.elทำ อย่างไรก็ตามฉันไม่เคยวัดความแตกต่างอย่างมีนัยสำคัญระหว่างประสิทธิภาพในการโหลดautoloadคำจำกัดความจากไฟล์และมีอยู่ในuse-packagestanzas
FrançoisFévotte

ฉันจะไม่บอกว่าฉันปิดการใช้งานpackage.elระบบฉันจะบอกว่าฉันปิดการใช้งานเท่านั้นpackage-initialize! เหตุผลก็คือในขณะที่ฉันต้องการlist-packagesเรียกดูแพ็คเกจใหม่และเป็นพิเศษเพื่ออัปเดตแพ็คเกจที่ติดตั้งอยู่ในปัจจุบันทั้งหมดของฉันฉันคิดว่าฉันชอบโหลดเป้าหมายuse-packageมาก สำหรับฉันที่มี autoloads เฉพาะสำหรับคำสั่งฉันใช้เสียงเหมือนสิ่งที่ดี!
โอมาร์

1
@ OmarAntolín-Camarena ทำไมล่ะ? Autoloads นั้นเป็นส่วนต่อประสานสาธารณะของแพ็คเกจที่ผู้ใช้พบเจอและเนื่องจาก package.el กลายเป็นวิธีมาตรฐานในการกระจายแพคเกจที่เราสามารถพึ่งพาได้
Lunaryorn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.