বিল্ড এ যান: "প্যাকেজটি খুঁজে পাচ্ছেন না" (গোপ্যাথ সেট করা সত্ত্বেও)


139

যদিও আমি GOPATHসঠিকভাবে সেট করেছি, তবুও আমি নিজের প্যাকেজগুলি খুঁজে পেতে "গো বিল্ড" বা "গো রান" পেতে পারি না। আমি কি ভুল করছি?

$ echo $GOROOT
/usr/local/go

$ echo $GOPATH
/home/mitchell/go

$ cat ~/main.go
package main
import "foobar"
func main() { }

$ cat /home/mitchell/go/src/foobar.go
package foobar

$ go build main.go
main.go:3:8: import "foobar": cannot find package

আমি যখন একই সাথে github.com/adonovan/gopl.io/tree/master/ch1/heelorld পেতে যাই তখন একই সমস্যাটির কারণ হ'ল কারণ হ'ল হেলোরওয়ার্ড.গো নামের কোনও ফাইল নেই। প্যাকেজের নাম এবং ফাইলের সাথে মিল রেখে কাজ পান।
কেনি ভ্যান

এটিও হতে পারে যে আপনাকে গো আপগ্রেড করতে হবে। আমার একটি অনুরূপ সমস্যা ছিল যেখানে আমার কাছে মডিউলটি সংজ্ঞায়িত করতে go.mod ব্যবহার করে কোড ছিল। একটি পরীক্ষার মেশিনে আমি কোডটি ডাউনলোড করেছিলাম এবং এটি সংকলনের চেষ্টা করছিলাম তবে গো আমাকে জিওপিএএচএথ সম্পর্কিত সমস্ত ধরণের ত্রুটি দিচ্ছিল এবং মডিউলগুলি সন্ধান করতে অক্ষম ছিল। এটি ছিল গো সংস্করণ 1.7। আমি গো আপগ্রেড করার সাথে সাথে এটি ইস্যু ছাড়াই কাজ করেছে।
কিফেরএজ

একটি আপ-টু-ডেট ব্যাখ্যার জন্য এটি টার্মিনাল টাইপ করুন$ go help gopath
A1rPun

উত্তর:


162

এটি কাজ করে না কারণ আপনার foobar.goউত্স ফাইলটি বলা ডিরেক্টরিতে নেই foobargo buildএবং go installউত্স ফাইল নয় ডিরেক্টরিগুলি মেলানোর চেষ্টা করুন।

  1. $GOPATHএকটি বৈধ ডিরেক্টরিতে সেট করুন , যেমনexport GOPATH="$HOME/go"
  2. সরান foobar.goকরতে $GOPATH/src/foobar/foobar.goএবং বিল্ডিং ঠিক সূক্ষ্ম কাজ করা উচিত।

অতিরিক্ত প্রস্তাবিত পদক্ষেপগুলি:

  1. যোগ $GOPATH/binআপনার টু $PATHদ্বারা:PATH="$GOPATH/bin:$PATH"
  2. উদাহরণস্বরূপ, main.goএকটি সাবফোল্ডারে সরান$GOPATH/src$GOPATH/src/test
  3. go install testআপনার টার্মিনাল $GOPATH/binটাইপ করে কল testকরা যেতে পারে এটিতে এখন একটি এক্সিকিউটেবল তৈরি করা উচিত ।

1
এটি কি বাগ নয়? আমার GOPATH=/usr/local/go-pkgs, তাই গো /usr/local/go-pkgs/src/<package-name>উত্সটি সন্ধান করে তবে go getএটি utsুকিয়ে দেয় /usr/local/go-pkgs/src/gopkg.in/<package-name>। আমাকে কেন ইনস্টল করার পরে আমার সমস্ত প্যাকেজ ম্যানুয়ালি সরানো উচিত? এটা ঠিক নির্বোধ।
জোসিয়াহ

3
go getসাধারণত প্যাকেজগুলি এতে রাখে $GOPATH/src/যদি আপনি কল করেন তবে go get domain.com/path/to/packageএটি শেষ হয়ে যাবে $GOPATH/src/domain.com/path/to/package। আমার ধারণা আপনি কোন প্যাকেজ আনার চেষ্টা করছেন gopkg.in? যদি এটি নির্বিঘ্নে উদ্দেশ্যমূলক আচরণ চালিয়ে যায় এবং আপনার কেবলমাত্র তাদের পুরো নাম দিয়ে আমদানি করা উচিত; যেমন import "gopkg.in/yaml.v1"যেমন এছাড়াও ডক্স বর্ণিত
ফ্যাসমত

1
আহহ, দেখছি। আমার অজ্ঞতা দূর করার জন্য ধন্যবাদ।
জোসিয়াহ

10

