2016-02-11 9 views
8

मैं होमब्री का उपयोग करने में काफी नया हूं और मैं यह समझने की कोशिश कर रहा हूं कि यह मेरी खुद की परियोजना में कुछ पुस्तकालयों (बूस्ट, जीएसएल, ओपनब्लैस उदाहरण के लिए) का उपयोग करने के लिए कैसे काम करता है।होमब्रू द्वारा बनाई गई/usr/local/opt निर्देशिका क्यों है और क्या इसका उपयोग करना चाहिए?

मुझे समझा गया है कि प्रत्येक फॉर्मूला होमब्रू द्वारा/usr/local/cellar/में स्थापित किया जाता है और फिर usr/local/bin, usr/local/lib, usr/local/include में सिम्लिंक किया जाता है, ऐसा लगता है, ऐसा लगता है केवल-केवल सूत्रों के लिए यह ओएस द्वारा पहले से स्थापित पुस्तकालयों के साथ गड़बड़ नहीं करता है (उदाहरण के लिए सीएफ Understand homebrew and keg-only dependencies)। लेकिन मुझे पता चला कि हर सूत्र एक/usr/स्थानीय/ऑप्ट निर्देशिका से भी जुड़ा हुआ है।

तो मेरा सवाल यह है कि यह/usr/local/opt निर्देशिका (यह अनावश्यक है) क्यों है, और सूत्रों का उपयोग करने के लिए मुझे किस पथ का उपयोग करना है (usr/local/cellar या usr/local/या usr/स्थानीय/मूल रूप से ऑप्ट)?

उत्तर

17

यह फ़ॉर्मूला की सामग्री के लिए पथ प्रदान करता है जो संस्करण उन्नयन में परिवर्तित नहीं होता है।

इस परिदृश्य पर विचार करें: कहें कि आप होमब्रू के साथ libfoo.dylib बनाएं। यह संस्करण 2.0.0 है, और इसलिए यह /usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib पर रहता है। आप इसे किसी अन्य प्रोग्राम से लिंक करना चाहते हैं, ताकि आप -L/usr/local/Cellar/libfoo/2.0.0/lib -lfoo से gcc पास कर सकें। आपका प्रोग्राम संकलित करता है। बाद में, आप libfoo 2.0.1 में अपग्रेड करते हैं और v2.0.0 को हटाते हैं। अब /usr/local/Cellar/libfoo/2.0.0/lib/libfoo.dylib अब मौजूद नहीं है, और आपका प्रोग्राम अब नहीं चलता है, क्योंकि यह गतिशील रूप से libfoo लोड नहीं कर सकता है।

यह ठीक है। libfoo.dylib/usr/local/lib/libfoo.dylib पर भी उपलब्ध है। यह libfoo के नवीनतम संस्करण के लिए एक सिम्लिंक है, इसलिए यह हमेशा मौजूद होना चाहिए। तो आप अपने प्रोग्राम में -L/usr/local/lib -lfoo पास करते हैं और इसे संकलित करते हैं। बाद में आप libfoo 2.0.1 में अपग्रेड करें। कोई समस्या नहीं, क्योंकि /usr/local/lib/libfoo.dylib अभी भी मौजूद है और v2.0.1 प्रतिलिपि को इंगित करता है।

यह बढ़िया है, और होमब्रे थोड़ी देर के लिए उस प्रणाली के साथ अस्तित्व में था। समस्या यह है कि, कुछ सूत्र "keg-only" हैं, इसलिए वे /usr/local से सिम्लिंक नहीं हैं। (आम तौर पर वे केवल इसलिए होते हैं क्योंकि वे एक पुस्तकालय के संस्करण को छाया करते हैं जो ओएस एक्स के साथ जहाजों और ओएस एक्स पुस्तकालयों को सुपरसर्ड्स करने से समस्याएं पैदा हो सकती हैं।) कहें कि आप लाइब्रेरी के केवल एक-एक संस्करण से लिंक करना चाहते हैं। यह /usr/local/lib से सिम्लिंक नहीं है, इसलिए आपको /usr/local/Cellar में स्थापित संस्करण का पूरा पथ देना होगा, जो आपको ऊपर सूचीबद्ध पहली समस्या पर वापस लाता है।

/usr/local/opt इस समस्या को हल करता है। यह के मौजूदा संस्करण के लिए एक जगह प्रदान करता है, सभी सूत्रों को सिम्लिंक होने के लिए, चाहे वे केवल-केवल हैं या नहीं। अब, जब आप अपने प्रोग्राम को संकलित करना चाहते हैं, तो आप -L/usr/local/opt/libfoo/lib -lfoo का उपयोग कर सकते हैं, और आपका प्रोग्राम libfoo के नवीनतम संस्करण से लिंक होगा, भले ही आप इसे अपग्रेड करते हैं और यहां तक ​​कि अगर यह केवल-केवल है।

+0

अपने जवाब के लिए धन्यवाद! (और मुझे इस सवाल को फिर से खोलने में मदद करने के लिए) तो मुझे लगता है कि सबसे सुरक्षित विकल्प हमेशा/usr/local/opt का उपयोग करना है, लेकिन फिर होमब्रे अभी भी गैर-केवल-के लिए सिम्लिंक बनाने के लिए/usr/local/lib का उपयोग क्यों करता है? –

1

बस मिपाडी उत्तर के पूरक के लिए।

एक जिसे उपयुक्त नाम दिया

लगातार स्थानों में फ़ाइलों को संग्रहीत करने लेख '/usr/local/opt' से एक प्रणाली स्वच्छ और पोषणीय रखने का एक महत्वपूर्ण हिस्सा है। अधिकांश लिनक्स सिस्टम पर, पैकेज प्रबंधक का उपयोग कर अधिकांश सॉफ़्टवेयर स्थापित किया जाता है। एक पैकेज प्रबंधक स्थापित फ़ाइलों को ट्रैक करता है, इसलिए यह सॉफ़्टवेयर को कम से कम दुष्प्रभावों के साथ अद्यतन और निकाल सकता है।

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

कुछ सॉफ्टवेयर स्थानीय स्थापना निर्देश प्रदान करते हैं जो को सीधे पैकेज/विशिष्ट निर्देशिका में/usr/local में बनाते हैं। यह अच्छा संगठन को बढ़ावा नहीं देता है, क्योंकि यह पैकेज-विशिष्ट निर्देशिकाओं के साथ यूनिक्स पदानुक्रम निर्देशिकाओं को मिश्रित करता है। पैकेज-विशिष्ट निर्देशिका में सॉफ्टवेयर की स्थापना के पहले से ही कहीं और किया जाता है/opt निर्देशिका में , और इसलिए यह भावना ही परंपराओं का पालन करने के लिए होगा और एक/usr/स्थानीय/opt में स्थानीय रूप से स्थापित पैकेज विशेष निर्देशिका डाल निर्देशिका।

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

स्रोत: Copyright © 2014 Extellisys

संबंधित मुद्दे