एक गो मॉड्यूल के भीतर स्थानीय संकुल तक पहुँचना (1.11 जाना)


81

मैं गो के नए मॉड्यूल सिस्टम की कोशिश कर रहा हूं और स्थानीय पैकेज तक पहुंचने में परेशानी हो रही है। निम्नलिखित परियोजना मेरे गोपाठ के बाहर मेरे डेस्कटॉप पर एक फ़ोल्डर में है।

मेरी परियोजना संरचना इस प्रकार है:

/
  - /platform
      - platform.go
  - main.go
  - go.mod

// platform.go
package platform

import "fmt"

func Print() {
    fmt.Println("Hi")
}

// main.go
package main

import "platform"

func main() {
    platform.Print()
}

go build main.go मुझे बताता है

cannot find module for path platform

2
हाय डेविड, यदि आपको लगता है कि मेरी प्रतिक्रिया आपके प्रश्न का उत्तर देती है तो कृपया इसे उत्तर के रूप में चिह्नित करने पर विचार करें। धन्यवाद!
हालिल कासावक्लिसी

2.3.3 के बाद से मावेन गोलंग प्लगइन स्थानीय मॉड्यूल के साथ काम करने की अनुमति देता है (यह निर्माण के दौरान स्वचालित रूप से स्थानीय पथ जोड़ देता है), आप कुछ उदाहरण github.com/raydac/mvn-golang/tree/master/mvn-golang-
इगोर मजनित् स

जवाबों:


52

मैं आपको दृढ़ता से सुझाव दूंगा कि आप टूलचिन का उपयोग करें जो इन मुद्दों को ध्यान में रखते हैं। Vscode-go प्लगइन के साथ विजुअल स्टूडियो कोड वास्तव में उपयोगी है।

यहां समस्या यह है कि गो को आपके $GOPATH/srcया moduleआयात विवरण के संबंध में सापेक्ष पथ की आवश्यकता होती है । आप जहां हैं, उसके आधार पर GOPATH, आयात पथ में यह भी शामिल होना चाहिए। इस मामले में, आयात विवरण में गो माड्यूल पथ शामिल होना चाहिएgo.mod

GOPATH

मान लें कि आपकी परियोजना यहाँ रहती है:

$GOPATH/src/github.com/myuser/myproject

आपका आयात पथ होना चाहिए:

import "github.com/myuser/myproject/platform"

वीजीओ

मान लें कि आपकी go.mod फ़ाइल है:

module example.com/myuser/myproject

आपका आयात पथ होना चाहिए:

import "example.com/myuser/myproject/platform"

यह धमाकेदार था - गो मॉड्यूल के मामले में - मुझे वीजीओ के पैटर्न का पालन करना है, जहां मैं मॉड्यूल के नाम के साथ आयात विवरण का मार्ग शुरू करता हूं। धन्यवाद!
डेविड एल्श

15
रुको, मैं उलझन में हूँ। यदि मेरा मॉड्यूल मेरे फाइल सिस्टम पर कहीं है, तो मॉड्यूल सिस्टम इसे कैसे खोजता है?
नारफैनटोर

1
यदि आप एक मॉड्यूल के अंदर हैं, तो यह पैकेज आयात पथ और go.modडिस्क पर फ़ाइल के स्थान का उपयोग करके एक ही मॉड्यूल में संकुल पाता है , जब तक कि आयात पथ पूर्ण आयात पथ होते हैं जो मॉड्यूल नाम से शुरू होते हैं (जैसे, import "github.com/my/module/pkg"`) । यदि आप अन्य मॉड्यूल में पैकेज ढूंढना चाहते हैं जो आपकी डिस्क पर कहीं और स्थित हैं, तो वह वह जगह है जहां एक प्रतिस्थापित निर्देश आता है। यह उत्तर मॉड्यूल संरचना और आयात पथ पर अधिक कवर करता है।
ठेठ 182

6
क्यों हर कोई url स्वरूपों का उपयोग करता रहता है? प्रश्न बहुत स्पष्ट था: localmodule / localmodule.go यह है। यहाँ पर githubs और example.com क्यों है?
Holms

@ उत्तर और आपके ऊपर की टिप्पणी इसे समझाती है, लेकिन स्पष्ट करने के लिए, भाषा में आंतरिक पैकेजों का पता लगाने के लिए कोई तंत्र नहीं है, केवल गो उपकरण करता है। गो टूल GOPATH या मॉड्यूल कॉन्फ़िगरेशन (go.mod) पर निर्भर करता है। आप संक्षेप में, अपने स्थानीय पैकेजों को किसी अन्य प्रकार के पैकेज के समान व्यवहार करने के लिए गो टूल्स की क्षमता का उपयोग कर रहे हैं । इस प्रश्न पर कुछ अन्य उत्तर भी देखें।
user4893106 22

115

मुझे यह परिभाषित पहले के modulesसंग्रह हैं packages। Go 11 में, मैं निम्न की तरह गो मॉड्यूल का उपयोग करता हूं :

यदि दोनों पैकेज एक ही परियोजना में हैं, तो आप निम्नलिखित कार्य कर सकते हैं go.mod:

module github.com/userName/moduleName

और आपके अंदर main.go

import "github.com/userName/moduleName/platform"

हालाँकि, यदि वे अलग-अलग मॉड्यूल, यानी अलग-अलग भौतिक पथ हैं और आप अभी भी packagesइस आयात को बिना दूर किए स्थानीय रूप से प्रकाशित करना चाहते हैं , उदाहरण के लिए, आप replaceनिर्देशन का उपयोग करके इसे प्राप्त कर सकते हैं ।

मॉड्यूल नाम दिया github.com/otherModuleऔर platform, जैसा कि आपने इसे कहा है, वहां के अंदर एकमात्र पैकेज है। अपने मुख्य मॉड्यूल go.modमें निम्नलिखित पंक्तियाँ जोड़ें:

module github.com/userName/mainModule

require "github.com/userName/otherModule" v0.0.0
replace "github.com/userName/otherModule" v0.0.0 => "local physical path to the otherModule"

नोट: पथ को मॉड्यूल की मूल निर्देशिका को इंगित करना चाहिए, और पूर्ण या सापेक्ष हो सकता है।

अंदर main.go, जैसा कोई विशेष पैकेज आयात करने के लिए platformसे otherModule:

import "github.com/userName/otherModule/platform"

यहाँ गोलंग मॉड्यूल का एक सौम्य परिचय दिया गया है


3
OMG इस जवाब ने मुझे बहुत मदद की। धन्यवाद :)
अदिस अज़हर

2
मैंने एक go.mod का उपयोग किया है जिसमें केवल प्रतिस्थापित निर्देश है, परियोजना के निर्माण के लिए आवश्यक निर्देश की आवश्यकता नहीं थी।
mh-cbon

1
यह भी अच्छा उदाहरण: forum.golangbridge.org/t/go-module-and-importing-local-package/…
kokemomuke
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.