সম্পাদনা করুন: যেহেতু আপনি গোপথকে বোঝাতে চেয়েছেন, সুতরাং ফ্যাসম্যাট এর উত্তর দেখুন ( উত্সাহিত )

" আমি কীভাবে আমার প্যাকেজটি সন্ধান করব? " তে উল্লিখিত হিসাবে আপনাকে xxxএকটি ডিরেক্টরিতে একটি প্যাকেজ রাখা দরকার xxx

গো ভাষার বিবরণ দেখুন :

package math

একই PackageNameপাতায় প্যাকেজ প্রয়োগের ফাইলগুলির একটি সেট ।
একটি প্রয়োগের জন্য প্যাকেজের সমস্ত উত্স ফাইল একই ডিরেক্টরিতে থাকতে পারে।

কোড সংগঠন উল্লেখ:

একটি প্যাকেজ আমদানি করে এমন একটি প্রোগ্রাম তৈরি widgetকরার সময় goকমান্ডটি src/pkg/widgetগো- র অভ্যন্তরের অভ্যন্তরীণ সন্ধান করে এবং তারপরে - যদি প্যাকেজ উত্সটি খুঁজে পাওয়া যায় না - এটি src/widgetপ্রতিটি কর্মক্ষেত্রের ক্রম অনুসারে অনুসন্ধান করে।

(একটি "ওয়ার্কস্পেস" আপনার মধ্যে একটি পাথ এন্ট্রি GOPATH: পরিবর্তনশীল আপনার ' src, bin, pkg' হওয়ার জন্য একাধিক পাথকে রেফারেন্স করতে পারে)


(আসল উত্তর)

আপনার " Code / Go " তেও সেট GOPATHকরা উচিত নয় GOROOT, " কীভাবে গো কোড লিখবেন " তে চিত্রিত হয়েছে ।

আমদানির বিবরণী সমাধান করতে গো পাথটি ব্যবহৃত হয়। এটি প্রয়োগ / Go / build প্যাকেজে নথিভুক্ত করা হয়।

GOPATHএনভায়রনমেন্ট ভেরিয়েবল তালিকা কোথায় যাওয়া যেতে কোডের জন্য দেখুন।
ইউনিক্সে, মানটি একটি কোলন-বিভাজিত স্ট্রিং।
উইন্ডোজে মানটি একটি সেমিকোলন-বিচ্ছিন্ন স্ট্রিং।
পরিকল্পনা 9 এ, মানটি একটি তালিকা।

এটি থেকে পৃথক GOROOT:

গো বাইনারি বিতরণগুলি ধরে নিয়েছে যে সেগুলি ইনস্টল করা হবে /usr/local/go(বা c:\Goউইন্ডোজের অধীনে) তবে তাদের আলাদা জায়গায় ইনস্টল করা সম্ভব।
আপনি যদি এটি করেন, GOROOTGo সরঞ্জামগুলি ব্যবহার করার সময় আপনাকে সেই ডিরেক্টরিতে পরিবেশের পরিবর্তনশীল সেট করতে হবে ।


4
গোপথ সেটআপ করার জন্য একটি ছোট ভিডিও পরিচয়ও রয়েছে
উলফ

1
দুঃখিত, আমি মূল প্রশ্নটি সম্পাদনা করেছি। আমি যেখানেই গুরূট বলেছি সেখানেই আমি গোপথকে বুঝিয়েছি
মিচেলসালাদ

3

টিএল; ডিআর: গো কনভেনশন অনুসরণ করুন! (পাঠটি হার্ড পদ্ধতিতে শিখেছে), পুরানো গো সংস্করণগুলির জন্য পরীক্ষা করুন এবং সেগুলি মুছে ফেলুন । সর্বশেষ ইনস্টল করুন।

আমার জন্য সমাধানটি আলাদা ছিল। আমি একটি ভাগ করা লিনাক্স সার্ভারে কাজ করেছি GOPATHএবং আমার এবং অন্যান্য পরিবেশের ভেরিয়েবলগুলি বেশ কয়েকবার যাচাই করার পরেও এটি কার্যকর হয়নি। 'প্যাকেজটি খুঁজে পাচ্ছি না' এবং 'স্বীকৃত আমদানির পাথ' সহ বেশ কয়েকটি ত্রুটির মুখোমুখি হয়েছি। Golang.org- এ নির্দেশাবলী ( আনইনস্টল সহ) এই সমাধানটি দিয়ে পুনরায় ইনস্টল করার চেষ্টা করার পরে অংশ ) এর পরেও সমস্যার সম্মুখীন হয়েছে।

আমাকে কিছু সময় নেয় এখনও একটি পুরোনো সংস্করণ যে আনইনস্টল করা হয়নি (দৌড়ানো যে উপলব্ধি করা go versionতারপর which goআবার ... DAHH) যা আমাকে পেয়েছিলাম এই প্রশ্ন এবং পরিশেষে সমাধান।


