MELPA के माध्यम से स्थापित पैकेज को डाउनग्रेड करने का सबसे आसान तरीका है


22

कभी-कभी, एमईएलपीए से पैकेज अपडेट एमएसीएस के कुछ हिस्से को तोड़ सकता है और जब ऐसा होता है तो मैं पैकेज के पुराने संस्करण का उपयोग करने के लिए वापस लौटने में सक्षम होना चाहता हूं।

अभी, मैं इसे दो तरीकों से कर सकता हूं:

  • मैंने कचरा हटाने के लिए फ़ाइलों को हटाने के लिए emacs सेट किया है और जब मैं पैकेज को अपडेट करता हूं, तो पुराने संस्करण को ट्रैश किया जाता है। मैं पुराने संस्करण को पुनः प्राप्त कर सकता हूं और एक को बदल सकता हूं ~/.emacs.d/elpa

  • कार्यक्षमता को तोड़ने वाले पैकेज के गिथब रेपो पर जाएं, पैकेज के पुराने संस्करण को ~/.emacs.d/elpaलाएं, एक को गिटबब से एक के साथ बदलें, फ़ाइल (एस) को फिर से खोलें।

इन दोनों तरीकों में बहुत सी मैनुअल वर्किंग चीजें शामिल होती हैं। क्या MELPA से स्थापित पैकेज को डाउनग्रेड करने का एक आसान (अधिमानतः स्वचालित) तरीका है?


4
आप केवल ELPA / package.el के माध्यम से नवीनतम संस्करण स्थापित कर सकते हैं, Melpa और Melpa- स्थिर संकुल के पुराने संस्करण भी नहीं रखते हैं। मैन्युअल रूप से एक पैकेज स्थापित करने के लिए, 1) स्रोत कोड 2 डाउनलोड करें) M-x package-install-file। ELPA / package.el के अलावा पैकेज को प्रबंधित करने के अन्य तरीके भी हैं, जैसे कि एल- गेट और क्वेलपा , वे ऐसा लगता है कि वे ELPA के बिना उपयोग किए जा सकते हैं, शायद वे वही कर सकते हैं जो आप चाहते हैं।
xuchunyang

2
यदि आपको इस प्रश्न का सरल , व्यावहारिक जवाब नहीं मिलता है , तो कृपया Emacs को एन्हांसमेंट अनुरोध भेजने पर विचार करें: M-x report-emacs-bug(यह एन्हांसमेंट अनुरोधों के लिए भी है)।
आकर्षित किया

जवाबों:


9

जब आप M-x list-packagesइंटरफ़ेस के माध्यम से अपने पैकेज को अपडेट करते हैं , तो पैकेज की सफल स्थापना के बाद, आपसे पूछा जाएगा कि क्या आप पुराने पैकेज को निकालना चाहते हैं। उन्हें हटाएं नहीं, ताकि वे जगह में रहें और आप बाद में इस इंटरफ़ेस के माध्यम से नए पैकेज को निकाल सकें।

मेरी वर्तमान पैकेज सूची मेरे ~ / .emacs.d / elpa / directory ट्री में स्थापित मैगिट के 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

आप पुराने संस्करणों को बाद में ~सभी अप्रचलित पैकेजों को चिह्नित करने के लिए कुंजी (पैकेज-मेनू-मार्क-अप्रचलित-हटाने के लिए) के साथ साफ कर सकते हैं। एक पुराने संस्करण को हटाने के लिए इसकी लाइन पर जाएं और dउन्हें हटाने के लिए चिह्नित करें दबाएं । आपके द्वारा पैकेजों को चिह्नित करने के बाद आप xहमेशा की तरह कार्यों को निष्पादित करने के लिए उपयोग करेंगे।

में Emacs 25 निशान के लिए सभी संकुल Upgrade कार्यक्षमता स्वचालित रूप से हटाने के लिए सभी पुराने संकुल सेट करता है, और नहीं स्थापित करने के बाद पुष्टि करने के लिए शीघ्र करता है। आपको उन पंक्तियों की तलाश करनी होगी जो एक राजधानी "डी" से शुरू होती हैं, जिसे आप केवल अनमार्क कर सकते हैं (निम्नलिखित मैक्रो के साथ सबसे अच्छा)

