जाने में स्थानीय पैकेज कैसे आयात करें?


102

मैं जाने और उदाहरण कोड पर काम करने के लिए नया हूं जिसे मैं स्थानीय बनाना चाहता हूं।

मूल main.goआयात विवरण में यह था:

 import (
    "log"
    "net/http"
    "github.com/foo/bar/myapp/common"
    "github.com/foo/bar/myapp/routers"
)

अब मेरे पास commonऔर routersपैकेज है/home/me/go/src/myapp

इसलिए मैंने आयात विवरण को इसमें बदल दिया:

import (
    "log"
    "net/http"
    "./common"
    "./routers"
)

लेकिन जब मैं दौड़ता go install myappहूं तो मुझे ये त्रुटियां मिलती हैं:

can't load package: /home/me/go/src/myapp/main.go:7:3: local import "./common" in non-local package

इसके अलावा, जब मैं उपयोग करता हूं commonऔर routersइसके बजाय ./commonऔर ./routersआयात विवरण में, मुझे मिलता है:

myapp/main.go:7:3: cannot find package "common" in any of:
    /usr/local/go/src/common (from $GOROOT)
    /home/me/go/src/common (from $GOPATH)
myapp/main.go:8:2: cannot find package "routers" in any of:
    /usr/local/go/src/routers (from $GOROOT)
    /home/me/go/src/routers (from $GOPATH)

मैं इसे कैसे ठीक करूं?


5
सभी आयात आयात की परवाह किए बिना "स्थानीय" हैं। विस्तृत विवरण के लिए "गो कोड कैसे लिखें" देखें ।
15

24
@JBB ने दार्शनिक बहसों को एक तरफ रख दिया, जो मुझे चिंतित है कि ऊपर बताई गई समस्या को कैसे हल किया जाए।
कार्लॉम

3
मैं एक दार्शनिक कथन बनाने की कोशिश नहीं कर रहा हूं, मैं सचमुच कह रहा हूं कि आपके स्थानीय फाइल सिस्टम में सभी आयात होते हैं; वहाँ कोई अंतर नहीं है कि वे एक दूरस्थ रेपो से उत्पन्न होते हैं या नहीं। रिश्तेदार रास्तों का उपयोग करने की कोशिश न करें (वे कभी-कभी काम करते हैं, लेकिन हतोत्साहित होते हैं), और "कोड कैसे लिखें" दस्तावेज़ के माध्यम से जाना, विशेष रूप से "कोड संगठन" पर अनुभाग ।
जिम

जवाबों:


70

खैर, मैंने समस्या का पता लगा लिया। मूल रूप से आयात के लिए शुरुआती रास्ता है$HOME/go/src

इसलिए मुझे myappपैकेज के नामों के सामने जोड़ने की जरूरत है, यानी आयात होना चाहिए:

import (
    "log"
    "net/http"
    "myapp/common"
    "myapp/routers"
)

4
प्रोजेक्ट नाम का उपयोग myappकरना एक बुरा विचार है, उदाहरण के लिए यदि आप प्रोजेक्ट का नाम बदलते हैं, तो सभी आयात विफल हो जाएंगे
टॉमस्वायर

9
विकल्प क्या है? गो यह अनुशंसा नहीं करता है कि आप सापेक्ष आयात का उपयोग करें।
सैम होम्स

12
यदि आप प्रोजेक्ट का नाम बदलते हैं, तो निश्चित रूप से सभी आयात विफल हो जाएंगे। प्रोजेक्ट का नाम शायद ही कभी बदलता है।
डेमियन रोश

24
खैर, go1.11 के रूप में आप नए मॉड्यूल सिस्टम का उपयोग कर सकते हैं। go mod init <module_name>और फिर बस import "<module_name>/<pkg_name>"
चीख

हम अपनी .go फ़ाइल में github.com/dgrijalva/jwt-go को कैसे आयात कर सकते हैं? मेरा jwt-go फ़ोल्डर src / github.com / dgrijalva के अंदर है
माणिक ठाकुर

34