2

যদিও গৃহীত উত্তরটি প্যাকেজ নামের সাথে ডিরেক্টরিগুলি মিলানোর প্রয়োজন সম্পর্কে এখনও সঠিক তবে আপনাকে GOPATH ব্যবহার না করে গো মডিউলগুলি ব্যবহার করে সত্যই স্থানান্তর করতে হবে। নতুন ব্যবহারকারী যারা এই সমস্যার মুখোমুখি হন তারা GOPATH (যেমন আমি ছিলাম) ব্যবহারের উল্লেখ সম্পর্কে বিভ্রান্ত হতে পারেন, যা এখন পুরানো are সুতরাং, আমি এই সমস্যাটি পরিষ্কার করার চেষ্টা করব এবং গো মডিউলগুলি ব্যবহার করার সময় এই সমস্যাটি রোধ করার সাথে সম্পর্কিত দিকনির্দেশনা সরবরাহ করব।

আপনি যদি ইতিমধ্যে গো মডিউলগুলির সাথে পরিচিত হন এবং এই সমস্যাটি অনুভব করে থাকেন তবে নীচে আমার আরও সুনির্দিষ্ট বিভাগগুলিতে যান যা নীচে বা ভুলে যাওয়া সহজ যে কয়েকটি গো কনভেনশনগুলি কভার করে।

এই গাইড গো মডিউল সম্পর্কে শেখায়: https://golang.org/doc/code.html

গো মডিউল সহ প্রকল্প সংস্থা

একবার আপনি নিবন্ধে উল্লিখিত গো মডিউলগুলিতে স্থানান্তরিত হওয়ার পরে, বর্ণিত হিসাবে প্রকল্প কোডটি সংগঠিত করুন:

একটি সংগ্রহস্থলে এক বা একাধিক মডিউল থাকে। মডিউলটি সম্পর্কিত গো প্যাকেজগুলির সংকলন যা একসাথে প্রকাশিত হয় are একটি গো সংগ্রহস্থলটিতে সাধারণত কেবলমাত্র একটি মডিউল থাকে যা সংগ্রহস্থলের গোড়ায় অবস্থিত। সেখানে go.mod নামে একটি ফাইল মডিউলটির পথ ঘোষণা করে: মডিউলটির মধ্যে থাকা সমস্ত প্যাকেজের জন্য আমদানি পথের উপসর্গ। মডিউলটিতে ডিরেক্টরিতে প্যাকেজগুলি রয়েছে যার go.mod ফাইলের পাশাপাশি সেই ডিরেক্টরিটির উপ-ডিরেক্টরিগুলি রয়েছে, পরবর্তী govmod ফাইল (যদি থাকে) সহ পরবর্তী সাব-ডিরেক্টরিতে।

প্রতিটি মডিউলটির পাথ কেবল তার প্যাকেজগুলির জন্য আমদানি পথের উপসর্গ হিসাবে কাজ করে না, তবে এটি নির্দেশ করে যে গো কমান্ড এটি ডাউনলোড করতে হবে কিনা। উদাহরণস্বরূপ, golang.org/x/tools মডিউলটি ডাউনলোড করার জন্য, গো কমান্ড https://golang.org/x/tools দ্বারা নির্দেশিত ভাণ্ডারগুলির সাথে পরামর্শ করবে (এখানে আরও বর্ণিত)।

একটি আমদানি পথটি একটি প্যাকেজ আমদানির জন্য ব্যবহৃত একটি স্ট্রিং। একটি প্যাকেজের আমদানি পথ হ'ল মডিউলটির মডিউলটির মধ্যে এটির উপ-ডিরেক্টরিতে যোগ হয় within উদাহরণস্বরূপ, github.com/google/go-cmp মডিউলটি cmp / ডিরেক্টরিতে একটি প্যাকেজ ধারণ করে। এই প্যাকেজের আমদানি পথটি github.com/google/go-cmp/cmp। স্ট্যান্ডার্ড লাইব্রেরিতে প্যাকেজগুলির একটি মডিউল পাথ উপসর্গ নেই।

আপনি এইভাবে আপনার মডিউলটি শুরু করতে পারেন:

$ go mod init github.com/mitchell/foo-app

আপনার কোডটি তৈরি করতে এটির জন্য github.com এ থাকা দরকার নেই। তবে আপনার মডিউলগুলি এমনভাবে গঠন করা সর্বোত্তম অনুশীলন যা সেগুলি শেষ পর্যন্ত প্রকাশিত হবে।

প্যাকেজ পাওয়ার চেষ্টা করার পরে কী হয় তা বোঝা

