Bagaimana melakukan "go get" pada tag tertentu dari repositori github

89

Saya mencoba untuk mengkompilasi database InfluxDB (versi v0.8.8) menggunakan go get github.com/influxdb/influxdb

Tapi ini menarik cabang utama, dan saya membutuhkan v0.8.8labelnya.

Saya telah mencoba melakukan: go get github.com/influxdb/influxdb/releases/tag/v0.8.8tetapi ini gagal mengatakan tidak dapat menemukan.

Saya juga mencoba untuk melakukan rutin go getdari cabang master, dan kemudian secara manual memeriksa tag menggunakan gitdi GOPATH/src/github...dalam rangka untuk mengatur versi corret.

Masalah yang menggunakan pendekatan terakhir adalah ketika saya mencoba menarik dependensi go get -u -f ./...dengannya mencoba menemukannya di cabang master, dan beberapa di antaranya tidak ada di cabang master ...

TL; DR : lakukan go getpada tag github tertentu, dan tarik dependensi yang benar.

ESala
sumber
Coba ini .. git tag -a v0.8.8 - "Komentar Anda"
Ashok Londhe
2
@AshokLondhe Dia menanyakan cara menggunakan tag go get, bukan cara membuatnya.
Wonderb0lt
@ Wonderb0lt ini adalah perintah untuk menambahkan tag.
Ashok Londhe
Saya rasa saya mencoba mencari cara untuk memeriksa tag tertentu juga, dan terakhir kali saya mencobanya tidak mungkin ...
wondererb0lt
1
Coba lihat ini . Menjelang akhir slide menawarkan beberapa alternatif manajemen ketergantungan.
Wonderb0lt

Jawaban:

35

Tidak mungkin menggunakan go getalat ini. Sebagai gantinya Anda perlu menggunakan alat manajemen paket go pihak ketiga atau membuat garpu Anda sendiri untuk paket-paket yang ingin Anda kelola dengan lebih baik.

Berbicara kepada seorang pria yang bekerja di Google dan dia mengakui masalah / persyaratan ini, dia mengatakan bahwa vending yang digunakan timnya sangat besar dan mereka mungkin akan segera menyelesaikannya dengan alat resmi.

Baca lebih banyak:

Vendor di Go 1.6

Vendoring telah dirilis dari percobaan di go 1.6 (setelah posting ini awalnya ditulis) yang membuat proses penggunaan tag / versi tertentu dari paket menggunakan alat pihak ketiga lebih mudah. go getmasih tidak memiliki fungsi untuk mengambil tag atau versi tertentu.

Lebih lanjut tentang cara kerja vendor : Memahami dan menggunakan folder vendor

Modul di Go 1.11

Go 1.11 telah merilis fitur eksperimental yang disebut modul untuk meningkatkan manajemen ketergantungan, mereka berharap untuk merilisnya sebagai stabil di Go 1.12: Informasi tentang modul di Go 1.11

Robin Andersson
sumber
1
Bisakah Anda menjelaskan lebih banyak tentang bagian google? Ada diskusi besar tentang ini di milis komunitas perjalanan, adakah arah lain yang belum dibahas di sana?
Not_a_Golfer
1
@Not_a_Golfer Itu adalah seorang pria yang bukan bagian dari tim Go, tetapi berbicara tentang bahwa mereka saat ini menggunakan vendoring secara internal dan itu cukup besar. Jadi mereka tertarik untuk menyelesaikannya lebih baik dengan alat resmi. Pikir itu adalah pernyataan tidak resmi, akan membuatnya lebih jelas.
Robin Andersson
2
AFAIK, satu-satunya proposal adalah untuk vendor resmi / format file ketergantungan. Ini masih bagus, karena proyek tidak akan terikat pada alat ketergantungan, dan dapat beroperasi dengan solusi apa pun yang mereka inginkan (yaitu saya lebih suka penguncian revisi, sementara yang lain lebih suka vending).
JimB
modul tidak benar-benar berurusan dengan ketergantungan pada kompiler kode, yang memaksa kita untuk menggunakan go get protoc-gen-go di tempat lain dengan versi perbaikan. Dengan demikian membuat kami tetap perlu melacak pembuatan versi yang sama di 2 tempat berbeda (karena perpustakaan terhubung erat dengan generator)
Martin Kosicky
24

