अपने सभी आश्रितों सहित एक Homebrew पैकेज को अनइंस्टॉल / हटा दें


339

मेरे पास एक Homebrew सूत्र है जो मैं अपनी सभी निर्भरताओं के साथ अनइंस्टॉल / रिमूव करना चाहता हूं, स्किपिंग पैकेज जिन्हें अन्य पैकेज निर्भर करते हैं ( पैकेज मैनेजर पार्लेंस में उर्फ कैस्केडिंग पैकेज हटाने )।

उदाहरण के लिए अनइंस्टॉल पैकेज aजो पैकेजों पर निर्भर करता है bऔर c, जहां पैकेज पैकेज पर dभी निर्भर करता है c। परिणाम की स्थापना रद्द करना चाहिए दोनों aऔर b, लंघन c

मैं उसे कैसे कर सकता हूँ?

अनावश्यक जंक को पीछे छोड़े बिना पैकेज को अनइंस्टॉल करने का एक तरीका होना चाहिए ।


3
क्या यह कोई भी पैकेज मैनेजर नहीं है, जो इस नाम के लायक है, आउट-ऑफ-द-बॉक्स करना चाहिए ?! LOL
mljrg

जवाबों:


407

संपादित करें:

ऐसा लगता है कि इस मुद्दे को अब एक बाहरी आदेश का उपयोग करके हल किया जाता है जिसे brew rmdepsया कहा जाता हैbrew rmtree

स्थापित करने और उपयोग करने के लिए, निम्नलिखित आदेश जारी करें:

$ brew tap beeftornado/rmtree
$ brew rmtree <package>

अधिक जानकारी और चर्चा के लिए उपरोक्त लिंक देखें।


मूल उत्तर:

ऐसा प्रतीत होता है कि वर्तमान में, इसे पूरा करने का कोई आसान तरीका नहीं है।

हालाँकि, मैंने Homebrew के GitHub पेज पर एक समस्या दर्ज की , और किसी ने एक अस्थायी समाधान का सुझाव दिया जब तक कि वे इसे हल करने के लिए एक विशेष कमांड नहीं जोड़ते।

एक बाहरी कमांड है जिसे brew leavesसभी पैकेज प्रिंट करते हैं जो अन्य पैकेजों की निर्भरता नहीं हैं।

यदि आप एक तार्किक और के उत्पादन पर brew leavesऔर brew deps <package>, आप बस अनाथ निर्भरता संकुल की एक सूची प्राप्त कर सकते हैं, जिसे आप बाद में मैन्युअल रूप से अनइंस्टॉल कर सकते हैं। इसके साथ मिलाएं xargsऔर आपको वह मिलेगा जो आपको चाहिए, मुझे लगता है (अप्रकाशित, इस पर भरोसा मत करो)।


संपादित करें: किसी ने केवल एक समान समाधान सुझाया, joinइसके बजाय इसका उपयोग कर रहा है xargs:

brew rm FORMULA
brew rm $(join <(brew leaves) <(brew deps FORMULA))

अधिक जानकारी के लिए ऊपर उल्लिखित मुद्दे पर टिप्पणी देखें ।


4
दूसरी पंक्ति में कोई त्रुटि देता है: This command requires a keg argument
श्मिट

7
थर्ड पार्टी brew rmtreeस्क्रिप्ट अब एक टैप में उपलब्ध है:brew tap beeftornado/rmtree && brew install beeftornado/rmtree/brew-rmtree
निक मैक्किर्डी

1
@NicolasMcCurdy मैंने कोशिश की है और यह पुष्टि कर सकता है कि वास्तव में आजकल सबसे अधिक आश्वस्त तरीका है।
ओरी बैंड

