Go get kullanarak bir paketin belirli bir sürümünü nasıl içe aktarırım?


109

Bir Nodeortamdan geliyorum , bir satıcı kütüphanesinin belirli bir sürümünü proje klasörüne ( node_modules) npm, o kütüphanenin bu sürümünü package.jsonkonsoldan veya hatta doğrudan konsoldan yüklemeyi söyleyerek kuruyordum, şöyle:

$ npm install express@4.0.0

Daha sonra bu paketin bu sürümünü projemde yalnızca şununla içe aktarırdım:

var express = require('express');

Şimdi aynı şeyi yapmak istiyorum go. Bunu nasıl yapabilirim? Bir paketin belirli bir sürümünü kurmak mümkün müdür? Öyleyse, merkezi $GOPATHbir sürüm kullanarak , bir sürümü yerine bir sürümü nasıl içe aktarabilirim?

Bunun gibi bir şey yapardım:

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

Peki ithalat sırasında nasıl fark yaratabilirim?


4
Sen, yapma go getbu davranışı istiyorsanız doğru aracı değil. Özel probleminize çözümler için google'da dolaşabilirsiniz.
Wessie

1
Oku Bu
kostix


Go 1.11 veya üstü için Go Modüllerine bakın: stackoverflow.com/questions/53682247/…
Everton

Yanıtlar:


47

Go 1.11, go modülleri adı verilen bir özelliğe sahip olacak ve bir sürümle basitçe bir bağımlılık ekleyebilirsiniz. Bu adımları takip et:

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

İşte bu konu hakkında daha fazla bilgi - https://github.com/golang/go/wiki/Modules


4
sadece go ile nasıl yapılır? Belirli bir sürüme genel bir go ikili programı yüklemem gerekiyordu
James Tan

7
@JamesTan go get github.com/wilk/uuid@0.0.1(with GO111MODULE=on)
Neil Conway

7
Soru kullanıyordu go get, değil go mod.
Bernardo Loureiro

40

Gerçekten kimsenin gopkg.in'den bahsetmemesine şaşırdım .

gopkg.inaslında depo oluşturmadan sürümleri repo url'leri olarak ifade etmenize izin veren bir sarmalayıcı (yeniden yönlendirme) sağlayan bir hizmettir. Örneğin gopkg.in/yaml.v1vs gopkg.in/yaml.v2, hatta her iki canlı da olsahttps://github.com/go-yaml/yaml

Yazar uygun sürüm oluşturma uygulamalarını takip etmiyorsa (geriye dönük uyumluluğu bozarken sürüm numarasını artırarak) bu mükemmel değildir, ancak dallar ve etiketlerle çalışır.


5
Gopkg'yi seviyorum (ve kullanıyorum), ancak sürüm oluşturma , alt paketlerle doğru çalışmıyor . Dikkat etmemiz gereken birşey.
Alec Thomas

gopkg.in git eski sürümlerinde tam olarak test edilmediğinden git <v1.9
BMW

Ayrıca, yalnızca büyük sürümler için çalışır. Yeniden üretilebilir yapıları garanti etmek kullanılamaz.
CAFxX

26

Sen kullanabilirsiniz git checkoutbir spesifik sürümü almak ve bu sürümünü kullanarak program oluşturmak için.

Misal:

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

Çözüm daha sonra git checkout ve go install
ptman

@ aliaksei-maniuk bize daha iyi bir çözüm sunuyor. Kullanım https://github.com/golang/dep
João Paraná

15

Glide , özellikle Node'un npm veya Rust'ın kargosundan geliyorsanız, Go için gerçekten zarif bir paket yönetimidir.

Godep'in 1.6'daki yeni satıcı özelliğine yakın davranır, ancak çok daha kolaydır. Bağımlılıklarınız ve sürümleriniz, GOPATH'a güvenmeksizin projectdir / vendor dizininizde "kilitlenir".

Demleme ile yükleyin (OS X)

$ brew install glide

