मैं एक पैकेज के विशिष्ट संस्करण को कैसे प्राप्त करूं?


109

एक Nodeवातावरण से आ रहा है मैं एक विक्रेता के विशिष्ट संस्करण को प्रोजेक्ट फ़ोल्डर में स्थापित करता node_modulesथा ( ) कहकर npmउस परिवाद के उस संस्करण को 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सही उपकरण है, तो आप इस व्यवहार चाहते हैं नहीं है। आप अपनी विशिष्ट समस्या के समाधान के लिए चारों ओर Google कर सकते हैं।
वेस्सी

1
पढ़ें इस
kostix

stackoverflow.com/questions/30188499/… यह भी मददगार लग रहा है
इयरलोनरिल्स

1.11 या उच्चतर के लिए, Go Modules देखें: stackoverflow.com/questions/53682247/…
Everton

जवाबों:


46

गो 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
केवल एक के साथ यह कैसे हो जाता है? मुझे विशिष्ट संस्करण में एक वैश्विक गो बाइनरी स्थापित करने की आवश्यकता है
जेम्स टैन

7
@JamesTan go get github.com/wilk/uuid@0.0.1(साथ GO111MODULE=on)
नील कॉनवे

5
सवाल का उपयोग कर रहा था 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 पसंद है (और उपयोग), लेकिन उप-पैकेजों के साथ संस्करण ठीक से काम नहीं करता है। बस ऐसा कुछ जिसके बारे में अवगत होना चाहिए।
एलेक थॉमस

gopkg.in git पुराने संस्करणों में पूरी तरह से परीक्षण नहीं किया गया है, इसलिए यह git <v1.9
BMW

इसके अलावा, यह केवल प्रमुख संस्करणों के लिए काम करता है। यह प्रतिलिपि प्रस्तुत करने योग्य बिल्ड की गारंटी देने के लिए अनुपयोगी है।
CAFxX

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
João Paraná

15

ग्लाइड गो के लिए एक बहुत ही सुंदर पैकेज प्रबंधन है, खासकर यदि आप नोड के एनपीएम या रस्ट के कार्गो से आते हैं।

यह 1.6 में Godep के नए वेंडर फीचर के साथ घनिष्ठ व्यवहार करता है लेकिन यह अधिक आसान है। आपके निर्भरताएं और संस्करण GOPATH पर भरोसा किए बिना आपकी प्रॉजेक्टड / वेंडर निर्देशिका के अंदर "लॉक" हैं।

काढ़ा (OS X) के साथ स्थापित करें

$ brew install glide

Glide.yaml फ़ाइल (पैकेज के समान) में प्रवेश करें। यह GOPATH से आपकी परियोजना में मौजूदा आयातित पैकेजों को पकड़ता है और फिर परियोजना के विक्रेता / निर्देशिका को कॉपी करता है।

$ glide init

नए पैकेज प्राप्त करें

$ glide get vcs/namespace/package

अद्यतन और संकुल के संस्करणों को बंद करें। यह संस्करणों को लॉक करने के लिए आपकी प्रोजेक्ट निर्देशिका में glide.lock फ़ाइल बनाता है।

$ glide up

मैंने ग्लाइड की कोशिश की और अपने वर्तमान प्रोजेक्ट के लिए खुशी से इसका इस्तेमाल कर रहा हूं।


1
संपूर्णता के लिए, यहाँ ग्लाइड के लिए वेबसाइट है: glide.sh और यहाँ रेपो: github.com/Masterminds/glide
माइकल फ्रैंज

दुर्भाग्य से ग्लाइड "सक्रिय" अब नहीं है, जीथब पृष्ठ पर वे आधिकारिक संकुल प्रबंधन (अब गो मॉड्यूल) पर माइग्रेट करने का सुझाव देते हैं
डैमोइजर

13

अपडेट 18-11-23 : गो 1.11 मॉड से आधिकारिक प्रयोग है। कृपया @krish उत्तर देखें।
अपडेट 19-01-01 : गो से 1.12 मॉड अभी भी आधिकारिक प्रयोग है। गो 1.13 में शुरू, मॉड्यूल मोड सभी विकास के लिए डिफ़ॉल्ट होगा।
अपडेट 19-10-17 : गो 1.13 मॉड से आधिकारिक पैकेज मैनेजर है।

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

