গো তে প্যাকেজ আমদানি ব্যবহার করা Using


104

মনে করুন আপনার কাছে একটি সংগ্রহস্থল রয়েছে github.com/someone/repoএবং আপনি এটি কাঁটাচামচ করেন github.com/you/repo। আপনি প্রধান রেপোর পরিবর্তে আপনার কাঁটাচামচ ব্যবহার করতে চান, তাই আপনি একটি করেন

go get github.com/you/repo

এখন এই রেপোর সমস্ত আমদানি পথগুলি "ভাঙ্গা" হয়ে যাবে, অর্থাত্ যদি ভাণ্ডারগুলিতে একাধিক প্যাকেজ থাকে যা পরস্পর URL এর মাধ্যমে একে অপরকে উল্লেখ করে তবে তারা উত্সটি উল্লেখ করবে, কাঁটাচামচ নয়।

এটি সঠিকভাবে ম্যানুয়ালি ক্লোনিং করার মতো আরও ভাল উপায় কি আছে?

git clone git@github.com:you/repo.git $GOPATH/src/github.com/someone/repo

1
নতুন কাঁটাচামড়ার কোনও আমদানির পথটি ভাঙ্গা হবে না যা কাঁটা দেওয়ার আগেই ভাঙ্গা হয়নি।
zzzz

11
আপনাকে হতাশ করার জন্য দুঃখিত, তবে এটি সত্য নয়। যদি কোনও সাব-প্যাকেজটি এর পরম ইউআরএল মাধ্যমে আমদানিতে রেফারেন্স করা হয় তবে এই আমদানিটি কাঁটাচামচ (অথবা কমপক্ষে ভুল প্যাকেজটি রেফারেন্স) ভাঙ্গা হবে।
এরিক অাইনার

2
যেমন গোমজ । এটিতে সমস্ত জায়গায় অভ্যন্তরীণ উল্লেখ রয়েছে।
এরিক অাইনার

1
ec2প্যাকেজ - এটি একটি হয়েছে launchpad.net/goamz/awsআমদানি করুন। উভয়ই awsএবং ec2প্যাকেজগুলি সেম সংগ্রহস্থলে থাকে, তাই যখন কাঁটাচামচ করা হয় তখন সঠিক প্যাকেজটি (কাঁটাচামচের একটি) উল্লেখ করা যায় না।
এরিক অ্যাগনার 21

1
কাঁটাচামচটি কাঁটাচামড়ার উত্স হিসাবে একই প্যাকেজটি উল্লেখ করবে। এতে কী ভুল? কাঁটাচামচ সংকলন করবে, এটি তৈরি করবে, এটি আগের মতোই কাজ করবে। তাহলে 'ভুল প্যাকেজ' এর সংজ্ঞা কী? লক্ষ্য করুন যান ভাষা, তাই তার বিল্ড সিস্টেম হিসাবে রয়েছে কোন ভান্ডার, শুধুমাত্র প্যাকেজ সচেতনতা।
zzzz

উত্তর:


84

টান অনুরোধগুলি পরিচালনা করতে

  • কাঁটাচামচ একটি সংগ্রহস্থলের github.com/someone/repoথেকেgithub.com/you/repo
  • মূল কোড ডাউনলোড করুন: go get github.com/someone/repo
  • সেখানে থেকো: cd "$(go env GOPATH)/src"/github.com/someone/repo
  • আপনার কাঁটাচায় আপলোড সক্ষম করুন: git remote add myfork https://github.com/you/repo.git
  • আপনার পরিবর্তনগুলি আপনার রেপোতে আপলোড করুন: git push myfork

http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html

আপনার প্রকল্পে একটি প্যাকেজ ব্যবহার করতে

https://github.com/golang/go/wiki/PackageManagementTools


কোন ফোল্ডার থেকে আমার করা উচিত git remote add? কাঁটাচামচ থেকে ক্লোন? মূল থেকে ক্লোন? গো ভিতরে থেকে?
ল্যাপটগুলি

1
@ ল্যাপটগুলি মূল রেপোতে কমান্ড চালায় (যেমন $ GOPATH / src / github.com / somone / repo)
উইল 7200

