প্যাকেজের নামের একটি তালিকা নির্দিষ্ট করে কীভাবে স্বয়ংক্রিয়ভাবে ইমাস প্যাকেজ ইনস্টল করবেন?


123

আমি packageআমার ইমাস এক্সটেনশানগুলি পরিচালনা করতে ব্যবহার করছি । বিভিন্ন কম্পিউটারে আমার ইম্যাক্স সেটিংস সিঙ্ক্রোনাইজ করার জন্য, আমি .emacsফাইলের মধ্যে প্যাকেজ নামের একটি তালিকা নির্দিষ্ট করার একটি উপায় চাই এবং তারপরে packageপ্যাকেজগুলি স্বয়ংক্রিয়ভাবে সন্ধান এবং ইনস্টল করতে পারতাম, যাতে আমাকে কল করে ম্যানুয়ালি ইনস্টল করার প্রয়োজন হয় না M-x package-list-packages। কিভাবে যে কি?


6
আপনি যদি আপনার কনফিগারেশনটি ইনস্টল করার জন্য প্যাকেজ ম্যানেজারের উপর নির্ভর করে থাকেন তবে আপনি সম্ভবত সঠিক সংস্করণগুলি উল্লেখ করতে চাইবেন (এবং যদি এটি সম্ভব না হয় তবে সংস্করণে নিজেকে নিয়ন্ত্রণ করে রাখুন সবকিছুই বিবেচনা করুন), অন্যথায় লাইব্রেরি আপডেট হওয়ার পরে আপনি সুরক্ষিত থাকেন না এবং শুরু করেন দ্বন্দ্ব।
ফিল্ড করুন

উত্তর:


107
; list the packages you want
(setq package-list '(package1 package2))

; list the repositories containing them
(setq package-archives '(("elpa" . "http://tromey.com/elpa/")
                         ("gnu" . "http://elpa.gnu.org/packages/")
                         ("marmalade" . "http://marmalade-repo.org/packages/")))

; activate all the packages (in particular autoloads)
(package-initialize)

; fetch the list of packages available 
(unless package-archive-contents
  (package-refresh-contents))

; install the missing packages
(dolist (package package-list)
  (unless (package-installed-p package)
    (package-install package)))

7
আমি পছন্দ করি: গ্রহণযোগ্য উত্তর থেকে (বা (ফাইল-উপস্থিত-পি প্যাকেজ-ব্যবহারকারী-দির) (প্যাকেজ-রিফ্রেশ-সামগ্রী))। প্যাকেজটি রিফ্রেশ এখানে প্যাকেজ ইনস্টল করা সিস্টেমে প্রারম্ভকালীন সময় বাড়ায়। যদিও এই উত্তরটির বাকী অংশ নিখুঁত।
rfinz

পরিবর্তনশীল হিসাবে প্রতীকটির মানটি শূন্য: প্যাকেজ-সংরক্ষণাগার-সামগ্রী। আমি কি কোনও উপায় আছে যে আমি .emacs এ একটি তালিকা তৈরি করতে পারি এবং এর মধ্যে সংজ্ঞায়িত একটি ফাংশন ব্যবহার করে তালিকার সমস্ত প্যাকেজ ইনস্টল করতে পারি (ইনস্টল করা থাকলে এড়িয়ে যাও, পুরানো হলে আপডেট করুন) ভিমের জন্য ভান্ডলের মতো le যেহেতু আমি সমস্ত প্যাকেজগুলি এলপা / গিথুবে ঠেলাতে চাই না, তাই প্রতিবারই প্যাকেজ আপডেট হওয়ার পরে আমাকে তা করতে হবে package
কোডিচান

আপনারা কি বোঝায় @rfinz? দেখে মনে হচ্ছে package-refresh-contentsপ্যাকেজটি ইনস্টল না করা হলে কেবল চালানো হবে? (or (file-exists-p package-user-dir))প্যাকেজ ইনস্টল করা আছে কি করে তা কীভাবে ভাল / কীভাবে তা পরীক্ষা করে দেখা যায়?
স্টারটেক

