कई फ़ाइलों से मिलकर गो कार्यक्रम को कैसे संकलित करें?


88

मेरे पास एक छोटा सा प्रोग्राम है जिसमें तीन फाइलें शामिल हैं, जो सभी एक ही पैकेज (मुख्य) से संबंधित हैं, लेकिन जब मैं "go build main.go" बनाता हूं तो बिल्ड सफल नहीं होता है। जब यह सिर्फ एक फ़ाइल (main.go) थी तो सब कुछ ठीक चला। अब जब मैंने कोड को अलग करने के लिए कुछ प्रयास किया, तो ऐसा लग रहा है कि कंपाइलर को वह सामान नहीं मिल पा रहा है, जिसे main.go से बाहर निकाल दिया गया था और इन दो अन्य फाइलों में डाल दिया गया था (जो कि main.go जैसी ही डायरेक्टरी में रहते हैं) । जिसके परिणामस्वरूप "अपरिभाषित 'प्रकार'" त्रुटियां होती हैं।

इस प्रोग्राम को कैसे संकलित करें जो कई फाइलों से युक्त है?

जवाबों:


86

नया तरीका ( अनुशंसित ):

कृपया इस उत्तर पर एक नज़र डालें

पुराना तरीका:

मान लीजिए कि आप myprog नामक एक कार्यक्रम लिख रहे हैं:

अपनी सभी फाइलों को इस तरह एक डायरेक्टरी में रखें

myproject/go/src/myprog/xxx.go

फिर myproject/goGOPATH में जोड़ें

और भाग खड़ा हुआ

go install myprog

इस तरह आप myproject / go / src में अन्य पैकेज और प्रोग्राम जोड़ सकते हैं यदि आप चाहते हैं।

संदर्भ: http://golang.org/doc/code.html

(यह डॉक हमेशा नए लोगों द्वारा याद किया जाता है, और अक्सर पहले से बीमार समझा जाता है। इसे गो आईएमआई का सबसे बड़ा ध्यान आकर्षित करना चाहिए)


5
क्यों नहीं / / से छुटकारा पाने के लिए और सिर्फ myproject / src करते हैं?
अलेक्जेंडर मिल्स

भी, मुझे लगता है "जाओ स्थापित Myprog" किसी भी तरह $ GOPATH स्थान में परियोजना स्रोत लिखता है? क्या वह सही है? यदि हां, तो उस स्पष्टीकरण को उत्तर के भाग के रूप में अच्छी तरह समझा जा सकता है
अलेक्जेंडर मिल्स

1
@AlexanderMills केवल छोटी परियोजनाएँ केवल एक तकनीक का उपयोग कर रही हैं।
डेनिस सेगुरेट

2
@ DenysSéguret यकीन नहीं है कि मैं इससे सहमत हूं, लेकिन वैसे भी यह सरल परियोजनाओं के लिए है, आप बस भाग को छोड़ सकते हैं - लोग मान सकते हैं कि गो चीज आवश्यक है और यह नहीं है। आप मुझे बताएं, कौन सा सरल है, गो या नो? :)
अलेक्जेंडर मिल्स

1
मुझे अभी भी समझ नहीं आया कि यह फ़ोल्डर संरचना क्यों है?
मेडो सेप

67

जब आप main.goउदाहरण के लिए कोड को अलग करते हैं more.go, तो आप बस उस फ़ाइल को go build/ go run/ तक पास करते हैं go install

तो अगर आप पहले भाग गए

go build main.go

अब आप बस

go build main.go more.go

अधिक जानकारी के रूप में:

go build --help

कहता है:

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


ध्यान दें कि go buildऔर उस go installसे अलग go runपहले दो राज्य तर्क के रूप में पैकेज के नाम की उम्मीद करते हैं, जबकि बाद वाले को फाइलों की उम्मीद है । हालाँकि, पहले दो भी गो फाइल को स्वीकार करेंगे जैसे कि गो इंस्टाल करता है।

यदि आप सोच रहे हैं: बिल्ड सिर्फ buildपैकेज / फाइलें हैं, installतो आपके GOPATH में ऑब्जेक्ट और बाइनरी फाइल का उत्पादन करेगा, और runआपके प्रोग्राम को संकलित और चलाएगा।


6
यदि आप अधिक से अधिक फ़ाइलों को जोड़ना नहीं चाहते हैं, तो regex का उपयोग करें: go run * .go
NateW