আমি যদি এমন কোনও রেপোতে পরিবর্তন যুক্ত করতে চাই যা দীর্ঘদিন আগে তৈরি হয়েছিল?
এন

61

আপনি যদি গো মডিউল ব্যবহার করছেন । আপনি replaceনির্দেশ ব্যবহার করতে পারেন

replaceডিরেক্টিভের আপনি, অথবা একটি আপেক্ষিক বা পরম ফাইল পাথ সাথে আপনার স্থানীয় ফাইলসিস্টেম আরেকটি আমদানি পথ যে অন্য VCS (GitHub বা অন্যত্র) এ অবস্থিত মডিউল হতে পারে সরবরাহ করতে পারবেন। replaceনির্দেশিকা থেকে নতুন আমদানির পথটি আসল উত্স কোডে আমদানি পথ আপডেট করার প্রয়োজন ছাড়াই ব্যবহার করা হয়।

সুতরাং আপনি নীচে আপনার go.mod ফাইলটিতে করতে পারেন

module github.com/yogeshlonkar/openapi-to-postman

go 1.12

require (
    github.com/someone/repo v1.20.0
)

replace github.com/someone/repo => github.com/you/repo v3.2.1

v3.2.1আপনার রেপোতে কোথায় ট্যাগ রয়েছে। সিএলআইয়ের মাধ্যমেও করা যায়

go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1"

4
দুর্দান্ত কাজ করেছে আমি মনে করি এটির আরও বেশি পরিমাণে না থাকার একমাত্র কারণ হ'ল লোকেরা এখনও গো মডিউল ব্যবহার করছে না। আমি এই কৌশলটি আমার ওয়ার্কস্টেশনের অন্য ডিরেক্টরিতে একটি ফাইলের অবস্থানের দিকে নির্দেশ করার জন্য ব্যবহার করেছি যেখানে আমার স্থানীয় সম্পাদনা ছিল আমি যেখানে কাজ করছি। আমি আমার স্থানীয় সম্পাদনাগুলি গিথুবে একবার চাপলে আমি আমার "প্রতিস্থাপন" লাইনটি সরিয়ে ফেলব।
লাজিবার্ড

^ 100% সম্মত। জনগণকে ভোট দিন।
অ্যান্ড্রু অ্যারো

2
ওহ, তবে "মাস্টার" আমার পক্ষে কাজ করেনি। আমাকে সেখানে v0.0.1 বা কিছু নির্দিষ্ট সংস্করণ লিখতে হয়েছিল।
অ্যান্ড্রু অ্যারো

1
এছাড়াও, আপনি go mod edit -replace সরাসরি কমান্ড লাইন করুন: go mod edit -replace="github.com/someone/repo@v0.0.0=github.com/you/repo@v1.1.1"। দুটোই al @v...চ্ছিক।
জোয়েল পুররা

স্থানীয় উন্নয়নের জন্য আমদানির পথটি প্রতিস্থাপন করা go.mod.localবা go.mod.devযার ভূমিকা আসলে তা কি শীতল হবে না ? আমি বলতে চাইছি আপনি কুৎসিত "প্রতিস্থাপন" মুছে ফেলতে কখনই ভুলবেন না কারণ আপনার দরকার নেই।
ম্যানুয়েল

21

এটির সমাধানের একটি উপায় হ'ল ইভান রেভ এবং http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html - কাঁটাচলার উপায় suggested

আর একটি হ'ল গোলং আচরণকে ঘিরে । আপনি যখন go get, গোলং আপনার ডিরেক্টরিগুলি সংগ্রহস্থল ইউআরআই-এর মতো একই নামে রাখে এবং এখান থেকেই সমস্যা শুরু হয়।

পরিবর্তে, আপনি যদি নিজের ইস্যু করেন git clone, আপনি মূল সংগ্রহস্থলের নাম অনুসারে কোনও ফাইলপথটিতে আপনার সংগ্রহস্থলটিকে ক্লোন করতে পারেন।