निम्नलिखित पंक्तियों से डैश के बाईं ओर कुंजी या कॉर्ड लिखें।

<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) ब्लॉक को अंतहीन रूप से लूप न करने के लिए सफल होना है।


अरे अरे, यह मेरे ईमेक में हटाने के लिए पुष्टि नहीं मांगता है। यह सिर्फ पुराने पैकेज को हटाता है: / मुझे लगता है कि यह 24 emacs में पूछता था? मुझे याद नहीं है
चक्रवर्ती रघुनंदन

वास्तव में। 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। मैं एक संस्करण लॉकफाइल लिखने और यह सुझाव देता हूं कि हर बार जब आप अपने पैकेजों को अपडेट करते हैं, क्योंकि इससे कभी भी ऐसी स्थिति में आना असंभव हो जाता है जहां एक उन्नयन के बाद आपका ईमैक्स कॉन्फ़िगरेशन टूट गया है और आपको पता नहीं है कि कैसे रिवर्ट करना है। लेकिन आपको ऐसा करने की ज़रूरत नहीं है, अगर आपको किनारे पर जीवन जीना पसंद है।


4

मुझे डाउनग्रेड करने का एक आसान तरीका मिल गया है: अपने स्वयं के मेलपा संग्रह का प्रबंधन करना।

  1. क्लोन मेलो रेपो।
  2. सभी व्यंजनों को हटाने के लिए मेलपा के कस्टम मेलपा आर्काइव विकी पेज का अनुसरण करें ।
  3. आप जिस पैकेज के लिए ग्रेड डाउन करना चाहते हैं, उसकी कमिटमेंट खोजें और पैकेज के लिए उस कमेटी के साथ एक नया नुस्खा बनाएं। (देखें Melpa के रीडमी कैसे प्रतिबद्ध निर्दिष्ट करने के लिए के बारे में)
  4. भागो makeडाउनग्रेड पैकेज का निर्माण करने के
  5. सूची में अपना स्वयं का मेलपा संग्रह जोड़ें, जो एक स्थानीय निर्देशिका हो सकती है package-archives
  6. पैकेज मेनू का उपयोग करके डाउनग्रेड किए गए पैकेज को स्थापित करें। या आप package-pinned-packagesसंग्रह को प्रतिबंधित करने के लिए उपयोग कर सकते हैं जहां से पैकेज डाउनलोड किया जाना चाहिए।

3

बहुत से लोग एलपीए के पैकेज को संस्करण नियंत्रण के लिए प्रतिबद्ध नहीं करते हैं, लेकिन यह एक उदाहरण है कि मेरा मानना ​​है कि आपको ऐसा क्यों करना चाहिए।

यदि यह सब प्रतिबद्ध है तो कुछ भी बदलना तुच्छ है।

ऊपर की स्थिति के आधार पर ईएलपीए पैकेज एक जोखिम है।


लेकिन इसका मतलब है कि मुझे हर बार मुझे पैकेज अपडेट करने के लिए याद रखना होगा। यही तो मैं नहीं चाहता। या क्या कोई ऐसा तरीका है जिससे मैं स्वचालित रूप से चरणबद्ध कर सकता हूं और जब भी मैं पैकेज अपडेट करता हूं तो अपडेट किए गए पैकेजों को प्रतिबद्ध कर सकता हूं?
चक्रवर्ती रघुनंदन

1
मुझे समझ में नहीं आता है कि आप जानबूझकर निर्णय लेने के लिए अपने कॉन्फ़िगरेशन में बदलाव क्यों नहीं चाहते हैं। स्वचालित आवागमन के बारे में, मुझे यकीन है कि स्वचालित किया जा सकता है, लेकिन मेरे पास इसके लिए कोई समाधान नहीं है। हालांकि इस तरह के समाधानों की खोज उत्पादक प्रदान कर सकती है।
फिल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.