ठीक है धन्यवाद, क्या गो हमेशा केवल एक निष्पादन योग्य फ़ाइल लिखता है? यह निष्पादन योग्य फ़ाइलों को अलग नहीं रखता (जैसे जावा में)?
अलेक्जेंडर मिल्स

@AlexanderMills खिड़कियों के कारण, मुझे लगता है, निक्स का उपयोग करें। या कम से कम।
सेर्गेई गोरलानोव

हाँ, मैं MacOS का उपयोग कर रहा था, लेकिन शायद यह बैश संस्करण 3 है जो कि साला है, मुझे 4 बैश में अपग्रेड करना चाहिए।
अलेक्जेंडर मिल्स

30

तुम भी बस चला सकते थे

go build

अपने प्रोजेक्ट फोल्डर में myproject / go / src / myprog

तब आप केवल टाइप कर सकते हैं

./myprog

अपना ऐप चलाने के लिए


3
आउटपुट एक जाने योग्य वस्तु है, निष्पादन योग्य नहीं है।
user2284570

@ user2284570 chmod +xउस फ़ाइल को चलाने के लिए सिर्फ अनुमति जोड़ें
dalmate

19

1.11+ के बाद से, GOPATH की अनुशंसा नहीं की जाती है, नया तरीका गो मॉड्यूल का उपयोग कर रहा है।

कहते हैं कि आप एक कार्यक्रम लिख रहे हैं simple:

  1. एक निर्देशिका बनाएँ:

    mkdir simple
    cd simple
    
  2. एक नया मॉड्यूल बनाएँ:

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
    
  3. अपनी सारी फाइलें उस निर्देशिका में रखें।

  4. अंत में, चलाएं:

    go run .
    
  5. वैकल्पिक रूप से, आप इसे बनाकर एक निष्पादन योग्य कार्यक्रम बना सकते हैं:

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows
    

अधिक जानकारी के लिए आप पढ़ सकते हैं इस

गो ने 1.11 के बाद से यहां प्रस्तावित मॉड्यूल के लिए समर्थन शामिल किया है। फरवरी 2018 में प्रारंभिक प्रोटोटाइप वीगो की घोषणा की गई। जुलाई 2018 में, मुख्य गो रिपॉजिटरी में संस्करणित मॉड्यूल उतरा। गो 1.14 में, मॉड्यूल समर्थन उत्पादन उपयोग के लिए तैयार माना जाता है, और सभी उपयोगकर्ताओं को अन्य निर्भरता प्रबंधन प्रणालियों से मॉड्यूल में स्थानांतरित करने के लिए प्रोत्साहित किया जाता है।


7

आप उपयोग कर सकते हैं

go build *.go 
go run *.go

दोनों काम भी आप का उपयोग कर सकते हैं

go build .
go run .

5

यह आपकी परियोजना संरचना पर निर्भर करता है। लेकिन सबसे सीधा है:

go build ./... -o ./myproject

फिर दौड़ो ./myproject

मान लीजिए कि आपकी परियोजना संरचना इस तरह दिखती है

- hello
|- main.go

तब आप बस प्रोजेक्ट डायरेक्टरी में जाते हैं और रन करते हैं

go build -o ./myproject

फिर ./myprojectशेल पर चलाएँ ।

या

# most easiest; builds and run simultaneously
go run main.go

मान लें कि आपकी मुख्य फ़ाइल को उप-निर्देशिका में नेस्टेड किया गया है जैसे cmd

- hello
|- cmd
 |- main.go

फिर तुम दौड़ोगे

go run cmd/main.go

3

हाँ! यह बहुत सीधा है और यही वह जगह है जहाँ पैकेज की रणनीति खेल में आती है। मेरे ज्ञान के तीन तरीके हैं। फ़ोल्डर संरचना:

GOPATH / src / github.com/ abc / myproject / अनुकूलक / main.go pkg1 pkg2 चेतावनी: एडॉप्टर में पैकेज मुख्य और सूर्य निर्देशिकाएं शामिल हो सकती हैं

  1. "एडेप्टर" फ़ोल्डर में नेविगेट करें। Daud:
    go build main.go
  1. "एडेप्टर" फ़ोल्डर में नेविगेट करें। Daud:
    go build main.go
  1. GOPATH / src में मुख्य, पैकेज "myproject / अनुकूलक" के सापेक्ष पथ को पहचानें। Daud:
    go build myproject/adapter

exe फ़ाइल उस निर्देशिका में बनाई जाएगी, जिस पर आप वर्तमान में हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.