कस्टम पैकेज का उपयोग कैसे करें


178

मैं गो में कस्टम पैकेज बनाने और उसका उपयोग करने का प्रयास कर रहा हूं। यह शायद बहुत स्पष्ट है, लेकिन मुझे इस बारे में अधिक जानकारी नहीं मिल सकती है। असल में, मेरे पास एक ही फ़ोल्डर में ये दो फाइलें हैं:

mylib.go

package mylib

type SomeType struct {

}

main.go

package main

import (
    "mylib"
)

func main() {

}

जब मैं प्रयास करता go run main.goहूं, मुझे यह त्रुटि मिलती है:

main.go:4:2: import "mylib": cannot find package

मैंने पहले चलाने की कोशिश की है, go build mylib.goलेकिन यह कुछ भी नहीं कर रहा है (कोई फ़ाइल उत्पन्न, कोई त्रुटि संदेश नहीं)। तो किसी भी विचार मैं यह कैसे कर सकता है?


मैंने GOPATH वैरिएबल सेट नहीं किया, केवल GOROOT।
लॉरेंट

1
पहले go installकी निर्देशिका के तहत चलाएं mylib, और फिर से प्रयास करें।
जो


@ जो, यह अभी भी "गो इंस्टाल" के अंदर काम करके नहीं चल सकता है
hunter_tech

जवाबों:


175

सबसे पहले, "गो कोड कैसे लिखें" दस्तावेज़ को पढ़ना और समझना सुनिश्चित करें

वास्तविक उत्तर आपके "कस्टम पैकेज" की प्रकृति पर निर्भर करता है।

यदि इसका सामान्य उपयोग करने का इरादा है, तो तथाकथित "जीथब कोड लेआउट" को नियोजित करने पर विचार करें । असल में, आप अपने पुस्तकालय को एक अलग-अलग go getपरियोजना बनाते हैं ।

यदि आपका पुस्तकालय आंतरिक उपयोग के लिए है, तो आप इस तरह से जा सकते हैं:

  1. अपनी परियोजना की निर्देशिका के तहत लाइब्रेरी फ़ाइलों के साथ निर्देशिका रखें।
  2. अपनी परियोजना के बाकी हिस्सों में, अपने प्रोजेक्ट के रूट के सापेक्ष अपने पथ का उपयोग करते हुए पुस्तकालय का संदर्भ दें।

प्रदर्शित करना:

src/
  myproject/
    mylib/
      mylib.go
      ...
    main.go

अब, शीर्ष-स्तर में main.go, आप कर सकते हैं import "myproject/mylib"और यह ठीक काम करेगा।


1
यदि मैं src / के तहत एक नया प्रोजेक्ट (myproject2) बनाता हूं, तो मैं mylib कैसे आयात कर सकता हूं?
किरिल

2
@Kiril, आप का मतलब है, आप कैसे mylibकोड में आयात करते हैं myproject2? फिर उत्तर "का उपयोग करके import "myproject/mylib"- विचार यह है कि गो को प्रत्येक निर्देशिका के तहत आयातित रास्तों के लिए खोज करें जो इसे GOPATHपर्यावरण चर से निकालता है (उन्हें" वर्कस्पेस "कहा जाता है), लेकिन यह खोज (सौभाग्य से) पुनरावर्ती नहीं है, इसलिए ऐसे पथ हैं प्रभावी ढंग से उनके संबंधित कार्यक्षेत्रों में "लंगर"।
कोस्टिक्स

4
एक और पढ़ा होगा: "पैकेज के नाम"
कोस्टिक्स

1
आम तौर पर @MatthiasSommer, जो कि एक माइक्रो पैकेज का उपयोग करता है, उस mylib को एक आम पैकेज में निकालकर। सटीक रूप से "उपयोग" कैसे परिभाषित किया गया है, आपके पसंदीदा वर्कफ़्लो पर निर्भर करता है। एंटरप्राइज़-ग्रेड विकास में, आम तौर पर वेंडरिंग का उपयोग किया जाता है, लेकिन हाल के go modघटनाक्रम के साथ, एक मॉड्यूल उत्तर हो सकता है (और go modसाथ ही मॉड्यूल के समर्थन का समर्थन करता है)।
kostix

