क्या जाता है बिल्ड का निर्माण? (go build बनाम go install)


106

न्यू गो प्रोग्रामर अक्सर नहीं जानते या भ्रमित हो जाते हैं कि मूलभूत गो बिल्ड कमांड क्या करता है।

वास्तव में निर्माण go buildऔर go installआदेश क्या करते हैं और वे परिणाम / आउटपुट कहां डालते हैं?


जवाबों:


125

क्या goआदेश करता है कि क्या हम एक "सामान्य" पैकेज के लिए इसे चलाने पर या विशेष के लिए निर्भर करता है "main"पैकेज।

पैकेज के लिए

  • go build  आपके पैकेज का निर्माण करता है और फिर परिणाम बताता है
  • go installतब आपकी निर्देशिका में पैकेज स्थापित करता है $GOPATH/pkg

आदेशों के लिए (पैकेज main)

  • go build  कमांड बनाता है और वर्तमान कार्यशील निर्देशिका में परिणाम छोड़ता है ।
  • go installअस्थायी निर्देशिका में कमांड बनाता है, फिर उसे स्थानांतरित करता है $GOPATH/bin

क्या पास करना है go build?

आप उन पैकेजों को पास कर सकते हैं go build, जिन्हें आप बनाना चाहते हैं। आप .goकिसी एकल निर्देशिका से फ़ाइलों की एक सूची भी पास कर सकते हैं , जिसे तब एकल पैकेज निर्दिष्ट करने वाली स्रोत फ़ाइलों की सूची के रूप में माना जाता है।

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

एक आयात पथ में एक या अधिक "..."वाइल्डकार्ड हो सकते हैं (जिस स्थिति में यह एक पैटर्न है )। ...किसी भी स्ट्रिंग से मेल खा सकता है, उदाहरण के लिए इसके किसी भी सबफ़ोल्डर में होने net/...वाले netपैकेज और पैकेज से मेल खाता है । आदेश

go build ./...

अक्सर वर्तमान फ़ोल्डर में पैकेज का निर्माण करने के लिए उपयोग किया जाता है और सभी पैकेज पीछे हटते हैं। प्रोजेक्ट रूट में जारी किया गया यह आदेश पूर्ण प्रोजेक्ट बनाता है।

पैकेज निर्दिष्ट करने के बारे में अधिक जानकारी के लिए, चलाएँ go help packages

मॉड्यूल के बारे में

गो मॉड्यूल के लिए प्रारंभिक समर्थन गो 1.11 में पेश किया गया था, और गो 1.13 के साथ शुरू होने पर मॉड्यूल डिफ़ॉल्ट हो गया। जब goउपकरण एक फ़ोल्डर से चलाया जाता है जिसमें एक go.modफ़ाइल होती है (या वर्तमान फ़ोल्डर के माता-पिता में से एक), goउपकरण मॉड्यूल-जागरूक मोड में चलता है (विरासत मोड को GOPATH मोड कहा जाता है )।

मॉड्यूल-जागरूक मोड में, GOPATH अब एक बिल्ड के दौरान आयात के अर्थ को परिभाषित नहीं करता है, लेकिन यह अभी भी डाउनलोड की गई निर्भरता (GOPATH / pkg / mod में) और स्थापित कमांड (GOPATH / बिन में, जब तक GOBIN सेट नहीं होता है) को संग्रहीत करता है।

मॉड्यूल का निर्माण करते समय, जो बनाया जाता है वह बिल्ड सूची द्वारा निर्दिष्ट किया जाता है । निर्माण सूची में शुरू में केवल मुख्य मॉड्यूल होता है (निर्देशिका जिसमें goकमांड चलाया जाता है), और मुख्य मॉड्यूल की निर्भरता बिल्ड सूची में जोड़ दी जाती है, पुनरावर्ती (निर्भरता की निर्भरता भी जोड़ दी जाती है)।

अधिक जानकारी के लिए, भागो go help modules


मूल रूप से आप go buildएक जांच के रूप में उपयोग कर सकते हैं कि पैकेज बनाए जा सकते हैं (उनकी निर्भरता के साथ) जबकि go install(स्थायी रूप से) आपके उचित फ़ोल्डर में परिणाम स्थापित करता है $GOPATH

go build यदि सब कुछ ठीक है, तो चुपचाप समाप्त कर देंगे और यदि पैकेज बनाए / संकलित नहीं किए जा सकते हैं तो आपको त्रुटि संदेश देंगे।

जब भी goउपकरण एक पैकेज या बाइनरी स्थापित करता है, तो इसमें जो भी निर्भरताएं होती हैं उन्हें भी स्थापित करता है, इसलिए चल रहा है go installपैकेज भी स्थापित करेगा आपका प्रोग्राम (सार्वजनिक रूप से उपलब्ध, "गेट गेटेबल" पैकेजों पर) स्वचालित रूप से निर्भर करता है।

एक शुरुआत के लिए, गो कोड पृष्ठ कैसे लिखें आधिकारिक पढ़ें ।

goटूल के बारे में अधिक जानकारी : कमांड गो

आप निम्न कमांड चलाकर भी अधिक सहायता प्राप्त कर सकते हैं:

go help build

यह भी ध्यान देने योग्य है कि Go 1.5 के साथ शुरू करने go installसे go build( स्रोत ) द्वारा बनाए गए निष्पादनों को भी हटा दिया जाता है :

यदि If गो इंस्टाल ’(बिना किसी तर्क के, जिसका अर्थ है कि वर्तमान डायरेक्टरी) सफल हो जाता है, यदि मौजूद है तो build गो बिल्ड’ द्वारा लिखी गई निष्पादक को हटा दें। यह एक बासी बाइनरी को पीछे छोड़ने से बचा जाता है ...