यदि आप ऊपर गो 1.5 का उपयोग कर रहे हैं, तो आप वेजिंग सुविधा का उपयोग करने का प्रयास कर सकते हैं। यह आपको अपने स्थानीय पैकेज को वेंडर फ़ोल्डर के तहत रखने और छोटे रास्ते से आयात करने की अनुमति देता है । आपके मामले में, आप अपने सामान्य और राउटर फ़ोल्डर को विक्रेता फ़ोल्डर के अंदर रख सकते हैं ताकि यह ऐसा हो

myapp/
--vendor/
----common/
----routers/
------middleware/
--main.go

और इसे इस तरह आयात करें

import (
    "common"
    "routers"
    "routers/middleware"
)

यह काम करेगा क्योंकि गो $ GOPATH / src के बजाय आपके प्रोजेक्ट के विक्रेता निर्देशिका (यदि इसमें कम से कम एक .go फ़ाइल है) पर शुरू होने वाले पैकेज को देखने का प्रयास करेंगे।

FYI करें: आप वेंडर के साथ और अधिक कर सकते हैं, क्योंकि यह सुविधा आपको अपने स्वयं के प्रोजेक्ट की डायरेक्टरी के अंदर एक पैकेज के लिए "अपनी सभी निर्भरता का कोड" डालने की अनुमति देती है, इसलिए यह हमेशा सभी बिल्ड के लिए समान निर्भरता संस्करण प्राप्त करने में सक्षम होगा। यह अजगर में npm या पाइप की तरह है, लेकिन आपको मैन्युअल रूप से अपनी निर्भरता को प्रोजेक्ट करने के लिए कॉपी करने की आवश्यकता है, या यदि आप इसे आसान बनाना चाहते हैं, तो डैनियल थेफेन्स द्वारा govendor देखने की कोशिश करें

इस सुविधा के बारे में अधिक जानकारी के लिए, यहाँ देखने का प्रयास करें

डैनियल थियोफेन्स द्वारा विक्रेता फ़ोल्डर को समझना और उसका उपयोग करना

लुकास फर्नांडीस दा कोस्टा द्वारा गो निर्भरता प्रबंधन को समझना

मुझे आशा है कि आप या कोई और इसे मददगार पाएंगे


19

आयात पथ आपके $GOPATHऔर $GOROOTपर्यावरण चर के सापेक्ष हैं । उदाहरण के लिए, निम्नलिखित के साथ $GOPATH:

GOPATH=/home/me/go

क्रमशः स्थित पैकेज /home/me/go/src/lib/commonऔर /home/me/go/src/lib/routersआयात किए जाते हैं:

import (
    "lib/common"
    "lib/routers"
)

हां, पहला उदाहरण मेरी गलती थी।
wlredeye

आप टूलींग द्वारा समर्थित नहीं रिश्तेदार पथ से क्या मतलब है?
wlredeye

2
आप ऐसे go installपैकेज नहीं बना सकते जो सापेक्ष आयात का उपयोग करते हैं।
जिमब

मुझे लगता है कि इसकी गलतफहमी यहां है। मेरा मतलब है GOPATH के सापेक्ष। सिर्फ "../../mypackage"
wlredeye

यह उस भाग के संदर्भ में था जो आपने वर्तमान निर्देशिका के सापेक्ष आयात करने के बारे में तय किया था। हां, सभी उपयोगकर्ता आयात के सापेक्ष हैं $GOPATH/src
जिमब

5

स्थानीय पैकेज एक कष्टप्रद समस्या है।

हमारी कंपनी की कुछ परियोजनाओं के लिए हम तय करते हैं कि उप पैकेजों का उपयोग बिल्कुल न करें।

  • $ glide install
  • $ go get
  • $ go install

सारा काम।

कुछ परियोजनाओं के लिए हम सब पैकेज का उपयोग करते हैं, और पूरे रास्ते के साथ स्थानीय पैकेज आयात करते हैं:

import "xxxx.gitlab.xx/xxgroup/xxproject/xxsubpackage

लेकिन अगर हम इस परियोजना को कांटा करते हैं, तो अभी भी उप-पैकेज मूल को संदर्भित करते हैं।

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