1
brew rm $(join <(brew leaves) <(brew deps FORMULA))काम अच्छी तरह से करता है। आपको बस इसे बार-बार चलाना होगा जब तक कि सभी निर्भरताएं दूर नहीं हो जातीं। यह सब कुछ एक बार में अनइंस्टॉल नहीं कर सकता क्योंकि निर्भरताएं एक-दूसरे पर निर्भर हैं।
ग्रेग वैंग

1
&& brew install brew-rmtreeनहीं रह गया है आवश्यक है।
बोरिस

34

यहां लक्ष्य किसी अन्य पैकेज की निर्भरता को तोड़े बिना दिए गए पैकेज और उसकी निर्भरता को दूर करना है। मैं इस कमांड का उपयोग करता हूं:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | xargs brew install

नोट: @ अल्फ़ागॉड की सहायक टिप्पणी को प्रतिबिंबित करने के लिए संपादित।


--ignore-dependenciesयह काम करने की अनुमति देने के लिए हटाने के लिए जोड़ना पड़ा ।
अल्फाडॉग डिस

2
इसने मेरा काढ़ा विन्यास तोड़ दिया, क्योंकि यह अन्य पैकेजों में उपयोग किए जाने वाले डिपों को फिर से स्थापित नहीं करता था। मत का प्रयोग करें
मार्को पैपलार्डो

25

brew rmtree बिल्कुल काम नहीं करता है । उस मुद्दे के लिंक से मुझे rmrec मिला जो वास्तव में काम करता है। भगवान जानता है कि brewयह एक देशी आदेश के रूप में क्यों नहीं है।

brew tap ggpeti/rmrec
brew rmrec pkgname

वास्तव में यह प्यार करता है, हालांकि यदि आपने पहले से ही अपने आप को अनइंस्टॉल करने का रास्ता शुरू कर दिया है और आपको अधिक पैकेज खोजने की आवश्यकता है, तो आपको अभी भी यह जानना होगा कि सबसे व्यापक स्पर्श पैकेज क्या हैं, या आप बस संक्षिप्त रूप से फिर से इंस्टॉल कर सकते हैं [FORMULA]और फिर rmrec का उपयोग कर सकते हैं पुनरावर्ती रूप से यह सब निर्भरताएँ ठीक से हटा दें।
ड्रैगन 788

2
कैविएट: यह भी प्रतीत होता rmrecहै कि वर्तमान में नामांकित पैकेजों को बहुत अच्छी तरह से संभालना नहीं है। मैं किसी ऐसी चीज़ का उपयोग कर रहा था जो अंदर खींची गई थी linuxbrew/xorg/xorgऔर उसने उस पैकेज को छोड़कर सबकुछ हटा दिया और उस पैकेज का नामकरण भी स्पष्ट रूप से कर दिया जो उसे हल नहीं कर सका और कुछ भी नहीं किया।
ड्रैगन

पुष्टि की कि उपयोग करने की सिफारिश rmrecखराब है। यह निर्भरता को बिल्कुल भी नहीं संभालता है।
ओमदेव

आपका मतलब है rmtree? rmrecनिर्भरता को संभालता है।
टिम्मम

1
God knows why brew doesn't have this as a native command.=> क्योंकि काढ़ा डेवलपर्स बुरा दृष्टिकोण है। वे लोगों को किसी भी मुद्दे को खोलने की अनुमति नहीं देते हैं। Github.com/Homebrew/brew की जांच करें , इसमें केवल 20 से कम मुद्दे हैं। इतनी कम संख्या। क्या वह अच्छी चीज़ है? नहीं, यह बहुत बुरा है।
sgon00

15

@Jfmercer जवाब के आधार पर (सुधार एक टिप्पणी से अधिक की जरूरत है)।

पैकेज की निर्भरता निकालें (पैकेज नहीं हटाएं):

brew deps [FORMULA] | xargs brew remove --ignore-dependencies

पैकेज निकालें:

brew remove [FORMULA]

लापता पुस्तकालयों को पुनर्स्थापित करें:

brew missing | cut -d: -f2 | sort | uniq | xargs brew install