सूची को पूरा करने के लिए, go runआपके एप्लिकेशन को एक अस्थायी फ़ोल्डर में संकलित करता है, और उस निष्पादन योग्य बाइनरी को शुरू करता है। जब एप्लिकेशन बाहर निकलता है, तो यह अस्थायी फ़ाइलों को ठीक से साफ करता है।

डेव चेनी के व्हाट से प्रेरित प्रश्न बिल्ड बिल्ड क्या है?


1
अजीब लगता है कि जाओ स्थापित निष्पादन योग्य अद्यतन नहीं करता है अगर इसके समान पहले से स्थापित एक ... यहाँ कोई अंतर्दृष्टि?
स्कॉट स्टेंसलैंड

14

पैकेज के लिए:

go build: आपके पैकेज का निर्माण करता है , फिर परिणाम बताता है

गो 1.10 (Q1 2018) के बाद यह सही नहीं होगा, सीएल 68116 और सीएल 75473 के लिए धन्यवाद । इस धागे को देखें , कि मैं यहां संदर्भ देता हूं।

वास्तव में क्या करते हैं go buildऔर go installकमांड का निर्माण करते हैं

जब भी गो टूल एक पैकेज या बाइनरी स्थापित करता है, तो यह जो भी निर्भरताएं हैं उन्हें भी स्थापित करता है, इसलिए चल रहा स्थापित भी संकुल को स्थापित करेगा आपका प्रोग्राम निर्भर करता है (सार्वजनिक रूप से उपलब्ध, "गेट गेटेबल" संकुल), स्वचालित रूप से।

दरअसल ... नए कैश के अलावाgo install गो 1.10 के साथ भी बदलेगा :

" go install" कमांड अब नामित पैकेजों की निर्भरता ( सीएल 75850 ) स्थापित नहीं करता है

यदि आप " go install foo" चलाते हैं , तो एक ही चीज़ स्थापित हैfoo

इससे पहले, यह अलग था। यदि निर्भरताएँ पुरानी थीं, तो " go install" भी कोई निर्भरता स्थापित करता है।
" go install" के दौरान निर्भरता की निहित स्थापना उपयोगकर्ताओं के लिए बहुत भ्रम और सिरदर्द का कारण बनी, लेकिन वृद्धिशील बिल्ड को सक्षम करने के लिए पहले आवश्यक था।
अब और नहीं।
हमें लगता है कि नए " install what I said" शब्दार्थ अधिक समझ में आएंगे, खासकर जब से यह बग रिपोर्ट से स्पष्ट है कि कई उपयोगकर्ताओं ने पहले ही उनसे उम्मीद की थी।
" go install" के दौरान निर्भरता की स्थापना को मजबूर करने के लिएgo install -i , " go build -i" और " go test -i" के साथ सादृश्य द्वारा नए " " का उपयोग करें

तथ्य यह है कि " go install" किसी भी पुनर्निर्माण निर्भरताओं को स्थापित करने के लिए उपयोग किया जाता है -a, जिसके साथ अक्सर संयोजन का भ्रम होता है , जिसका अर्थ है " force rebuild of all dependencies"।
अब, " go install -a myprog" सभी निर्भरता के पूर्ण पुनर्निर्माण को बाध्य करेगा myprog, साथ ही साथ myprog, लेकिन केवल myprogस्थापित हो जाएगा। (सभी पुनर्निर्माण निर्भरताओं को अभी भी बिल्ड कैश में सहेजा जाएगा, निश्चित रूप से।)
इस मामले को अधिक समझदारी से काम करना विशेष रूप से नई सामग्री-आधारित गतिरोध विश्लेषण के साथ संयोजन में महत्वपूर्ण है, क्योंकि यह निर्भरता के पुनर्निर्माण के अच्छे कारणों को पहले से अधिक बार देखता है। , जिसने "मेरे आश्रितों को क्यों स्थापित किया" भ्रम की मात्रा में वृद्धि हुई होगी।
उदाहरण के लिए, यदि आप " go install -gcflags=-N myprog" चलाते हैं , जो कि संस्थापित करता हैmyprogसंकलक अनुकूलन के साथ बनाया गया है, लेकिन यह अब myprogसंकलक अनुकूलन के बिना मानक पुस्तकालय से संकुल का उपयोग नहीं करता है।


करता है go build, क्या get? मेरी बिल्ड एरर है cannot find package "github.com/spf13/cobra" in any of:…। मुझे नहीं पता कि इसे पाने के लिए कैसे कहना है। क्या मुझे स्पष्ट रूप से प्राप्त करने की आवश्यकता है?
ctrl-alt-delor

@ ctrl-alt-delor गो के किस संस्करण के साथ? क्या आपके प्रोजेक्ट में go.modफ़ाइल है?
VonC

go version go1.11.4 linux/amd64। मैं go.mod के बारे में नहीं जानता। मैं फिर से निर्माण कर रहा हूं https://github.com/cbroglie/mustache/blob/master/cmd/mustache/main.go, यह अजीब है क्योंकि मैंने अभी पूरे पैकेज का निर्माण किया है, और इस उदाहरण को आधार के रूप में उपयोग कर रहा हूं, और मैंने एक और मूल संस्करण बनाया है जो काम किया है (लेकिन इस पुस्तकालय का उपयोग नहीं कर रहा है)। मैं यह नहीं देख सकता कि मूंछें पैकेज के साथ कैसे स्थापित नहीं हुईं।
बजे ctrl-alt-delor

@ ctrl-alt-delor इसलिए cobr को github.com/cbroglie/mustache/tree/master/cmd/mustache/vendor/… नाम दिया गया है । क्या आपका GOPATH ठीक से सेट है?
VonC

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