ধরে নিই যে মূল সংগ্রহস্থলটি রয়েছে github.com/awsome-org/toolএবং আপনি এটিকে কাঁটাচামচ করেন github.com/awesome-you/tool, আপনি এটি করতে পারেন:

cd $GOPATH
mkdir -p {src,bin,pkg}
mkdir -p src/github.com/awesome-org/
cd src/github.com/awesome-org/
git clone git@github.com:awesome-you/tool.git # OR: git clone https://github.com/awesome-you/tool.git
cd tool/
go get ./...

গোলং এই সংগ্রহস্থলটি চালিয়ে যেতে পেরে পুরোপুরি খুশি এবং awesome-orgগিট রিমোট থাকাকালীন কিছু উচ্চতর ডিরেক্টরিতে নাম রয়েছে তা যত্ন করে না awesome-you। আপনার awesome-orgসদ্য তৈরি করা ডিরেক্টরিটির জন্য সমস্ত আমদানি পুনরায় সজ্জিত করা হয়, এটি আপনার স্থানীয় কার্যনির্বাহী সেট।

আরও দৈর্ঘ্যে, দয়া করে আমার ব্লগ পোস্টটি দেখুন: গিটহাবের উপর গোলং সংগ্রহস্থলগুলি ফোরক করা এবং আমদানির পথ পরিচালনা

সম্পাদনা : স্থির ডিরেক্টরি পথ


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

6

যদি আপনার কাঁটাচামচ শুধুমাত্র সাময়িক (ie আপনি মনস্থ করা এটি মার্জ করা) তাহলে শুধু স্থানেই যেমন আপনার ডেভেলপমেন্ট করতে $GOPATH/src/launchpad.net/goamz

তারপরে আপনি সংস্করণ নিয়ন্ত্রণ সিস্টেমের বৈশিষ্ট্যগুলি ব্যবহার করেন (উদাহরণস্বরূপ git remote) মূলধারার চেয়ে আপস্ট্রিম সংগ্রহস্থলটিকে আপনার সংগ্রহস্থল তৈরি করতে।

অন্যদের পক্ষে আপনার সংগ্রহশালাটি ব্যবহার করা আরও শক্ত করে go getতবে এর পক্ষে প্রবাহকে একীভূত করা আরও সহজ।

আসলে আমার কাছে গোমজের জন্য একটি ভান্ডার রয়েছে lp:~nick-craig-wood/goamz/goamzযার জন্য আমি ঠিক সেই পথে বিকাশ করেছি। লেখক হয়ত একদিন তা একীভূত করবেন!


1
ঠিক তাই আমি বুঝতে পেরেছি এটি করার প্রভাবগুলি, যদি আমি এই পথে চলে যাই, যখন কেউ go getআমার রেপো থেকে কোনও কাজ করে, তখন আমার সমস্ত আমদানির বিবৃতি github.com/original_authorএবং এগুলি এখনও প্রতিফলিত হবে এবং এইভাবে ভেঙে যাবে ... সঠিক?
parker.sikand

@ পার্কার.সিকান্দ হ্যাঁ এটি সঠিক। এই কৌশলটি আপনার স্ট্রিমের জন্য প্রবাহিত হয়ে প্রবাহিত করার জন্য সর্বোত্তম, না যেতে ব্যবহারের জন্য। আপনি যদি স্থায়ীভাবে প্যাকেজটি কাঁটাচামচ করতে চান তবে অন্য উত্তরের কৌশলটি ব্যবহার করুন।
নিক ক্রেগ-উড

4

এখানে সবার জন্য কাজ করার একটি উপায়:

"আমার / রেপো" (কেবল উদাহরণ) কাঁটাতে গিথব ব্যবহার করুন:

go get github.com/my/repo
cd ~/go/src/github.com/my/repo
git branch enhancement
rm -rf .
go get github.com/golang/tools/cmd/gomvpkg/…
gomvpkg <<oldrepo>> ~/go/src/github.com/my/repo
git commit

আপনি কোডটি আরও ভাল করার সময় প্রত্যেকবার পুনরাবৃত্তি করুন:

git commit
git checkout enhancement
git cherry-pick <<commit_id>>
git checkout master

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


