কীভাবে স্থানীয় প্যাকেজ আমদানি করবেন?


101

আমি যেতে নতুন এবং আমি স্থানীয়করণ করতে চাই এমন একটি উদাহরণ কোড নিয়ে কাজ করছি।

মূল 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)

আমি এটা কিভাবে ঠিক করবো?


4
আমদানির পথ নির্বিশেষে সমস্ত আমদানি "স্থানীয়"। বিস্তারিত ব্যাখ্যার জন্য "কীভাবে গো কোড লিখবেন" দেখুন ।
জিমবি

24
@ জিমবি দার্শনিক বিতর্কগুলি একপাশে রেখে আমি যা উদ্বিগ্ন তা হল উপরে বর্ণিত সমস্যাটি কীভাবে সমাধান করা যায়।
কার্লোম

4
আমি দার্শনিক বক্তব্য দেওয়ার চেষ্টা করছি না, আমি আক্ষরিকভাবে বলছি সমস্ত আমদানি আপনার স্থানীয় ফাইল সিস্টেমে ঘটে; এগুলি কোনও দূরবর্তী রেপো থেকে উদ্ভূত কিনা তা কখনও কোনও পার্থক্য নেই। আপেক্ষিক পাথগুলি ব্যবহার করার চেষ্টা করবেন না (তারা কখনও কখনও কাজ করে তবে নিরুৎসাহিত করা হয়) এবং "কীভাবে লিখুন গো কোড" নথিটি দেখুন, বিশেষত "কোড সংস্থার" বিভাগে ।
জিমবি

উত্তর:


70

ঠিক আছে, আমি সমস্যাটি বুঝতে পেরেছি। মূলত আমদানির জন্য যাত্রা পথ হ'ল$HOME/go/src

সুতরাং আমি কেবল myappপ্যাকেজ নামের সামনে যুক্ত করা প্রয়োজন , অর্থাত:

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

4
প্রকল্পের নামটির মতো ব্যবহার myappকরা একটি খারাপ ধারণা, উদাহরণস্বরূপ আপনি যদি প্রকল্পের নাম পরিবর্তন করেন তবে সমস্ত আমদানি ব্যর্থ হবে
টমসওয়ায়ার

8
বিকল্প কি? গো আপনি সুপারিশ করেন না যে আপনি আপেক্ষিক আমদানি ব্যবহার করুন।
স্যাম হোমস

12
আপনি যদি প্রকল্পের নাম পরিবর্তন করেন তবে অবশ্যই সমস্ত আমদানি ব্যর্থ হবে। প্রকল্পের নাম খুব কমই পরিবর্তিত হয়।
ড্যামিয়েন রোচে

23
ঠিক আছে, go1.11 হিসাবে আপনি নতুন মডিউল সিস্টেমটি ব্যবহার করতে পারেন। go mod init <module_name>এবং তারপর ঠিক import "<module_name>/<pkg_name>"
14:38

কীভাবে আমরা আমাদের .go ফাইলে github.com/dgrijalva/jwt-go আমদানি করতে পারি? আমার jwt-go ফোল্ডারটি src / github.com / dग्रीjalva এর ভিতরে আছে
মানিক ঠাকুর

34

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

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

এবং এটি এইভাবে আমদানি করুন

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

এটি কাজ করবে কারণ গো project GOPATH / src এর পরিবর্তে আপনার প্রকল্পের বিক্রেতা ডিরেক্টরিতে (যদি এতে কমপক্ষে একটি .go ফাইল থাকে) আপনার প্যাকেজটি অনুসন্ধান করার চেষ্টা করবে।

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

এই বৈশিষ্ট্যটি সম্পর্কে আরও জানার জন্য, এখানে দেখার চেষ্টা করুন

ড্যানিয়েল থিওফেনেস দ্বারা বিক্রেতার ফোল্ডারটি বোঝা এবং ব্যবহার করা

লুকাস ফার্নান্দেস দা কোস্টার দ্বারা নির্ভরশীল গোপনীয়তা পরিচালনা সম্পর্কে বোঝা

আমি আশা করি আপনি বা অন্য কেউ এটি সহায়কভাবে খুঁজে পেয়েছেন


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

4
আপনি go installযে প্যাকেজগুলি আপেক্ষিক আমদানি ব্যবহার করতে পারবেন না ।
জিমবি

আমি এখানে এর ভুল বোঝাবুঝি মনে করি। আমি গোপথ সম্পর্কিত mean "../../Mypackage" এর মতো কেবল আপেক্ষিক নয়
wlredeye

এটি বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত আমদানি সম্পর্কে আপনি যে অংশটি স্থির করেছিলেন সে বিষয়ে ছিল। হ্যাঁ, সমস্ত ব্যবহারকারীর আমদানি আপেক্ষিক $GOPATH/src
জিমবি

5

স্থানীয় প্যাকেজটি যেতে যেতে বিরক্তিকর সমস্যা।

আমাদের সংস্থার কয়েকটি প্রকল্পের জন্য আমরা সাব প্যাকেজগুলি মোটেই ব্যবহার না করার সিদ্ধান্ত নিয়েছি।

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

সব কাজ.

কিছু প্রকল্পের জন্য আমরা উপ প্যাকেজগুলি ব্যবহার করি এবং স্থানীয় প্যাকেজগুলি পুরো পথ সহ আমদানি করি:

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

তবে আমরা যদি এই প্রকল্পটি কাঁটাচামচ করি, তবে সাব-প্যাকগুলি এখনও মূলটি উল্লেখ করে।

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