Go get और go install में क्या अंतर है?


83

goकुछ समय के लिए उपकरण के साथ खेलने के बाद , ऐसा दिखता है go get:

  1. (वैकल्पिक रूप से) डाउनलोड,
  2. संकलन,
  3. और स्थापित करता है

सॉफ्टवेयर का एक टुकड़ा, जबकि go installबस

  1. संकलित
  2. और स्थापित करता है

यह। इस मामले में, go installकमांड का अस्तित्व क्यों है , क्योंकि go getयह इसे उलट देता है?

जवाबों:


79

go installस्थानीय स्तर पर काम करते समय वर्कफ़्लो का हिस्सा है। कहते हैं कि आप एक पुस्तकालय का उपयोग करना चाहते हैं, लेकिन किसी कारण के लिए एक परिवर्तन की आवश्यकता है। तुम करोगे:

  • go get -d library, जो केवल इसे डाउनलोड करता है;
  • डाउनलोड किए गए पैकेज पर परिवर्तन करें;
  • go install library स्थानीय संस्करण को स्थापित करने के लिए।

जहां तक ​​मुझे पता go getहै कि इसे डाउनलोड करने के लिए कोई झंडे नहीं होना चाहिए , तो यह डाउनलोड नहीं करना चाहिए go install

जब आप स्क्रैच से एक नया पैकेज विकसित करते हैं तो उसी वर्कफ़्लो का उपयोग किया जाता है।


1
अच्छा, मुझे लगता है कि मैं समझता हूं कि अब आपके पहले उदाहरण के लिए धन्यवाद। हालाँकि, आपके दूसरे में (खरोंच से एक नया पैकेज विकसित करना) मैं भी उपयोग कर सकता go get ./path/to/local_packageथा, और यह उसी तरह व्यवहार करेगा जैसे कि मैंने इस्तेमाल किया go install ./path/to/local_package, है ना? चूंकि इस मामले में कोई डाउनलोड प्रक्रिया नहीं है।
थियागॉफ़ेक्स

go installआपके लक्ष्य को और अधिक स्पष्ट करता है, लेकिन मुझे लगता है कि दोनों एक ही चीज को प्राप्त करेंगे। मैंने कुछ पैकेजों के साथ परीक्षण किया, जिनमें से घोषित किए गए थे mainऔर वे समकक्ष लग रहे थे। इस आदेश पर डॉक्स की बहुत कमी है।
बोपप्रेह

यहाँ यह कहता है, आपको इसके लिए gcc की आवश्यकता है go getलेकिन इसके लिए नहीं go install। इस विवरण से कैसे संबंधित है?
आंद्रेकेआर

3
मैं इस जवाब से असहमत हूं। आप अपने तीसरे बुलेट पॉइंट के go getबजाय भी उपयोग कर सकते हैं go install, क्योंकि go getलाइब्रेरी को फिर से डाउनलोड नहीं करेंगे (जब तक कि आप जोड़ न दें -u)। आप go getस्क्रैच से लाइब्रेरी लिखते समय भी उपयोग कर सकते हैं । go installपूरी तरह से बेमानी लगता है।
साइमन

34

go get इस क्रम में दो मुख्य बातें हैं:

  • $GOPATH/src/<import-path>आयात पथों में नामित पैकेज (स्रोत कोड) में डाउनलोड और बचत , उनकी निर्भरता के साथ, फिर

  • निष्पादित करता है a go install

-dझंडा ( go get -d) का निर्देश go getसंकुल डाउनलोड करने के बाद बंद करने के लिए; यही कारण है कि यह go getनहीं करने के लिए निर्देश देता हैgo install


अंतर:

go get // सत्यापित करें कि संकुल को डाउनलोड करने की आवश्यकता है, यदि आवश्यक हो तो डाउनलोड करें

go install // संकुल डाउनलोड के साथ भाग को छोड़ दें, बस संकलित करें (यदि कोई संकुल अनुपलब्ध है तो यह एक त्रुटि फेंक देगा)


GOPATHपर्यावरण चर के बारे में

GOPATHवातावरण चर जाओ उपकरणों के द्वारा प्रयोग किया जाता है। इसे सेट get, buildऔर installपैकेज करने में सक्षम होना चाहिए , और यह आपके कार्यक्षेत्र का स्थान निर्दिष्ट करता है। यह गो कोड विकसित करते समय आपके द्वारा सेट किए जाने वाले एकमात्र पर्यावरण चर की संभावना है।

फिर से, GOPATHगो स्थापना को इंगित नहीं करना चाहिए, बल्कि आपके कार्यक्षेत्र को इंगित करना चाहिए।

उदाहरण के लिए, विंडोज पर, यदि आप तय करते हैं कि आपका कार्यक्षेत्र है c:\gowork\, तो आपको GOPATHमूल्य निर्धारित करना होगाc:\gowork

यहाँ छवि विवरण दर्ज करें

आपका स्रोत कोड पर होना चाहिए c:\gowork\src\<some project folder>\और आप चलाने के बाद go getभीतर से कमांड प्रॉम्प्ट पर c:\gowork\src\<some project folder>\आप देखेंगे c:\gowork\bin\और c:\gowork\pkg\बनाया जा रहा।


go installमॉड्यूल-जागरूक सेट-अप में पैकेज डाउनलोड करता है।
बेरकेंट इपेक

2

ध्यान दें कि 1.16 (Q1 2021) जाने से यह अंतर स्पष्ट हो जाएगा, जिसे सीएल 266360 के साथ 40276 अंक के भाग के रूप में लागू किया जाएगा :

go installअब संस्करण प्रत्यय के साथ तर्क स्वीकार करता है (उदाहरण के लिए go install example.com/cmd@v1.0.0)।
यह मॉड्यूल-जागरूक मोड में पैकेज बनाने और स्थापितgo install करने का कारण बनता है , वर्तमान निर्देशिका या किसी भी मूल निर्देशिका में फ़ाइल की अनदेखी करने परgo.mod , यदि कोई है।
यह मुख्य मॉड्यूल की निर्भरता को प्रभावित किए बिना निष्पादक स्थापित करने के लिए उपयोगी है

go installएक संस्करण प्रत्यय के साथ या बिना (जैसा कि ऊपर वर्णित है), अब मॉड्यूल मोड में पैकेज बनाने और स्थापित करने के लिए अनुशंसित तरीका है।

go get-dभवन के पैकेज के बिना वर्तमान मॉड्यूल की निर्भरता को समायोजित करने के लिए ध्वज के साथ उपयोग किया जाना चाहिए , और पैकेज बनाने और स्थापित करने का उपयोग go getपदावनत किया जाता है
एक में भविष्य के रिलीज, -dझंडा हमेशा सक्षम रहेगा


शायद मैं इसके पीछे तर्क नहीं जानता ... लेकिन मैं यह नहीं देखता कि आप एक निर्माण / स्थापना कमांड को क्यों निष्क्रिय करना चाहते हैं। यह मेरे द्वारा देखे गए किसी भी अन्य पैकेज मैनेजर से अलग है
ट्रेवर जेएक्स

@TrevorJex री-रीडिंग github.com/golang/go/issues/40276 , अभी भी एक ही बिल्ड / इंस्टॉल कमांड है go install:। और यह ऐसा करता है, मौजूदा मॉड्यूल संदर्भ की परवाह किए बिना, विशिष्ट संस्करणों पर पैकेज स्थापित करना। पुराने की तुलना में यह एक सुधार है go get
VonC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.