@ স্টারটেক হ্যাঁ আপনি সঠিক! এটি ব্যবহারকারীর প্যাকেজ ডিরেক্টরিটি বিদ্যমান কিনা তা পরীক্ষা করে এবং এটি যদি এটি চালিত হয় না package-refresh-contents। এটি সম্ভবত আপনি প্রথমবার কোনও নতুন কম্পিউটারে ইমাস খুললে চালানো হবে এবং আমি এটির সাথে ভাল আছি। যদি কোনও প্যাকেজের আপডেটের প্রয়োজন হয় যা ম্যানুয়ালি করা যেতে পারে।
rfinz

2
আপনি যদি ইতিমধ্যে ব্যবহার করছেন use-package, আপনি :ensureপ্যাকেজগুলি স্বয়ংক্রিয়ভাবে ইনস্টল করতে কীওয়ার্ডটি ব্যবহার করতে পারেন । package-selected-packagesকাস্টমাইজ বা প্রোগ্রামক্রমে আপনার প্যাকেজ তালিকার অ্যাক্সেসের প্রয়োজন হলে এটিও সেট আপ হয় ।
নিক ম্যাককুরডি

45

প্রোফ্যাটচচের মন্তব্য এবং নীচে উত্তরগুলির ভিত্তিতে:

(defun ensure-package-installed (&rest packages)
  "Assure every package is installed, ask for installation if it’s not.

Return a list of installed packages or nil for every skipped package."
  (mapcar
   (lambda (package)
     ;; (package-installed-p 'evil)
     (if (package-installed-p package)
         nil
       (if (y-or-n-p (format "Package %s is missing. Install it? " package))
           (package-install package)
         package)))
   packages))

;; make sure to have downloaded archive description.
;; Or use package-archive-contents as suggested by Nicolas Dudebout
(or (file-exists-p package-user-dir)
    (package-refresh-contents))

(ensure-package-installed 'iedit 'magit) ;  --> (nil nil) if iedit and magit are already installed

;; activate installed packages
(package-initialize)

2
এটা কি… পার্শ্ব প্রতিক্রিয়া সহ একটি মানচিত্র? আর অলসতার অপব্যবহার করছেন or? কি শান্তি.
প্রোফ্যাশটচ

1
ভাল, mapcপার্শ্ব প্রতিক্রিয়া জন্য। তবে কেন ব্যবহার unlessকরবেন না ?
প্রোপ্যাপাটস

পূর্বে আমি এই কোডটি ব্যবহার করেছিলাম এবং কখনও কখনও এটি "প্যাকেজ ব্লাহ-ব্লাহ ইনস্টলেশনের জন্য পাওয়া যায় না" বলে কিছু অজানা কারণে কাজ করে না (এখানে ব্লে-ব্লাহ সর্বদা তালিকার প্রথম উপাদান)। আমি যদি প্রথম প্যাকেজটি ম্যানুয়ালি ইনস্টল করি তবে সবকিছু ঠিকঠাক কাজ করে তবে এটি কোনও সমাধান নয়। যাইহোক, নিকোলাস ডুডবুইসের উত্তরটি ভাল কাজ করে।
এভিপি

(package-initialize)রেফারেন্সের আগে আমার দরকার ছিলpackage-user-dir
ফ্র্যাঙ্ক হেনার্ড

3
সুতরাং আমরা কোথায় ইনস্টল করতে চান প্যাকেজ তালিকা?
অ্যান্ড্রি দ্রোজডিয়ুক

41

ইমাস 25.1+ স্বয়ংক্রিয়ভাবে কাস্টমাইজেবল package-selected-packagesভেরিয়েবলটিতে ব্যবহারকারী-ইনস্টল করা প্যাকেজগুলির ট্র্যাক রাখবে । package-installকাস্টমাইজ ভেরিয়েবল আপডেট করবে এবং আপনি package-install-selected-packagesফাংশন সহ সমস্ত নির্বাচিত প্যাকেজ ইনস্টল করতে পারবেন ।

এই পদ্ধতির আর একটি সুবিধাজনক সুবিধা হ'ল আপনি package-autoremoveযে প্যাকেজগুলি অন্তর্ভুক্ত নেই তা স্বয়ংক্রিয়ভাবে অপসারণ করতে ব্যবহার করতে পারেন package-selected-packages(যদিও এটি নির্ভরতা সংরক্ষণ করবে)।

(package-initialize)
(unless package-archive-contents
  (package-refresh-contents))
(package-install-selected-packages)

সূত্র: http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html


17

আমি ইমাস প্রিলিওডের জন্য যে কোডটি ব্যবহার করি তা এখানে :

(require 'package)
(require 'melpa)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

(setq url-http-attempt-keepalives nil)

(defvar prelude-packages
  '(ack-and-a-half auctex clojure-mode coffee-mode deft expand-region
                   gist haml-mode haskell-mode helm helm-projectile inf-ruby
                   magit magithub markdown-mode paredit projectile
                   python sass-mode rainbow-mode scss-mode solarized-theme
                   volatile-highlights yaml-mode yari yasnippet zenburn-theme)
  "A list of packages to ensure are installed at launch.")

(defun prelude-packages-installed-p ()
  (loop for p in prelude-packages
        when (not (package-installed-p p)) do (return nil)
        finally (return t)))

(unless (prelude-packages-installed-p)
  ;; check for new packages (package versions)
  (message "%s" "Emacs Prelude is now refreshing its package database...")
  (package-refresh-contents)
  (message "%s" " done.")
  ;; install the missing packages
  (dolist (p prelude-packages)
    (when (not (package-installed-p p))
      (package-install p))))

(provide 'prelude-packages)

আপনি যদি মেলপা ব্যবহার না করে থাকেন তবে আপনার এটির প্রয়োজন হবে না (এবং যদি আপনি melpa.elনিজের load-path(বা মেলপার মাধ্যমে ইনস্টল করা হয়ে থাকে) প্যাকেজ ডিবি প্রতিবার রিফ্রেশ হয় না (কারণ এটি সূচনাটি উল্লেখযোগ্যভাবে কমিয়ে দেবে ) - কেবল যেখানে আনইনস্টল করা প্যাকেজ উপস্থিত রয়েছে।


আপনার উত্তরের ভিত্তিতে, আমি এটিকে কিছুটা সংশোধন করেছি এবং 'লুপ' github.com/slipset/emacs/blob/master/ensure-packages.el
স্লিপ সেটটি

হ্যাঁ, এই উদাহরণটি হওয়া দরকারের চেয়ে সত্যই জটিল। আমি বর্তমানে প্রিলিডে কোডটি ব্যবহার করি তা অনেক সহজ।
বোজিদার বাতসভ

7

কেউ ক্যাসকের কথা উল্লেখ করেনি করেনি, তবে এটি এই কাজের জন্য বেশ উপযুক্ত।

মূলত আপনি ~/.emacs.d/Caskযে প্যাকেজগুলি ইনস্টল করতে চান তার তালিকা তৈরি করুন । উদাহরণ স্বরূপ:

(source melpa)
(depends-on "expand-region")
(depends-on "goto-last-change")
; ... etc

চলমান caskকমান্ড লাইন থেকে আপনার জন্য এই প্যাকেজগুলি ইনস্টল করবে এবং তাদের যে কোনও নির্ভরতা প্রয়োজন।

এছাড়াও, আপনি স্বয়ংক্রিয়ভাবে ইনস্টল করা প্যাকেজগুলি ব্যবহার করে আপডেট করতে পারেন cask update


আমি কিছুক্ষণ ধরে আমার ডটফাইলে কাস্ক ব্যবহার করছি , দুর্দান্ত কাজ করে।
অ্যালাস্টার

একটি করুণ কাস্কটির কাছে পাইথন লাগবে। আমি ভাবছি কোন এলিস্প-বিকল্প আছে কি? (এটি একটি প্যাকেজে রয়েছে; স্পষ্টতই এই পৃষ্ঠার উত্তরগুলি বেনিফিটের প্রয়োজনীয়তা পূরণ করে))
পিটার জারিক

1
পাইথন স্ক্রিপ্টটি ক্যাস্ক-ক্লাইলেলের চারপাশে একটি পাতলা মোড়ক, যা আপনি যদি পছন্দ করেন তবে সরাসরি আবেদন করতে পারেন:/path/to/emacs -Q --script /path/to/cask/cask-cli.el -- [args]
অ্যালেস্টায়ার

মজাদার! এটি ইমাসের অভ্যন্তর থেকে ব্যবহার করা সম্ভব নয় কি? আমার ধারণা এটি এর কারণ এটি একটি ডেভ টুলও, তবে ইমাসকে পরিচালনা করার জন্য এ্যাম্যাক্সের বাইরে কোনও সিএলআইতে পা রাখাটা অস্বাভাবিক।
পিটার জারিক

4

package-installপ্রতীক হিসাবে প্যাকেজের নাম সহ কল করুন । package-installইন্টারেক্টিভভাবে কল করে এবং নামটি সম্পূর্ণ করে আপনি আপনার প্যাকেজগুলির জন্য প্যাকেজের নামগুলি সন্ধান করতে পারেন । কাজpackage-installed-pএটি ইতিমধ্যে ইনস্টল করা হয়েছে কিনা তা আপনাকে জানায়।

উদাহরণ স্বরূপ:

(mapc
 (lambda (package)
   (or (package-installed-p package)
       (package-install package)))
 '(package1 package2 package3))

1
ধন্যবাদ, তবে আমি ত্রুটি পেয়েছি error: Package + + ইনস্টলেশন-এর জন্য উপলব্ধ নয় ` ডায়ার্ড + এমন একটি প্যাকেজ যা আমি আপনার কোড দিয়ে চেষ্টা করেছি।
আরএনএ

নেই dired+ দেখা যখন আপনি চালাতে package-list-packages? আমি বিশ্বাস করি আপনাকে নিজের মধ্যে মার্বেল বা মেলপা যোগ করতে হবে package-archives। যদি তাই হয়, আপনি চালাতে পারেন (package-install 'dired+)?
ataylor

সেক্ষেত্রে, (package-installed-p 'dired+)ফেরত পাঠাবেন tএবং এটি উপরে কোডে এড়ানো হবে।
ataylor

package-installed-pএকা কাজ করে জরিমানা, কিন্তু কোডের পুরো ব্লক না। আমি বেশ কয়েকটি প্যাকেজ চেষ্টা করেছি।
আরএনএ

2
দেখে মনে হচ্ছে নিকোলাস ডুডবাউটের উত্তরটির সমাধানটি সমাধান করবে।
ataylor

4
(require 'cl)
(require 'package)

(setq cfg-var:packages '(
       emmet-mode
       ergoemacs-mode
       flycheck
       flycheck-pyflakes
       monokai-theme
       py-autopep8
       py-isort
       rainbow-mode
       yafolding
       yasnippet))

(defun cfg:install-packages ()
    (let ((pkgs (remove-if #'package-installed-p cfg-var:packages)))
        (when pkgs
            (message "%s" "Emacs refresh packages database...")
            (package-refresh-contents)
            (message "%s" " done.")
            (dolist (p cfg-var:packages)
                (package-install p)))))

(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/") t)
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(add-to-list 'package-archives '("melpa-stable" . "http://stable.melpa.org/packages/") t)
(add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/") t)
(package-initialize)

(cfg:install-packages)

3

আমি এই উত্তরের মত ব্যবহারকারী প্রথমে প্যাকেজগুলি ইনস্টল করতে চান কিনা তা পরীক্ষা করতে পছন্দ করি । এছাড়াও আমি কিছু ইনস্টল করার আগে একবার আমার প্যাকেজ বিষয়বস্তু রিফ্রেশ করছি। আমি নিশ্চিত নই যে এটি সর্বোত্তম উপায় কিনা তবে আমি মনে করি না শীর্ষ উত্তরগুলি আমার জন্য তা করছিল।

(setq required-pkgs '(jedi flycheck cider clojure-mode paredit markdown-mode jsx-mode company))

(require 'cl)

(setq pkgs-to-install
      (let ((uninstalled-pkgs (remove-if 'package-installed-p required-pkgs)))
        (remove-if-not '(lambda (pkg) (y-or-n-p (format "Package %s is missing. Install it? " pkg))) uninstalled-pkgs)))

(when (> (length pkgs-to-install) 0)
  (package-refresh-contents)
  (dolist (pkg pkgs-to-install)
    (package-install pkg)))

1

আমি একটি সমস্যাতে পড়েছি কিছুই যোগ করার পরে ঘটেছে (package-install 'org)মধ্যে .emacs। আমি আপ-টু-ডেট সংস্করণ ইনস্টল করতে চেয়েছিলাম org-modeএবং বিল্ট-ইনটি org-modeবেশ পুরানো।

আমি package-installইমাক্স 25.3.1 থেকে উত্স কোডটি খনন করেছি। প্যাকেজটি ইনস্টল রয়েছে কিনা তা ইতিমধ্যে ফাংশনটি যাচাই করে এবং প্যাকেজটি ইতিমধ্যে ইনস্টল থাকলে এটি ইনস্টল করতে অস্বীকার করে। সুতরাং 10093312 এর(unless (package-installed-p package) ...) উত্তর থেকে চেকটি বাস্তবে অপ্রয়োজনীয়

(defun package-install (pkg &optional dont-select)
  "Install the package PKG.
PKG can be a package-desc or a symbol naming one of the available packages
in an archive in `package-archives'.  Interactively, prompt for its name.

If called interactively or if DONT-SELECT nil, add PKG to
`package-selected-packages'.

If PKG is a package-desc and it is already installed, don't try
to install it but still mark it as selected."
  (interactive
   (progn
     ;; Initialize the package system to get the list of package
     ;; symbols for completion.
     (unless package--initialized
       (package-initialize t))
     (unless package-archive-contents
       (package-refresh-contents))
     (list (intern (completing-read
                    "Install package: "
                    (delq nil
                          (mapcar (lambda (elt)
                                    (unless (package-installed-p (car elt))
                                      (symbol-name (car elt))))
                                  package-archive-contents))
                    nil t))
           nil)))
  (add-hook 'post-command-hook #'package-menu--post-refresh)
  (let ((name (if (package-desc-p pkg)
                  (package-desc-name pkg)
                pkg)))
    (unless (or dont-select (package--user-selected-p name))
      (package--save-selected-packages
       (cons name package-selected-packages)))
    (if-let ((transaction
              (if (package-desc-p pkg)
                  (unless (package-installed-p pkg)
                    (package-compute-transaction (list pkg)
                                                 (package-desc-reqs pkg)))
                (package-compute-transaction () (list (list pkg))))))
        (package-download-transaction transaction)
      (message "`%s' is already installed" name))))

অন্তর্নির্মিত org-modeহিসাবে ইনস্টল হিসাবে গণনা করা হয় এবং package-installELPA থেকে নতুন সংস্করণ ইনস্টল করতে অস্বীকার করে। প্যাকেজ.এল পড়ার কিছু সময় ব্যয় করার পরে, আমি নিম্নলিখিত সমাধানটি নিয়ে এসেছি।

(dolist (package (package-compute-transaction
                  () (list (list 'python '(0 25 1))
                           (list 'org '(20171211)))))
  ;; package-download-transaction may be more suitable here and
  ;; I don't have time to check it
  (package-install package))

এটি কাজ করার কারণ হ'ল package-*পারিবারিক ফাংশনগুলি যুক্তিগুলি হ'ল কিনা এটি প্রতীক বা কোনও package-descঅবজেক্টের ভিত্তিতে ভিন্নভাবে পরিচালনা করে । আপনি কেবল package-installকোনও package-descবস্তুর মাধ্যমে সংস্করণ তথ্য নির্দিষ্ট করতে পারবেন can


0

এখানে আমার, এটি খাটো :)

(mapc
 (lambda (package)
   (unless (package-installed-p package)
     (progn (message "installing %s" package)
            (package-refresh-contents)
            (package-install package))))
 '(browse-kill-ring flycheck less-css-mode tabbar org auto-complete undo-tree clojure-mode markdown-mode yasnippet paredit paredit-menu php-mode haml-mode rainbow-mode fontawesome))

0

এখানে অন্য উপায়।

;; assure every package is installed
(defun ensure-package-installed (&rest packages)
  (let ((user-required-packages
         (seq-remove
          (lambda (package) (package-installed-p package))
          packages)))
    (when user-required-packages
      (package-refresh-contents)
      (dolist (package user-required-packages)
        (package-install package)))))

;; list of packages to install
(ensure-package-installed
 'try
 'which-key)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.