সামান্য সংশোধন: যান github.com/golang/tools/cmd/gomvpkg/main.go এবং এই কমান্ডটি .git সরায়, তাই অন্য কোথাও সংরক্ষণ করুন এবং পরে এটি পুনরুদ্ধার করুন।
ব্যবহারকারী 1212212

এছাড়াও এটি কেবল এমভিএন-গোলং প্লাগইন ব্যবহার করা সম্ভব যা নির্ভরতা প্রক্রিয়াকরণের ক্ষেত্রে কিছু অটোমেশন তৈরি করে যেমন github.com/raydac/mvn-golang/tree/master/mvn-golang-example/…
ইগোর মজনিতসা

3

এর উত্তর হ'ল যদি আপনি একাধিক প্যাকেজগুলির সাথে একটি রেপো কাঁটাচামচ করেন তবে আপনাকে সমস্ত প্রাসঙ্গিক আমদানি পথের নাম পরিবর্তন করতে হবে। এটি মূলত একটি ভাল জিনিস যেহেতু আপনি সেই সমস্ত প্যাকেজগুলিকেই কাঁটাচামচ করেছেন এবং আমদানির পাথগুলি এটি প্রতিফলিত করে।


3
একটি গো প্রকল্পে আমার প্রথম অবদানের ক্ষেত্রে এটি নির্ণয় করার বিষয়ে যত্ন নেওয়ার চেয়ে আমি বেশি সময় পুড়িয়েছি। "সমস্ত পরীক্ষা পরীক্ষার সাথে সাথে নতুন কার্যকারিতা পরীক্ষা করার জন্য লিখেছিলাম সেগুলিও পাস করেছে What's কী হয়েছে ?!" নতুনদের পক্ষে এই হোঁচট খাওয়ার জন্য সহজলভ্য কোনও সরঞ্জামাদি সম্পর্কে আপনি কি সচেতন?
সেজে মিচেল

3
একবার আমি এটা মূর্ত আউট এটা ব্যবহার সমাধানের জন্য সহজ ছিল find, xargsএবং sed, কিন্তু এটা একটা ব্যথা মুক্ত কর্মপ্রবাহ যে ধারাবাহিকভাবে সবার জন্য কাজ করে করতে সাহায্য করবে।
সেজে মিচেল

@ জ্যাকমিচেল নামগুলি gomvpkgআরও সহজ / আরও ভাল করতে পারে। go get golang.org/x/tools/cmd/gomvpkgতারপর gomvpkg -help
ডেভ সি

3
এই উত্তরটি আমাকে পরিপূর্ণ অবৈধ বলে মনে করে। একটি কাঁটাযুক্ত প্রকল্পের বাইরে সেড-আইং প্রকল্পের ফাইলগুলি, এটি উন্মাদ? আপনি যখন একটি টানার অনুরোধ তৈরি করবেন তখন আপনি কী করবেন? ইভান রেভের উত্তরটি আমার কাছে আরও ভাল সমাধান বলে মনে হচ্ছে।
ইভান পি

8
এটি কী এখনও গো-ল্যাং কাজ করছে? এটি কেবল এতটাই উন্মাদ, এটি মজাদার নয় ... হয় উজান-বান্ধব, বা ডাউনস্ট্রিম বান্ধব হোক, তবে উভয়ই নয়। এটি আমার এত নম্র নয় বলে মতামতের একটি বিশাল নকশার ত্রুটি, সম্ভবত এমন লোকেরা করেছেন যারা খুব বেশি ক্রস-প্রকল্পে সহযোগিতা করে না। # ফয়েল # গোলং
নিক্লাস হেধম্যান

1

এই প্রক্রিয়াটি স্বয়ংক্রিয় করতে, আমি একটি ছোট স্ক্রিপ্ট লিখেছিলাম। আপনার ব্যাশে "গফর্ক" এর মতো একটি কমান্ড যুক্ত করতে আপনি আমার ব্লগে আরও বিশদ পেতে পারেন ।