Glide.yaml dosyasını başlatın (package.json'a benzer). Bu aynı zamanda projenizdeki mevcut içe aktarılan paketleri GOPATH'tan alır ve ardından projenin vendor / dizinine kopyalar.

$ glide init

Yeni paketler alın

$ glide get vcs/namespace/package

Paketlerin sürümlerini güncelleyin ve kilitleyin. Bu, sürümleri kilitlemek için proje dizininizde glide.lock dosyası oluşturur.

$ glide up

Süzülmeyi denedim ve mevcut projem için mutlu bir şekilde kullanıyorum.


1
Tamlık için, işte glide için web sitesi: glide.sh Ve işte repo: github.com/Masterminds/glide
Michael Franzl

maalesef Glide artık "aktif" değil, github sayfasında resmi paket yönetimine
geçmeyi öneriyorlar

13

Güncelleme 18-11-23 : Go 1.11'den mod resmi bir deneydir. Lütfen @krish cevabına bakın.
Güncelleme 19-01-01 : Go 1.12'den itibaren mod hala resmi bir deneydir. Go 1.13'ten başlayarak, modül modu tüm geliştirmeler için varsayılan mod olacaktır.
Güncelleme 19-10-17 : Go 1.13 modundan itibaren resmi paket yöneticisidir.

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

Eski cevap:

Sürümü resmi depoya göre ayarlayabilirsiniz

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

3
Soru kullanıyordu go get, değil dep.
Bernardo Loureiro


9

depGo dili için bağımlılık yönetimine yönelik resmi deneydir. Derlemek için Go 1.8 veya daha yenisi gerekir.

Kullanarak bağımlılıkları yönetmeye başlamak için dep, projenizin kök dizininden aşağıdaki komutu çalıştırın:

dep init

Yürütmeden sonra iki dosya oluşturulacak: Gopkg.toml("bildirim") Gopkg.lockve gerekli paketler vendordizine indirilecektir .

github.com/gorilla/websocketPaket kullanan bir projeye sahip olduğunuzu varsayalım . depaşağıdaki dosyaları oluşturacaktır:

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

Eğer güncelleme / silme / vb paketlere, daha fazla bilgi bulabilirsiniz lütfen yardım komutları vardır resmi github repo ait dep(Go için bağımlılık yönetim aracı).


7

Günümüzde sadece go getbunun için kullanabilirsiniz . Bağımlılığınızı sürüm etiketi, dal ve hatta yürütme ile alabilirsiniz.

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

daha fazla ayrıntı burada - go.mod'daki Go modülü bağımlılığını bir depodaki en son yürütmeye nasıl yönlendirebilirim?

Go getdokümantasyonda söylendiği gibi ikili dosyayı da kuracak -

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/ adresinden )


4

go get , Go paket yöneticisidir. Tamamen merkezi olmayan bir şekilde çalışır ve merkezi bir paket barındırma deposu olmadan paket keşfi nasıl hala mümkündür.

Paketleri bulmanın ve indirmenin yanı sıra, bir paket yöneticisinin diğer büyük rolü, aynı paketin birden çok sürümünü işlemektir. Go, herhangi bir paket yöneticisinin en minimal ve pragmatik yaklaşımını benimser. Bir Go paketinin birden çok sürümü diye bir şey yoktur.

go get her zaman depodaki varsayılan dalın HEAD'inden çeker. Her zaman. Bunun iki önemli sonucu vardır:

  1. Bir paket yazarı olarak, kararlı HEAD felsefesine bağlı kalmalısınız. Varsayılan şubeniz her zaman paketinizin kararlı, yayınlanmış sürümü olmalıdır. Özellik dallarında çalışmanız ve yalnızca yayınlamaya hazır olduğunuzda birleştirmeniz gerekir.

  2. Paketinizin yeni ana sürümlerinin kendi depoları olmalıdır. Basitçe ifade etmek gerekirse, paketinizin her ana sürümü (anlamsal sürümlemenin ardından) kendi havuzuna ve dolayısıyla kendi içe aktarma yoluna sahip olacaktır.

    örneğin github.com/jpoehls/gophermail-v1 ve github.com/jpoehls/gophermail-v2.

Go'da bir uygulama oluşturan biri olarak, yukarıdaki felsefenin gerçekten bir dezavantajı yoktur. Her içe aktarma yolu kararlı bir API'dir. Endişelenecek sürüm numarası yok. Harika!

Daha fazla ayrıntı için: http://zduck.com/2014/go-and-package-versioning/