पुराना उत्तर:

आप ऑफ़िस डिप द्वारा संस्करण सेट कर सकते हैं

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

3
सवाल का उपयोग कर रहा था go get, नहीं dep
बर्नार्डो लौरेइरो

11

गो 1.5 से "विक्रेता प्रयोग" है जो आपको निर्भरता को प्रबंधित करने में मदद करता है। गो 1.6 के रूप में यह अब एक प्रयोग नहीं है। Theres भी गो विकी पर कुछ अन्य विकल्प।

संपादित करें: जैसा कि इस उत्तर में बताया गया है कि gopkg.in , github-depdencies को 1.5 के लिए एक अच्छा विकल्प है।


9

depगो भाषा के लिए निर्भरता प्रबंधन के लिए आधिकारिक प्रयोग है। इसे संकलित करने के लिए Go 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(जाओ के लिए निर्भरता प्रबंधन उपकरण)।


7

आजकल आप बस 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

यहाँ अधिक जानकारी - How to point Go मॉड्यूल निर्भरता 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

go get , Go पैकेज मैनेजर है। यह पूरी तरह से विकेंद्रीकृत तरीके से काम करता है और केंद्रीय पैकेज की मेजबानी के भंडार के बिना पैकेज की खोज अभी भी कैसे संभव है।

पैकेज खोजने और डाउनलोड करने के अलावा, पैकेज मैनेजर की अन्य बड़ी भूमिका एक ही पैकेज के कई संस्करणों को संभाल रही है। गो किसी भी पैकेज मैनेजर का सबसे न्यूनतम और व्यावहारिक दृष्टिकोण लेता है। एक गो पैकेज के कई संस्करणों के रूप में ऐसी कोई चीज नहीं है।

गो हमेशा रिपॉजिटरी में डिफॉल्ट ब्रांच के हेड से खींचता है। हमेशा। इसके दो महत्वपूर्ण निहितार्थ हैं:

  1. एक पैकेज लेखक के रूप में, आपको स्थिर HEAD दर्शन का पालन करना चाहिए। आपकी डिफ़ॉल्ट शाखा को हमेशा आपके पैकेज का स्थिर, जारी संस्करण होना चाहिए। आपको फीचर शाखाओं में काम करना होगा और रिलीज होने के लिए तैयार होने पर ही मर्ज करना होगा।

  2. आपके पैकेज के नए प्रमुख संस्करणों का अपना भंडार होना चाहिए। सीधे शब्दों में कहें, आपके पैकेज के प्रत्येक प्रमुख संस्करण (शब्दार्थ संस्करण के बाद) का अपना भंडार होगा और इस प्रकार इसका अपना आयात पथ होगा।

    जैसे github.com/jpoehls/gophermail-v1 और github.com/jpoehls/gophermail-v2।

जब कोई गो में किसी एप्लिकेशन का निर्माण करता है, तो उपरोक्त दर्शन वास्तव में नकारात्मक पक्ष नहीं है। प्रत्येक आयात पथ एक स्थिर एपीआई है। चिंता करने के लिए कोई संस्करण संख्या नहीं हैं। बहुत बढ़िया!

अधिक जानकारी के लिए: http://zduck.com/2014/go-and-package-versioning/


45
गो टूल की कार्यक्षमता के बारे में आपके कथन सही हैं, लेकिन लगभग कोई भी उनके git रिपॉजिटरी नामों में संस्करणों को शामिल नहीं करता है, और कई लोग मास्टर / HEAD को एक स्थिर एपीआई के रूप में नहीं मानते हैं। वर्तमान में मेरे पास लगभग आठ निर्भरताओं वाली एक छोटी सेवा है; केवल एक संस्करण संख्या है। अमेज़ॅन ने एक परिवर्तन को धक्का दिया github.com/aws/aws-sdk-go। go getकैशिंग का मतलब है कि आप कुछ समय के लिए नोटिस नहीं करते हैं जब तक कि आपके पास एक बिल्ड सर्वर नहीं होता है जो आपको हर बार नवीनतम संस्करण में सहायक होता है। थर्ड पार्टी पैकेज मैनेजर हैं, लेकिन वे ज्यादातर क्रूड हैं।
धसानन