function gofork() {
  if [ $# -ne 2 ] || [ -z "$1" ] || [ -z "$2" ]; then
    echo 'Usage: gofork yourFork originalModule'
    echo 'Example: gofork github.com/YourName/go-contrib github.com/heirko/go-contrib'
    return
  fi
   echo "Go get fork $1 and replace $2 in GOPATH: $GOPATH"
   go get $1
   go get $2
   currentDir=$PWD
   cd $GOPATH/src/$1
   remote1=$(git config --get remote.origin.url)
   cd $GOPATH/src/$2
   remote2=$(git config --get remote.origin.url)
   cd $currentDir
   rm -rf $GOPATH/src/$2
   mv $GOPATH/src/$1 $GOPATH/src/$2
   cd $GOPATH/src/$2
   git remote add their $remote2
   echo Now in $GOPATH/src/$2 origin remote is $remote1
   echo And in $GOPATH/src/$2 their remote is $remote2
   cd $currentDir
}

export -f gofork

লাইন 4 এ golangপরিবর্তন করা উচিত gofork?
ড্যান টেনেনবুম

ভাল দেখা! ফিক্স!
হেরালাইট

1

একসাথে বিক্রেতা এবং সাবমডিউলগুলি ব্যবহার করুন

  1. গিথুব উপর লিব কাঁটাচামচ (এই ক্ষেত্রে go-mssqldb)
  2. এমন একটি সাবমডিউল যুক্ত করুন যা আপনার বিক্রেতার ফোল্ডারে আপনার কাঁটাচাটি ক্লোন করে তবে আপস্ট্রিম রেপোর পথ রয়েছে
  3. importআপনার উত্স কোডটিতে আপনার বিবৃতিগুলি বিক্রেতার ফোল্ডারে দেখানোর জন্য আপডেট করুন ( vendor/উপসর্গটি সহ নয় )। যেমন vendor/bob/lib=>import "bob/lib"

যেমন

cd ~/go/src/github.com/myproj

mygithubuser=timabell
upstreamgithubuser=denisenkom
librepo=go-mssqldb

git submodule add "git@github.com:$mygithubuser/$librepo" "vendor/$upstreamgithubuser/$librepo"

কেন

এটি আমি নিজেই খুঁজে বের করার চেষ্টা করার সময় আমি শুনেছি এমন সমস্ত সমস্যার সমাধান করে ।

  • অভ্যন্তরীণ প্যাকেজ রেফ এখন লিব এ কাজ করে কারণ পথটি উজান থেকে অপরিবর্তিত রয়েছে
  • আপনার প্রকল্পের একটি নতুন চেকআউট কাজ করে কারণ সাবমডিউল সিস্টেমটি আপনার কাঁটাচামচ থেকে ডান কমিটে তবে আপস্ট্রিম ফোল্ডারের পথে আসে
  • আপনাকে নিজেই পাথগুলি হ্যাক করতে বা গো সরঞ্জামগুলির সাথে জগাখিচির বিষয়ে জানতে হবে না।

অধিক তথ্য


0

আপনার Gopkg.tomlফাইলে নীচে এই ব্লক যুক্ত করুন

[[constraint]]
  name = "github.com/globalsign/mgo"
  branch = "master"
  source = "github.com/myfork/project2"

সুতরাং এটি project2জায়গায় কাঁটাচামচ ব্যবহার করবেgithub.com/globalsign/mgo


Gopkg.tomlফাইলটি শুধুমাত্র ব্যবহার করা হয় দ্বারা depযা এই প্রশ্ন এ সব উল্লেখ নেই। নতুন গো প্রকল্পগুলির পরিবর্তে গো মডিউলগুলি ব্যবহার করা উচিত (এবং আইএমও বিদ্যমান ডিপ ভিত্তিক প্রকল্পগুলিও স্থানান্তরিত হওয়া উচিত)।
ডেভ সি

আমি এই ডিপ বৈশিষ্ট্য সম্পর্কে জানতাম না, এবং আপনার উত্তর অবশ্যই আমাকে সাহায্য করেছিল :)
Veger

0

go get -fআপনাকে একটি কাঁটাযুক্ত রেপো পেতে কমান্ডটি ব্যবহার করতে পারেন

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