45
Go araçlarının işlevselliği hakkındaki ifadeleriniz doğrudur, ancak neredeyse hiç kimse sürümleri git depo adlarına dahil etmez ve birçok kişi master / HEAD'i kararlı bir API olarak ele almaz. Şu anda yaklaşık sekiz bağımlılığı olan küçük bir hizmetim var; yalnızca birinin sürüm numarası vardır. Amazon, github.com/aws/aws-sdk-go adresine büyük bir değişiklik yaptı. go get'ın önbelleğe alınması, sizi her seferinde yararlı bir şekilde en son sürüme güncelleyen bir yapı sunucunuz olmadığı sürece bir süre fark etmeyeceğiniz anlamına gelir. Üçüncü taraf paket yöneticileri var, ancak çoğunlukla kabadırlar.
dhasenan

19
@faisal_kk bir hayal dünyasında yaşıyor olmalısın. Harika açık kaynak topluluğunun GERÇEK dünyasında, herkes kendi felsefesine bağlı kalıyor. Dallanma sürümleri gibi bir şey yok, etiketlerimiz olmasına sevindim.

28
Her sürüm için bir depo oluşturulsun mu? Çılgınca
deFreitas

8
Bu temelde yanlış bir davranıştır. Kaynak kodu, yayımlanmış bir paket ile aynı DEĞİLDİR ve geriye / ileriye dönük uyumluluğu sağlamak için paket yazarları koyamazsınız. Geliştiriciler yetersiz oldukları için değil, paket bağımlılıklarının sayısı birden fazla arttığında bu teorik olarak imkansız olduğu için. Bu nedenle, gitmenin kaderi, ana kusuru tam olarak aynı olan çardak ile aynı şekilde gitmektir. Anlamsal versiyonlama da yeterince güçlü değil, ikili sağlama toplamları gerçekten gitmenin tek yolu.
Gudlaugur Egilsson

5
"Endişelenecek sürüm numarası yok. Harika!" Bu şimdiye kadarki bir SO cevabındaki en saçma ifade olmalı. Versiyonlama bir sebepten dolayı var. Go'nun, bağımlılıkların versiyonlanması için dahili bir konfigürasyona veya komuta yönelik bir mekanizmaya sahip bir paket yöneticisinin olmaması, versiyon oluşturmanın bir sıkıntı olduğu anlamına gelmez. Olumsuz oylama!
Harindaka

2

Uygulanabilir bulduğum yaklaşım git'in alt modül sistemidir . Bunu kullanarak kodun belirli bir sürümünde alt modül oluşturabilirsiniz ve yükseltme / düşürme açık ve kayıtlıdır - asla gelişigüzel değildir.

Bununla aldığım klasör yapısı:

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

Ben de bu yaklaşımı kullanıyorum. Esasen, go get ile aynı klasör yapısını izler, ancak hangi sürümü edindiğinizi daha iyi kontrol etmenizi sağlar.
Brad Peabody

yanıt, sorulan kriterlerle soruyu yanıtlamıyor (kullanarak go get)
Baptiste Mille-Mathias

2

Bu benim için çalıştı

GO111MODULE=on go get -u github.com/segmentio/aws-okta@v0.22.1


2

Bir paketin mevcut sürümünün üzerine belirli bir kaydetme (başka bir çatallı depodan bile olsa) eklemek için bir go edit -replace komutu vardır. Bu seçenek hakkında harika olan şey, önceden tam sözde sürümü bilmenize gerek olmaması , sadece commit karma kimliğini bilmenizdir .

Örneğin, "github.com/onsi/ginkgo v1.8.0" paketinin kararlı sürümünü kullanıyorum.

Şimdi - go.mod'da gerekli paketin bu satırını değiştirmeden - çatalımdan ginkgo sürümünün üstüne bir yama eklemek istiyorum:

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

Modülünüzü ilk kez oluşturduktan veya test ettikten sonra, GO yeni sürümü almaya çalışacak ve ardından doğru sözde sürümle "değiştir" satırını oluşturacaktır. Örneğin benim durumumda, go.mod'un altına eklenecek:

github.com/onsi/ginkgo => github.com/manosnoam/ginkgo v0.0.0-20190902135631-1995eead7451 değiştirin


1

Modül sorgularıyla ilgili küçük bir hile sayfası.

Mevcut tüm sürümleri kontrol etmek için: örn. go list -m -versions github.com/gorilla/mux

  1. Belirli sürüm @ v1.2.8
  2. Özel taahhüt @ c783230
  3. Belirli commit @master
  4. Sürüm öneki @ v2
  5. Karşılaştırma @> = 2.1.5
  6. En son @latest

Örneğin go get github.com/gorilla/mux@v1.7.4

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.