1
@ लिय्यांग, "आयात किया जाने वाला पैकेज" एक या एक से अधिक गो स्रोत फ़ाइलों के साथ एक निर्देशिका है। जैसा कि ".lib फ़ाइल में पैकेज कैसे बनाया जाता है" और फिर लिब फाइल आयात करें "- यह उत्तर इस बात पर निर्भर करता है कि आप वास्तव में क्या पूछना चाहते हैं। यदि आप संकलन गति से चिंतित हैं, तो डरें नहीं: गो टूलकिन कैश करें सभी प्रति-पैकेज के आधार पर परिणाम बनाते हैं। यदि, इसके बजाय, आप यह पूछना चाहते थे कि क्या द्विआधारी-संकलित पैकेज को संकलित करना और वितरित करना संभव है , तो जवाब नहीं है
कोस्टिक्स

68

इस तरह की फ़ोल्डर संरचना के लिए:

main.go
mylib/
  mylib.go

इसका उपयोग करने का सबसे सरल तरीका है:

import (
    "./mylib"
)

1
यह हाल के संस्करणों में काम नहीं करता है क्योंकि पैकेज नहीं मिलेगा। सही आयात होगा foo/mylib(मेन.गो वाला फ़ोल्डर मानकर foo)।
नीमो

6
@nemo, जाने के नवीनतम संस्करण के साथ, मैं हमेशा "./mylib" का उपयोग करता हूं और यह काम करता है।
लॉरेंट

3
1.2 का उपयोग करना और मैं @ this.lau_
canadadry

8
विदित हो कि इससे go installविराम होता है। यदि आप एक स्टैंडअलोन परियोजना का निर्माण कर रहे हैं जिसे आप चाहते हैं कि लोग डाउनलोड करें और उस go buildपर चलें , तो यह ठीक है - हालांकि, मैं ऊपर उल्लेखित "गितुब कोड लेआउट" को नियोजित करूंगा (भले ही बिटबकेट, या इसी तरह का) यदि आप पूर्ण go installसमर्थन चाहते हैं ।
photoionized

मैं सुझाव देता हूं कि इस तरह का उपयोग न करें। यह तोडफ़ोड़ करेगा। यह "के बारे में समझ में नहीं आता है।" आयात
राजा Jk

6

GitHub पर होस्ट किए गए एक प्रोजेक्ट के लिए, यहां लोग आमतौर पर G करते हैं

github.com/
  laike9m/
    myproject/
      mylib/
        mylib.go
        ...
      main.go

mylib.go

package mylib

...

main.go

import "github.com/laike9m/myproject/mylib"

...

6

मैं एक अनुभवी प्रोग्रामर हूँ, लेकिन, गो वर्ल्ड में काफी नया हूँ! और मुझे लगता है कि मुझे गो को समझने के लिए कुछ कठिनाइयों का सामना करना पड़ा है ... मुझे अपनी इसी समस्या का सामना तब करना पड़ा जब मैंने उप-फ़ोल्डर्स में अपनी गो फ़ाइलों को व्यवस्थित करने की कोशिश की। जिस तरह से मैंने किया:

GO_Directory ($ GOPATH को सौंपा गया)

GO_Directory //the one assigned to $GOPATH
__MyProject
_____ main.go
_____ Entites
_____ Fiboo // in my case, fiboo is a database name
_________ Client.go // in my case, Client is a table name

फ़ाइल MyProject \ Entities \ Fiboo \ Client.go पर

package Fiboo

type Client struct{
    ID int
    name string
}

फ़ाइल MyProject \ main.go पर

package main

import(
    Fiboo "./Entity/Fiboo" 
)

var TableClient  Fiboo.Client

func main(){
    TableClient.ID = 1
    TableClient.name = 'Hugo'

    // do your things here
}

(मैं Ubuntu 16.04 पर गो 1.9 चला रहा हूं)

और याद रखना दोस्तों, मैं गोबी में नौसिखिया हूँ। अगर मैं जो कर रहा हूं वह बुरा है, तो मुझे बताएं!


3

एक अन्य समाधान: $ GOPATH में
जोड़ें src/myproject

फिर import "mylib"संकलन करेंगे।


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