আমি কীভাবে প্যাকেজের নির্দিষ্ট সংস্করণটি আমদানি করব?


110

Nodeপরিবেশ থেকে আসার পরে আমি প্রকল্প ফোল্ডারে ( node_modules) এর কোনও বিক্রেতার lib এর একটি নির্দিষ্ট সংস্করণ ইনস্টল করতাম npmthat লিবের সেই সংস্করণটি package.jsonসরাসরি বা কনসোল থেকে সরাসরি ইনস্টল করতে বলার দ্বারা :

$ npm install express@4.0.0

তারপরে আমি আমার প্রোজেক্টে সেই প্যাকেজের সেই সংস্করণটি আমদানি করতাম মাত্র:

var express = require('express');

এখন, আমি একই জিনিসটি করতে চাই go। আমি এটা কিভাবে করবো? প্যাকেজের নির্দিষ্ট সংস্করণ ইনস্টল করা কি সম্ভব? যদি তাই হয়, একটি কেন্দ্রীভূত ব্যবহার করে $GOPATH, আমি কীভাবে অন্যটির পরিবর্তে একটি সংস্করণ আমদানি করব?

আমি এই জাতীয় কিছু করব:

$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2

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


4
আপনি করবেন না, go getআপনি যদি এই আচরণটি চান তবে সঠিক সরঞ্জাম নয়। আপনার নির্দিষ্ট সমস্যার সমাধানের জন্য আপনি গুগল করতে পারেন।
ওয়েসি

4
পড়ুন এই
kostix

stackoverflow.com/questions/30188499/... এই সহায়ক সৌন্দর্য খুব
earlonrails

Go 1.11 বা উচ্চতর জন্য, গো মডিউলগুলি দেখুন: স্ট্যাকওভারফ্লো
এভারটন 21

উত্তর:


47

গো 1.11 এর গো গো মডিউল নামে একটি বৈশিষ্ট্য থাকবে এবং আপনি কেবল একটি সংস্করণ সহ একটি নির্ভরতা যুক্ত করতে পারেন। এই পদক্ষেপগুলি অনুসরণ করুন:

