2016-02-18 6 views
17

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

मूल main.go आयात बयान में यह था:

तो मैं इंपोर्ट स्टेटमेंट परिवर्तित
import (
    "log" 
    "net/http" 
    "github.com/foo/bar/myapp/common" 
    "github.com/foo/bar/myapp/routers" 
) 

अब मैं common और /home/me/go/src/myapp

में routers पैकेज की है:

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) 

कैसे मैं इसे ठीक कर सकते हैं?

+2

सभी आयात कर रहे हैं "स्थानीय" आयात पथ की परवाह किए बिना की उम्मीद है। एक विस्तृत स्पष्टीकरण के लिए ["गो कोड कैसे लिखें"] (https://golang.org/doc/code.html) देखें। – JimB

+1

@JimB दार्शनिक बहस को अलग कर रहा है, जो मुझे चिंतित है, ऊपर वर्णित समस्या को हल करने का तरीका है। – Karlom

+1

मैं दार्शनिक बयान देने की कोशिश नहीं कर रहा हूं, मैं सचमुच कह रहा हूं कि * सभी * आयात आपके स्थानीय फाइल सिस्टम में होते हैं; कोई फर्क नहीं पड़ता कि वे रिमोट रेपो से निकले हैं या नहीं। सापेक्ष पथों का उपयोग करने की कोशिश न करें (वे कभी-कभी काम करते हैं, लेकिन निराश होते हैं), और "कोड कोड कैसे लिखें" दस्तावेज़ के माध्यम से जाएं, विशेष रूप से ["कोड संगठन"] पर अनुभाग (https://golang.org/ डॉक/code.html # संगठन)। – JimB

उत्तर

15

:

GOPATH=/home/me/go 

/home/me/go/src/lib/common और /home/me/go/src/lib/routers में स्थित संकुल के रूप में क्रमश: आयात किए जाते हैं। असल में जाओ शुरू करने पथ आयात $HOME/go/src

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

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

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

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

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

+0

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

+0

आप 'इंस्टॉल इंस्टॉल' पैकेज नहीं कर सकते जो रिश्तेदार आयात का उपयोग करते हैं। – JimB

6

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

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

की तरह हो सकता है और इस

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

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

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

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

Understanding and Using Vendor Folder by Daniel Theophanes

Understanding Go Dependency Management by Lucas Fernandes da Costa

मैं तुम्हें या किसी और को खोजने के लिए यह काम आते हुए

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