19
@faisal_kk आप एक सपनों की दुनिया में रह रहे होंगे। अद्भुत ओपन-सोर्स समुदाय की वास्तविक दुनिया में, हर कोई अपने स्वयं के दर्शन का पालन कर रहा है। ब्रांचिंग रिलीज की कोई बात नहीं है, मुझे खुशी है कि हमारे पास टैग हैं।

28
हर संस्करण के लिए एक भंडार बनाएँ? यह पागल है
deFreitas

8
यह मौलिक रूप से गलत व्यवहार है। स्रोत कोड रिलीज़ किए गए पैकेज के समान नहीं है, और आप बैकवर्ड / फॉरवर्ड संगतता सुनिश्चित करने के लिए पैकेज लेखकों पर नहीं डाल सकते हैं। इसलिए नहीं कि डेवलपर्स अक्षम हैं, लेकिन क्योंकि यह सैद्धांतिक रूप से असंभव है जब पैकेज निर्भरता की संख्या एक से अधिक बढ़ जाती है। गो प्राप्त इसलिए नियत रूप से उसी तरह से जाना जाता है, जिसका मुख्य दोष यह ठीक वैसा ही था। सिमेंटिक संस्करण पर्याप्त रूप से मजबूत नहीं है, बाइनरी चेकसम वास्तव में जाने का एकमात्र तरीका है।
गुदालुगुर एगिल्सन

5
"चिंता करने की कोई संस्करण संख्या नहीं है। बहुत बढ़िया!" एसओ जवाब में यह अब तक का सबसे बेतुका बयान है। संस्करण एक कारण के लिए वहाँ है। एक पैकेज मैनेजर की कमी जो एक इनबिल्ट कॉन्फिगरेशन या कमांड ओरिएंटेड मैकेनिज्म के लिए निर्भरता के संस्करण के लिए है, जो यह नहीं कहता है कि वर्जनिंग एक उपद्रव है। Downvoting!
हरिन्दाका

2

मुझे जो काम करने का तरीका मिल गया है, वह है git का सबमॉड्यूल सिस्टम । इसका उपयोग करके आप कोड के दिए गए संस्करण में सबमॉड्यूल कर सकते हैं और अपग्रेड / डाउनग्रेडिंग स्पष्ट और रिकॉर्ड किया जा सकता है - कभी भी लापरवाह नहीं।

फ़ोल्डर संरचना जो मैंने इसके साथ ली है वह है:

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

मैं इस दृष्टिकोण का भी उपयोग करता हूं। अनिवार्य रूप से यह उसी फ़ोल्डर संरचना का अनुसरण करता है जैसे कि मिलता है, लेकिन आपको बेहतर नियंत्रण देता है कि आप किस संस्करण को प्राप्त कर रहे हैं।
ब्रैड पीबॉडी

उत्तर पूछे गए मानदंड (उपयोग go get) के साथ प्रश्न का उत्तर नहीं देता है
बैपटिस्ट मिल-मैथियास


2

वहाँ एक है जाने संपादित -replace एक विशिष्ट संलग्न करने के लिए आदेश के लिए प्रतिबद्ध एक पैकेज के वर्तमान संस्करण के शीर्ष पर (एक और काँटेदार रिपोजिटरी से भी)। इस विकल्प के बारे में क्या अच्छा है, यह है कि आपको पहले से सटीक छद्म संस्करण जानने की जरूरत नहीं है , बस कमिट आईडी

उदाहरण के लिए, मैं "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 नए संस्करण को खींचने का प्रयास करेगा, और फिर सही छद्म संस्करण के साथ "बदलें" लाइन उत्पन्न करेगा। मेरे मामले में उदाहरण के लिए, यह go.mod के तल पर जोड़ देगा:

प्रतिस्थापित करें


2

मॉड्यूल प्रश्नों पर एक छोटा धोखा पत्र।

सभी मौजूदा संस्करणों की जांच करने के लिए: उदाहरण के लिए go list -m -versions github.com/gorilla/mux

  1. विशिष्ट संस्करण @ v1.2.8
  2. विशिष्ट प्रतिबद्ध @ c783230
  3. विशिष्ट प्रतिबद्ध @ मास्टर
  4. संस्करण उपसर्ग @ v2
  5. तुलना @> = 2.1.5
  6. नवीनतम @latest

उदाहरण के लिए go get github.com/gorilla/mux@v1.7.4

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.