go mod tersedia sekarang.

Bagi mereka yang perlu membangun biner dari tag tertentu , inilah cara saya:

mkdir temp
cd temp
go mod init .
go get -d -v github.com/nsqio/nsq@v1.1.0
mkdir bin
go build -o bin/nsqd.exe github.com/nsqio/nsq/apps/nsqd

Penjelasan:

  • Kode di atas menarik NSQ v1.1.0 dan build nsqd.
  • go mod init .membuat go.modfile di direktori saat ini, yang memungkinkan penggunaan go getdengan revisi / tag. (lihat tautan ini )
  • -d berarti "hanya unduh", jika Anda ingin pemasangan langsung, hilangkan tanda ini dan perintah build di bawah baris ini.
  • -v berarti "bertele-tele".
  • Kode di atas untuk Windows. Jika Anda menggunakan Linux, ganti bin/nsqd.exedengan bin/nsqd.

Modul yang diunduh disimpan di %GOPATH%\pkg\mod. Jika Anda tidak ingin mencemari GOPATHdirektori Anda , buat yang baru dan setel GOPATHke direktori Anda .

brk
sumber
4
Pada langkah 1.13, go mod initmembutuhkan id modul, misalnyago mod init local/build
archie
11

Saya telah sukses dengan ini:

  • Jalankan perintah get tanpa tag - itu harus mengkloning cabang master.
  • Pindah ke direktori clone dan checkout tag atau cabang yang Anda inginkan.
  • Jalankan perintah go get lagi, itu harus memproses perintah di cabang yang diperiksa.
Gregory Russell
sumber
4
Saat pertama kali dijalankan, Anda dapat menggunakan go get -d <git-url>untuk hanya mengunduh paket dan melewati penginstalan.
webwurst
Inilah yang harus digunakan ketika Anda membutuhkan tag tertentu, gopkg.in terlalu membatasi.
Hrishikesh Kumar
4

Pertanyaan ini mendahului Go Modules, tetapi untuk referensi di masa mendatang, prosedur yang benar di Go 1.11 untuk mengambil versi tertentu adalah ini:

go get github.com/influxdb@[version]

Atau untuk mendapatkan tag git tertentu:

go get github.com/influxdb@[gitref]

emidander
sumber
1

Saya memiliki pendekatan (agak hack, tetapi berfungsi) untuk mengatasi masalah ini, setidaknya untuk repositori git: Karena paket go get'ed adalah repositori kontrol sumber yang normal, seseorang dapat memeriksa tag menggunakan alat git normal (dapat menggunakan git dari baris perintah , Saya menggunakan Atlassian SourceTree).

Untuk membagikan konfigurasi paket saya dengan rekan satu tim, saya telah membuat repositori git dari GOPATH saya . Saya kemudian menambahkan semua paket (setidaknya yang ingin saya kelola dengan cara ini) ke repo ini sebagai git submodule. Ini mengharuskan Anda untuk memindahkan folder repo yang ada dan menambahkannya kembali sebagai git submodule, agar git tidak bingung. Proses ini agak membosankan, tetapi terbukti sepadan dengan masalahnya:

Sekarang saya dapat berkomitmen dan mendorong ke repo GOPATH saya setiap kali saya menggunakan paket go baru. Ketika rekan satu tim saya menarik dari repo ini dan mengeluarkan pembaruan git submodule (atau hanya memperbarui melalui SoureTree, yang melakukan ini secara otomatis), versi paket mereka diperiksa pada tag yang sama dengan milik saya.

Tentu saja ini hanya berfungsi untuk paket di bawah kendali sumber git ...

Peter Hommel
sumber