এখানে একটি দুর্দান্ত নিবন্ধ রয়েছে যা আপনি যখন প্যাকেজ বা মডিউলটি পাওয়ার চেষ্টা করেন তখন কী ঘটে সে সম্পর্কে আলোচনা করে: https://medium.com/rungo/anatomy-of-modules-in-go-c8274d215c16 এটি কোথায় প্যাকেজটি সংরক্ষণ করা হবে এবং কী হবে তা আলোচনা করে আপনি যদি ইতিমধ্যে গো মডিউল ব্যবহার করেন তবে আপনি কেন এই ত্রুটিটি পাচ্ছেন তা বুঝতে আপনাকে সহায়তা করুন।

আমদানি করা ফাংশনটি রফতানি হয়েছে তা নিশ্চিত করুন

মনে রাখবেন যে অন্য কোনও ফাইল থেকে কোনও ফাংশনে অ্যাক্সেস পেতে আপনার যদি সমস্যা হয় তবে আপনার ফাংশনটি রফতানি করা হয়েছে তা নিশ্চিত করতে হবে। আমি সরবরাহ করা প্রথম লিঙ্কে বর্ণিত হিসাবে, একটি ফাংশন রফতানি করতে হবে এবং অন্য প্যাকেজগুলিতে আমদানির জন্য উপলভ্য করতে একটি বড় হাতের অক্ষর দিয়ে শুরু করতে হবে।

ডিরেক্টরি নাম

আর একটি সমালোচনামূলক বিবরণ (যেমন স্বীকৃত উত্তরে উল্লিখিত ছিল) হ'ল ডিরেক্টরিগুলির নামগুলিই আপনার প্যাকেজগুলির নাম নির্ধারণ করে। (আপনার প্যাকেজের নামগুলি তাদের ডিরেক্টরি নামের সাথে মেলে নেওয়া দরকার)) আপনি এর উদাহরণ এখানে দেখতে পাবেন: https://medium.com/rungo/everything-you-need-to- ज्ञान- about- packages- in- go- b8bac62b74cc এর সাথে এটি বলেছিল যে আপনার mainপদ্ধতিযুক্ত ফাইল (অর্থাত আপনার আবেদনের প্রবেশের স্থান) এই প্রয়োজনীয়তা থেকে একরকম ছাড় exe

উদাহরণস্বরূপ, এই জাতীয় কাঠামো ব্যবহার করার সময় আমার আমদানিতে সমস্যা ছিল:

/my-app
├── go.mod
├── /src
   ├── main.go
   └── /utils
      └── utils.go

আমি utilsআমার mainপ্যাকেজে কোডটি আমদানি করতে পারিনি ।

যাইহোক, একবার আমি main.goএটির নিজের উপ-ডিরেক্টরিতে রেখেছি, যেমন নীচে দেখানো হয়েছে, আমার আমদানি ঠিক কাজ করেছে:

/my-app
├── go.mod
├── /src
   ├── /app
   |  └── main.go
   └── /utils
      └── utils.go

এই উদাহরণে, আমার go.mod ফাইলটি দেখতে এমন দেখাচ্ছে:

module git.mydomain.com/path/to/repo/my-app

go 1.14

আমি যখন একটি রেফারেন্স যুক্ত করার পরে main.go সংরক্ষণ করেছি utils.MyFunction(), তখন আমার আইডিই স্বয়ংক্রিয়ভাবে আমার প্যাকেজের রেফারেন্সটি টানছে :

import "git.mydomain.com/path/to/repo/my-app/src/my-app"

(আমি গোলং এক্সটেনশান সহ ভিএস কোড ব্যবহার করছি))

লক্ষ্য করুন যে আমদানির পথে প্যাকেজের সাব-ডিরেক্টরি অন্তর্ভুক্ত রয়েছে।

একটি প্রাইভেট রেপো নিয়ে কাজ করছে

কোডটি যদি কোনও ব্যক্তিগত রেপোর অংশ হয় তবে অ্যাক্সেস সক্ষম করতে আপনাকে গিট কমান্ড চালানো দরকার। অন্যথায়, আপনি অন্যান্য ত্রুটিগুলির মুখোমুখি হতে পারেন এই নিবন্ধটিতে কীভাবে ব্যক্তিগত গিথুব, বিটবাকেট এবং গিটল্যাব রেপোগুলির জন্য এটি করবেন তা উল্লেখ করা হয়েছে: https://medium.com/cloud-native-the-gathering/go-modules-with-private-git- repositories-dfe795068db4 এই সমস্যাটি এখানেও আলোচনা করা হয়েছে: একটি ব্যক্তিগত সংগ্রহস্থল "পেতে" যাওয়ার সঠিক উপায় কী?


-6

আপনি কি আপনার 'পথে' যাওয়ার নিরঙ্কুশ ডিরেক্টরিটি যুক্ত করার চেষ্টা করেছেন ?

export PATH=$PATH:/directory/to/go/

packages PATH এর গো প্যাকেজগুলির জন্য আপনার পথে কিছু করার নেই do
csgeek
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.