go mod init .
go mod edit -require github.com/wilk/uuid@0.0.1` 
go get -v -t ./...   
go build
go install 

এখানে এই বিষয়ে আরও তথ্য - https://github.com/golang/go/wiki/Modules


4
কীভাবে কেউ কেবল এটি পেতে পায়? আমার নির্দিষ্ট সংস্করণে গ্লোবাল গো বাইনারি ইনস্টল করতে হবে
জেমস ট্যান

8
@ জামেসটান go get github.com/wilk/uuid@0.0.1(সহ GO111MODULE=on)
নীল কনওয়ে

7
প্রশ্নটি ব্যবহার করছিল go get, নয় go mod
বার্নার্ডো লোরেইরো

40

সত্যিই অবাক হয়ে কেউ gopkg.in উল্লেখ করেনি

gopkg.inএমন একটি পরিষেবা যা একটি মোড়ক সরবরাহ করে (পুনর্নির্দেশ) যা আপনাকে রেপো তৈরি না করেই রেপো ইউআরএল হিসাবে সংস্করণ প্রকাশ করতে দেয়। উদাহরণস্বরূপ gopkg.in/yaml.v1বনাম gopkg.in/yaml.v2, যদিও তারা উভয়ই বাস করেhttps://github.com/go-yaml/yaml

এটি সঠিক নয় যদি লেখক যথাযথ সংস্করণ অনুশীলনগুলি অনুসরণ না করে (পিছনের সামঞ্জস্যতা ভঙ্গ করার সময় সংস্করণ সংখ্যা বাড়িয়ে), তবে এটি শাখা এবং ট্যাগগুলির সাথে কাজ করে।


5
আমি গোপকজি পছন্দ করি (এবং ব্যবহার করি) তবে সংস্করণ উপ-প্যাকেজগুলির সাথে সঠিকভাবে কাজ করে না । সচেতন হওয়ার মতো কিছু।
আলেক থমাস

gopkg.in পুরোপুরি গিট পুরানো সংস্করণে পরীক্ষা করা হয় না, তাই এটি গিট <v1.9
BMW

এছাড়াও, এটি কেবল প্রধান সংস্করণগুলির জন্য কাজ করে। পুনরুত্পাদনযোগ্য বিল্ডগুলির গ্যারান্টি দেওয়া এটি ব্যবহারযোগ্য।
সিএএফএক্সএক্সএক্স

26

তুমি ব্যবহার করতে পার git checkout এই সংস্করণটি ব্যবহার করে একটি নির্দিষ্ট সংস্করণ পেতে এবং আপনার প্রোগ্রামটি তৈরি ।

উদাহরণ:

export GOPATH=~/
go get github.com/whateveruser/whateverrepo
cd ~/src/github.com/whateveruser/whateverrepo
git tag -l
# supose tag v0.0.2 is correct version
git checkout tags/v0.0.2
go run whateverpackage/main.go

সমাধানটি তখন গিট চেকআউট এবং ইনস্টল করা হবে
ptman

@ এলিয়াক্সেই-মানিক আমাদের আরও ভাল সমাধান দিন। Https://github.com/golang/dep
জোও পারানা

15

গ্লাইড গো এর জন্য একটি সত্যিই মার্জিত প্যাকেজ ম্যানেজমেন্ট, বিশেষত যদি আপনি নোডের এনপিএম বা রাস্টের কার্গো থেকে এসে থাকেন।

এটি 1.6 তে গডেপের নতুন বিক্রেতা বৈশিষ্ট্যের সাথে ঘনিষ্ঠভাবে আচরণ করে তবে এটি আরও সহজ। আপনার নির্ভরতা এবং সংস্করণগুলি GOPATH এর উপর নির্ভর না করে আপনার প্রোজেক্টডির / বিক্রেতা ডিরেক্টরিতে "লকড" থাকে।

মদ (OS X) দিয়ে ইনস্টল করুন

$ brew install glide

গ্লাইড.আইএমএল ফাইল (প্যাকেজ.জসনের অনুরূপ) শুরু করুন। এটি আপনার প্রকল্পের বিদ্যমান আমদানিকৃত প্যাকেজগুলিকে GOPATH থেকে ধরে ফেলবে এবং তারপরে প্রকল্পের বিক্রেতা / ডিরেক্টরিতে অনুলিপি করবে।

$ glide init

নতুন প্যাকেজ পান

$ glide get vcs/namespace/package

প্যাকেজগুলির সংস্করণগুলি আপডেট এবং লক করুন। সংস্করণগুলি লক করতে এটি আপনার প্রকল্প ডিরেক্টরিতে গ্লাইড.লক ফাইল তৈরি করে।

$ glide up

আমি গ্লাইড চেষ্টা করেছিলাম এবং আমার বর্তমান প্রকল্পের জন্য এটি আনন্দের সাথে ব্যবহার করেছি।


4
সম্পূর্ণতার জন্য, এখানে গ্লাইডের জন্য ওয়েবসাইট: গ্লাইড.শ এবং এখানে রেপো: github.com/Mastminds/glide
মাইকেল ফ্রানজল

দুর্ভাগ্যক্রমে গ্লাইড আর "সক্রিয়" নয়, গিথুব পৃষ্ঠায় তারা অফিশিয়াল প্যাকেজ পরিচালনায় (এখন মডিউলগুলিতে যান) মাইগ্রেট করার পরামর্শ দিয়েছেন
দামোইজার

13

আপডেট 18-11-23 : গো 1.11 মোড থেকে আনুষ্ঠানিক পরীক্ষা। দয়া করে @ ক্রিশ উত্তর দেখুন।
আপডেট 19-01-01 : গো 1.12 মডেল থেকে এখনও সরকারী পরীক্ষা is Go 1.13 থেকে শুরু করে মডিউল মোড সমস্ত বিকাশের জন্য ডিফল্ট হবে।
19-10-17 আপডেট করুন : Go 1.13 থেকে Mod অফিশিয়াল প্যাকেজ ম্যানেজার।

https://blog.golang.org/used-go-modules

পুরানো উত্তর:

আপনি অফিক্যাল ডিপ দ্বারা সংস্করণ সেট করতে পারেন

dep ensure --add github.com/gorilla/websocket@1.2.0

4
প্রশ্নটি ব্যবহার করছিল go get, নয় dep
বার্নার্ডো লোরেইরো

11

Go 1.5 থেকে সেখানে "বিক্রেতা পরীক্ষা" রয়েছে যা আপনাকে নির্ভরতা পরিচালনা করতে সহায়তা করে। Go 1.6 হিসাবে এটি আর পরীক্ষা-নিরীক্ষা নয়। এছাড়াও theres যান উইকি উপর অন্য কিছু অপশন।

সম্পাদনা করুন: এই উত্তরে উল্লিখিত হিসাবে gopkg.in গিথুব -ডিপেনডিসি -১.৫ পূর্ববর্তী পিন করার জন্য একটি ভাল বিকল্প।


9

depগো ভাষার জন্য নির্ভরতা পরিচালনার আনুষ্ঠানিক পরীক্ষা। এটি কম্পাইল করতে 1.8 বা আরও নতুন প্রয়োজন।

নির্ভরতা ব্যবহার করে পরিচালনা শুরু করতে dep, আপনার প্রকল্পের মূল ডিরেক্টরি থেকে নিম্নলিখিত কমান্ডটি চালান:

dep init

মৃত্যুর পরে দুটি ফাইল তৈরি করা হবে: Gopkg.toml("ম্যানিফেস্ট"), Gopkg.lockএবং প্রয়োজনীয় প্যাকেজ vendorডিরেক্টরিতে ডাউনলোড করা হবে ।

আসুন ধরে নেওয়া যাক আপনার কাছে এমন প্রকল্প রয়েছে যা github.com/gorilla/websocketপ্যাকেজ ব্যবহার করে । depনিম্নলিখিত ফাইলগুলি উত্পন্ন করবে:

Gopkg.toml

# Gopkg.toml example
#
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
# for detailed Gopkg.toml documentation.
#
# required = ["github.com/user/thing/cmd/thing"]
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
#
# [[constraint]]
#   name = "github.com/user/project"
#   version = "1.0.0"
#
# [[constraint]]
#   name = "github.com/user/project2"
#   branch = "dev"
#   source = "github.com/myfork/project2"
#
# [[override]]
#  name = "github.com/x/y"
#  version = "2.4.0"


[[constraint]]
  name = "github.com/gorilla/websocket"
  version = "1.2.0"

Gopkg.lock

# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.


[[projects]]
  name = "github.com/gorilla/websocket"
  packages = ["."]
  revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b"
  version = "v1.2.0"

[solve-meta]
  analyzer-name = "dep"
  analyzer-version = 1
  inputs-digest = "941e8dbe52e16e8a7dff4068b7ba53ae69a5748b29fbf2bcb5df3a063ac52261"
  solver-name = "gps-cdcl"
  solver-version = 1

সেখানে কমান্ড যা আপনাকে সাহায্য আপডেট / মুছুন / ইত্যাদি প্যাকেজ করতে, আরও তথ্য পেতে দয়া করে হয় সরকারী GitHub রেপো এর dep(go জন্য নির্ভরতা ম্যানেজমেন্ট টুল)।


9

আজকাল আপনি কেবল go getএটির জন্য ব্যবহার করতে পারেন । আপনি সংস্করণ ট্যাগ, শাখা বা এমনকি প্রতিশ্রুতি দ্বারা আপনার নির্ভরতা আনতে পারেন।

go get github.com/someone/some_module@master
go get github.com/someone/some_module@v1.1.0
go get github.com/someone/some_module@commit_hash

এখানে আরও বিশদ - কোনও রেপোতে সর্বশেষ প্রতিশ্রুতিতে go.mod এ গো মডিউল নির্ভরতা কীভাবে নির্দেশ করবেন?

Go getবাইনারিও ইনস্টল করবে , যেমন এটি ডকুমেন্টেশনে বলে -

Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.

( https://golang.org/Cmd/go/ থেকে )


4

গো পান হ'ল গো প্যাকেজ ম্যানেজার। এটি সম্পূর্ণ বিকেন্দ্রীভূত উপায়ে কাজ করে এবং কেন্দ্রীয় প্যাকেজ হোস্টিং সংগ্রহস্থল ব্যতীত কীভাবে প্যাকেজ আবিষ্কার এখনও সম্ভব।

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

পেতে যান সংগ্রহস্থলের মধ্যে ডিফল্ট শাখার মাথা থেকে সবসময় রাখে। সর্বদা. এর দুটি গুরুত্বপূর্ণ জড়িত রয়েছে:

  1. প্যাকেজ লেখক হিসাবে আপনাকে অবশ্যই স্থিতিশীল হেড দর্শন অনুসরণ করতে হবে। আপনার ডিফল্ট শাখাটি সর্বদা আপনার প্যাকেজের স্থিতিশীল, প্রকাশিত সংস্করণ হতে হবে। আপনাকে অবশ্যই বৈশিষ্ট্য শাখায় কাজ করতে হবে এবং প্রকাশের জন্য প্রস্তুত হলে কেবল মার্জ করতে হবে।

  2. আপনার প্যাকেজের নতুন প্রধান সংস্করণগুলির নিজস্ব সংগ্রহস্থল থাকতে হবে। সহজ কথায় বলতে গেলে, আপনার প্যাকেজের প্রতিটি বড় সংস্করণ (নিম্নলিখিত শব্দাবলীর সংস্করণ অনুসারে) এর নিজস্ব সংগ্রহস্থল এবং এর নিজস্ব নিজস্ব আমদানির পথ থাকবে।

    যেমন github.com/jpoehls/gophermail-v1 এবং github.com/jpoehls/gophermail-v2।

কেউ গোয়ে অ্যাপ্লিকেশন তৈরি করার সময়, উপরের দর্শনের সত্যিকারের কোনও খারাপ দিক নেই। প্রতিটি আমদানির পাথ স্থিতিশীল এপিআই API চিন্তার কোনও সংস্করণ নম্বর নেই। অসাধারণ!

আরও তথ্যের জন্য: http://zduck.com/2014/go-and-package-versioning/


45
গো সরঞ্জামগুলির কার্যকারিতা সম্পর্কে আপনার বক্তব্যগুলি সঠিক, তবে প্রায় কেউই তাদের গিট সংগ্রহস্থলগুলির নামগুলিতে সংস্করণগুলিকে অন্তর্ভুক্ত করে না এবং অনেক লোক মাস্টার / হেডকে স্থিতিশীল এপিআই হিসাবে বিবেচনা করে না। আমার কাছে প্রায় আটটি নির্ভরতা সহ একটি ছোট পরিষেবা রয়েছে; শুধুমাত্র একটির একটি সংস্করণ নম্বর রয়েছে। অ্যামাজন github.com/aws/aws-sdk-go এ একটি ব্রেকিং পরিবর্তনকে ঠেলে দিয়েছে। go getএর ক্যাচিংয়ের অর্থ আপনি যখনই বিল্ড সার্ভারটি না পেয়ে থাকেন যা আপনাকে প্রতিবার সর্বশেষতম সংস্করণে সাহায্য করে। তৃতীয় পক্ষের প্যাকেজ পরিচালক রয়েছে তবে তারা বেশিরভাগ ক্রুড।
ধেসানন

19
@ ফয়সাল_কেকে আপনি অবশ্যই একটি স্বপ্নের জগতে বাস করছেন। বিস্ময়কর ওপেন সোর্স সম্প্রদায়ের বাস্তব জগতে, প্রত্যেকে নিজের নিজস্ব দর্শনের প্রতি অনুগত। শাখা প্রকাশের মতো কোনও জিনিস নেই, আমি আনন্দিত যে আমাদের ট্যাগ রয়েছে।

28
প্রতিটি সংস্করণের জন্য একটি ভান্ডার তৈরি করবেন? এটি পাগল
deFreitas

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

5
"চিন্তার মতো কোনও সংস্করণ নম্বর নেই Aw এটি কোনও এসও উত্তরের সবচেয়ে অবাস্তব বক্তব্য হতে হবে। সংস্করণ কারণ আছে। গো এর কোনও প্যাকেজ ম্যানেজারের অভাব যার প্রতি নির্ভরশীলতার সংস্করণ তৈরির জন্য একটি ইনবিল্ট কনফিগারেশন বা কমান্ড ওরিয়েন্টেড মেকানিজম রয়েছে তা বোঝায় না যে সংস্করণটি একটি উপদ্রব। ডাউনভোটিং!
হরিণদক

3

মডিউল প্রশ্নের উপর একটি সামান্য ঠকানো শীট।

সমস্ত বিদ্যমান সংস্করণ পরীক্ষা করতে: যেমন go list -m -versions github.com/gorilla/mux

  1. নির্দিষ্ট সংস্করণ @ v1.2.8
  2. নির্দিষ্ট কমিট @ সি 783230
  3. নির্দিষ্ট কমিট @ মাস্টার
  4. সংস্করণ উপসর্গ @ v2
  5. তুলনা @> = 2.1.5
  6. সর্বশেষ @latest

যেমন go get github.com/gorilla/mux@v1.7.4


2

আমি কার্যকর হওয়ার পন্থাটি হ'ল গিটের সাবমডিউল সিস্টেম । এটি ব্যবহার করে আপনি কোডের একটি প্রদত্ত সংস্করণ উপ-মডেল করতে পারেন এবং আপগ্রেড / ডাউনগ্রেডিং স্পষ্ট এবং রেকর্ড করা হয় - কখনই হাফজার্ড হয় না।

এটির সাথে আমি যে ফোল্ডারটির কাঠামো নিয়েছি তা হ'ল:

+ myproject
++ src
+++ myproject
+++ github.com
++++ submoduled_project of some kind.

আমি এই পদ্ধতিরও ব্যবহার করি। মূলত এটি যেতে যেতে একই ফোল্ডারের কাঠামো অনুসরণ করে তবে আপনি কোন সংস্করণটি অর্জন করছেন তার উপর আপনাকে আরও ভাল নিয়ন্ত্রণের অনুমতি দেয়।
ব্র্যাড পিয়াবডি

উত্তরটি জিজ্ঞাসা করা মানদণ্ডের সাথে প্রশ্নের উত্তর দেয় না (ব্যবহার করে go get)
ব্যাপটিস্ট মিল-ম্যাথিয়াস


2

একটা ব্যাপার চলতে চলতে সম্পাদন করা -replace একটি নির্দিষ্ট সংযোজন করতে কমান্ড কমিট একটি প্যাকেজ এর বর্তমান সংস্করণ উপরে (অন্য forked সংগ্রহস্থল থেকে এমনকি)। এই বিকল্প সম্পর্কে শীতল কি, আপনি সঠিক জানা প্রয়োজন না ছদ্ম সংস্করণ পূর্বেই শুধু হ্যাশ আইডি কমিট

উদাহরণস্বরূপ, আমি "github.com/onsi/ginkgo v1.8.0" প্যাকেজের স্থিতিশীল সংস্করণটি ব্যবহার করছি।

এখন আমি চাই - go.mod এ প্রয়োজনীয় প্যাকেজের এই লাইনটি পরিবর্তন না করে - জিঙ্কগো সংস্করণের শীর্ষে আমার কাঁটাচামচ থেকে একটি প্যাচ যুক্ত করতে:

$ GO111MODULE="on"  go mod edit -replace=github.com/onsi/ginkgo=github.com/manosnoam/ginkgo@d6423c2

প্রথমবার আপনি নিজের মডিউলটি তৈরি বা পরীক্ষা করার পরে, জিও নতুন সংস্করণটি টানতে চেষ্টা করবে এবং তারপরে সঠিক সিউডো সংস্করণ দিয়ে "প্রতিস্থাপন" লাইন তৈরি করবে। উদাহরণস্বরূপ আমার ক্ষেত্রে এটি go.mod এর নীচে যুক্ত হবে:

github.com/onsi/ginkgo => github.com/manosnoam/ginkgo v0.0.0-20190902135631-1995eead7451 প্রতিস্থাপন করুন

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