MeldMerge रिलीज कीmeld खोज के बाद अनइंस्टॉल किया गया परीक्षण ।


मैंने काढ़ा के साथ ffmpeg स्थापित किया था, जिसने चीजों को गंभीर रूप से गड़बड़ कर दिया। ऊपर वर्णित विधि के साथ निर्भरता की अपनी विस्तारित सूची सहित ffmpeg की सफाई, मेरे लिए काम किया।
वेबवॉकर्स

13

इस उत्तर का उपयोग करने के लिए आवश्यक है कि आप एक फाइल बनाएं और बनाए रखें जिसमें आपके सिस्टम पर आपके द्वारा स्थापित पैकेज नाम हों। यदि आपके पास पहले से कोई नहीं है, तो निम्न कमांड का उपयोग करें और उन पैकेज नामों को हटा दें जिन्हें आप इंस्टॉल नहीं करना चाहते हैं।

brew leaves > brew_packages

फिर आप निम्न आदेश को चलाकर सभी स्थापित, लेकिन अवांछित पैकेज और किसी भी अनावश्यक निर्भरता को हटा सकते हैं

brew_clean brew_packages

brew_cleanयहाँ उपलब्ध है: https://gist.github.com/cskeeters/10ff1295bca93808213d

इस स्क्रिप्ट को वे सभी पैकेज मिलते हैं जो आप brew_packages और उनके सभी आश्रितों में निर्दिष्ट करते हैं और उनकी आउटपुट के खिलाफ तुलना करते हैं brew listऔर अंत में उपयोगकर्ता के साथ इस सूची को सत्यापित करने के बाद अवांछित पैकेजों को हटा देते हैं।

इस बिंदु पर यदि आप पैकेज को निकालना चाहते हैं a, तो आप बस इसे brew_packages फ़ाइल से हटा दें फिर चलाएँ brew_clean brew_packages। इसे हटा देंगे b, लेकिन नहीं c


मुझे लगता है कि काढ़ा साफ-सुथरा बनाया गया है, अब कोशिश करेंbrew clean -s
डेविन जी रोड

1
ABOVE COMMENT WAS WRONG, संपादन 5 मिनट में कट जाता है। कोशिश करेंbrew cleanup -s && brew cask cleanup
डेविन जी रोड

5

आप इसके लिए बस एक यूनिक्स पाइप का उपयोग कर सकते हैं

brew deps [FORMULA] | xargs brew rm

12
यह एक अच्छा समाधान नहीं है। आप इस तरह से अन्य पैकेजों की निर्भरता को तोड़ सकते हैं।
ओरी बैंड

12
एक आदेश है जिसे आप बाद में चलाने के लिए कह सकते हैं यदि आपने किसी अन्य आवश्यक निर्भरता brew missingको
नाकाम कर दिया है

4

निम्नलिखित स्क्रिप्ट को काढ़ा-पर्ज के रूप में सहेजें

#!/bin/bash
#:Usage: brew purge formula
#: 
#:Removes the package and all dependancies.
#: 
#: 
PKG="$1"
if [ -z "$PKG" ];then
   brew purge --help
   exit 1
fi
brew rm $PKG
[ $? -ne 0 ] && exit 1
while brew rm $(join <(brew leaves) <(brew deps $PKG)) 2>/dev/null
  do :
done
echo Package $PKG and its dependancies have been removed.
exit 0

अब इसे निम्नलिखित कमांड के साथ स्थापित करें

sudo install brew-purge /usr/local/bin

अब इसे चलाएं

brew purge package

उदाहरण gpg का उपयोग करते हुए

$ brew purge gpg
Uninstalling /usr/local/Cellar/gnupg/2.2.13... (134 files, 11.0MB)
Uninstalling /usr/local/Cellar/adns/1.5.1... (14 files, 597.5KB)
Uninstalling /usr/local/Cellar/gnutls/3.6.6... (1,200 files, 8.9MB)
Uninstalling /usr/local/Cellar/libgcrypt/1.8.4... (21 files, 2.6MB)
Uninstalling /usr/local/Cellar/libksba/1.3.5... (14 files, 344.2KB)
Uninstalling /usr/local/Cellar/libusb/1.0.22... (29 files, 508KB)
Uninstalling /usr/local/Cellar/npth/1.6... (11 files, 71.7KB)
Uninstalling /usr/local/Cellar/pinentry/1.1.0_1... (12 files, 263.9KB)
Uninstalling /usr/local/Cellar/libassuan/2.5.3... (16 files, 444.2KB)
Uninstalling /usr/local/Cellar/libtasn1/4.13... (59 files, 436KB)
Uninstalling /usr/local/Cellar/libunistring/0.9.10... (54 files, 4.4MB)
Uninstalling /usr/local/Cellar/nettle/3.4.1... (85 files, 2MB)
Uninstalling /usr/local/Cellar/p11-kit/0.23.15... (63 files, 2.9MB)
Uninstalling /usr/local/Cellar/gmp/6.1.2_2... (18 files, 3.1MB)
Uninstalling /usr/local/Cellar/libffi/3.2.1... (16 files, 296.8KB)
Uninstalling /usr/local/Cellar/libgpg-error/1.35... (27 files, 854.8KB)
Package gpg and its dependancies have been removed.
$ 

2

अन्य उत्तर मेरे काम नहीं आए, लेकिन ऐसा किया ( fishशेल में):

brew remove <package>
for p in (brew deps <package>)
    brew remove $p
end

क्योंकि brew remove $pकुछ अन्य पैकेज पर निर्भर करता है जब विफल रहता है p


2

एक और-पूरा बॉर्न शेल फंक्शन

कई अच्छे उत्तर पहले से ही हैं, लेकिन कुछ पुराने हैं और उनमें से कोई भी पूरी तरह से पूरा नहीं है। विशेष रूप से, उनमें से अधिकांश निर्भरताएं दूर कर देंगे लेकिन फिर भी मूल रूप से लक्षित फार्मूला को हटाने के लिए इसे आप पर छोड़ देंगे। यदि आप एक बार में एक से अधिक फ़ार्मूला अनइंस्टॉल करना चाहते हैं, तो पोस्ट किए गए वन-लाइनर्स काम करने के लिए थकाऊ हो सकते हैं।

यहां एक बॉर्न-संगत शेल फ़ंक्शन (बिना किसी ज्ञात बशीज़) जो सूत्रों की एक सूची लेता है, प्रत्येक की निर्भरता को हटाता है, सूत्र की सभी प्रतियों को निकालता है, और फिर किसी भी लापता निर्भरता को पुनर्स्थापित करता है।

unbrew () {
    local formula
    for formula in "$@"; do
        brew deps "$formula" |
        xargs brew uninstall --ignore-dependencies --force
        brew uninstall --force "$formula"
    done
    brew missing | cut -f2 -d: | sort -u | xargs brew install
}

यह Homebrew 1.7.4 पर परीक्षण किया गया था।

चेतावनियां

यह सभी मानक सूत्रों पर काम करता है जो मैंने परीक्षण किया था। यह वर्तमान में पीपों को संभालता नहीं है, लेकिन न तो यह जोर से शिकायत करेगा यदि आप एक मानक सूत्र (जैसे मैकविम) के रूप में एक ही नाम के साथ एक केक को अनब्रेव करने का प्रयास करते हैं।


1

@Jfmercer के उत्तर को वर्तमान काढ़ा के साथ काम करने के लिए थोड़ा संशोधित किया जाना चाहिए, क्योंकि इसका उत्पादन brew missingबदल गया है:

brew deps [FORMULA] | xargs brew remove --ignore-dependencies && brew missing | cut -f1 -d: | xargs brew install
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.