berasal dari Node
lingkungan saya biasa menginstal versi tertentu dari vendor lib ke dalam folder proyek ( node_modules
) dengan memberitahu npm
untuk menginstal versi lib itu dari package.json
atau bahkan langsung dari konsol, seperti:
$ npm install express@4.0.0
Kemudian saya biasa mengimpor versi paket itu di proyek saya hanya dengan:
var express = require('express');
Sekarang, saya ingin melakukan hal yang sama dengan go
. Bagaimana saya bisa melakukan itu? Apakah mungkin untuk menginstal versi paket tertentu? Jika demikian, dengan menggunakan terpusat $GOPATH
, bagaimana cara mengimpor satu versi alih-alih yang lain?
Saya akan melakukan sesuatu seperti ini:
$ go get github.com/wilk/uuid@0.0.1
$ go get github.com/wilk/uuid@0.0.2
Tapi kemudian, bagaimana saya bisa membuat perbedaan selama impor?
go
package
package-managers
Wilk
sumber
sumber
go get
bukanlah alat yang tepat jika Anda menginginkan perilaku ini. Anda dapat mencari solusi untuk masalah spesifik Anda di Google.Jawaban:
Go 1.11 akan memiliki fitur yang disebut modul go dan Anda cukup menambahkan dependensi dengan sebuah versi. Ikuti langkah ini:
Berikut info selengkapnya tentang topik tersebut - https://github.com/golang/go/wiki/Modules
sumber
go get github.com/wilk/[email protected]
(denganGO111MODULE=on
)go get
, bukango mod
.Benar-benar terkejut tidak ada yang menyebutkan gopkg.in .
gopkg.in
adalah layanan yang menyediakan pembungkus (pengalihan) yang memungkinkan Anda mengekspresikan versi sebagai url repo, tanpa benar-benar membuat repo. Misalnyagopkg.in/yaml.v1
vsgopkg.in/yaml.v2
, meskipun mereka berdua tinggal dihttps://github.com/go-yaml/yaml
Ini tidak sempurna jika penulis tidak mengikuti praktik pembuatan versi yang benar (dengan menaikkan nomor versi saat melanggar kompatibilitas mundur), tetapi berfungsi dengan cabang dan tag.
sumber
Anda dapat menggunakan
git checkout
untuk mendapatkan versi tertentu dan membangun program Anda menggunakan versi ini.Contoh:
sumber
Glide adalah manajemen paket yang sangat elegan untuk Go terutama jika Anda berasal dari npm Node atau kargo Rust.
Ini berperilaku dekat dengan fitur vendor baru Godep di 1.6 tetapi jauh lebih mudah. Dependensi dan versi Anda "dikunci" di dalam direktori projectdir / vendor Anda tanpa bergantung pada GOPATH.
Instal dengan minuman (OS X)
Masukkan file glide.yaml (mirip dengan package.json). Ini juga mengambil paket yang diimpor yang ada dalam proyek Anda dari GOPATH dan menyalinnya ke direktori vendor / proyek.
Dapatkan paket baru
Perbarui dan kunci versi paket. Ini membuat file glide.lock di direktori proyek Anda untuk mengunci versi.
Saya mencoba meluncur dan dengan senang hati menggunakannya untuk proyek saya saat ini.
sumber
Pembaruan 18-11-23 : Dari Go 1.11 mod adalah eksperimen resmi. Silakan lihat jawaban @krish.
Pembaruan 19-01-01 : Dari Go 1.12 mod masih merupakan percobaan resmi. Mulai Go 1.13, mode modul akan menjadi default untuk semua pengembangan.
Pembaruan 19-10-17 : Dari Go 1.13 mod adalah pengelola paket resmi.
https://blog.golang.org/using-go-modules
Jawaban lama:
Anda dapat mengatur versi dengan dep resmi
sumber
go get
, bukandep
.Dari Go 1.5 ada "eksperimen vendor" yang membantu Anda mengelola dependensi. Mulai Go 1.6, ini bukan lagi eksperimen. Ada juga beberapa opsi lain di Go wiki. .
Sunting: seperti yang disebutkan dalam jawaban ini gopkg.in adalah pilihan yang baik untuk menyematkan github-depdencies sebelum 1.5.
sumber
dep
adalah eksperimen resmi untuk manajemen ketergantungan untuk bahasa Go. Ini membutuhkan Go 1.8 atau yang lebih baru untuk dikompilasi.Untuk mulai mengelola dependensi menggunakan
dep
, jalankan perintah berikut dari direktori root project Anda:Setelah eksekusi, dua file akan dibuat:
Gopkg.toml
("manifest"),Gopkg.lock
dan paket yang diperlukan akan diunduh kevendor
direktori.Anggaplah Anda memiliki proyek yang menggunakan
github.com/gorilla/websocket
paket.dep
akan menghasilkan file berikut:Gopkg.toml
Gopkg.lock
Ada perintah yang membantu Anda untuk update / delete / etc paket, silahkan mencari info lebih lanjut tentang repo github resmi dari
dep
(alat manajemen ketergantungan untuk Go).sumber
Saat ini Anda bisa menggunakannya
go get
untuk itu. Anda dapat mengambil ketergantungan Anda dengan tag versi, cabang atau bahkan komit.lebih jelasnya di sini - Bagaimana cara mengarahkan ketergantungan modul Go di go.mod ke komit terbaru di repo?
Go get
juga akan menginstal biner, seperti yang tertulis di dokumentasi -Get downloads the packages named by the import paths, along with their dependencies. It then installs the named packages, like 'go install'.
(dari https://golang.org/cmd/go/ )
sumber
go get adalah pengelola paket Go. Ia bekerja dengan cara yang sepenuhnya terdesentralisasi dan bagaimana penemuan paket masih dimungkinkan tanpa repositori hosting paket pusat.
Selain mencari dan mengunduh paket, peran besar lainnya dari pengelola paket adalah menangani beberapa versi dari paket yang sama. Go mengambil pendekatan paling minimal dan pragmatis dari pengelola paket mana pun. Tidak ada yang namanya beberapa versi paket Go.
go get selalu menarik dari HEAD dari cabang default di repositori. Selalu. Ini memiliki dua implikasi penting:
Sebagai pembuat paket, Anda harus mematuhi filosofi HEAD yang stabil. Cabang default Anda harus selalu versi stabil yang dirilis dari paket Anda. Anda harus bekerja di cabang fitur dan hanya menggabungkan saat siap untuk rilis.
Versi utama baru dari paket Anda harus memiliki repositori sendiri. Sederhananya, setiap versi utama dari paket Anda (mengikuti versi semantik) akan memiliki repositori sendiri dan dengan demikian jalur impornya sendiri.
mis. github.com/jpoehls/gophermail-v1 dan github.com/jpoehls/gophermail-v2.
Sebagai seseorang yang membangun aplikasi di Go, filosofi di atas benar-benar tidak memiliki kerugian. Setiap jalur impor adalah API yang stabil. Tidak ada nomor versi yang perlu dikhawatirkan. Hebat!
Untuk detail lebih lanjut: http://zduck.com/2014/go-and-package-versioning/
sumber
go get
Caching berarti Anda tidak menyadarinya untuk beberapa saat kecuali Anda memiliki server build yang membantu memperbarui Anda ke versi terbaru setiap saat. Ada pengelola paket pihak ketiga, tetapi kebanyakan mentah.Pendekatan yang menurut saya bisa diterapkan adalah sistem submodul git . Menggunakan itu Anda dapat submodule dalam versi kode tertentu dan peningkatan / penurunan secara eksplisit dan dicatat - tidak pernah sembarangan.
Struktur folder yang saya ambil dengan ini adalah:
sumber
go get
)Itu berhasil untuk saya
GO111MODULE=on go get -u github.com/segmentio/[email protected]
sumber
Ada perintah go edit -replace untuk menambahkan komit tertentu (bahkan dari repositori bercabang lain) di atas versi paket saat ini. Yang menarik dari opsi ini, adalah Anda tidak perlu mengetahui versi pseudo yang tepat sebelumnya, cukup komit hash id .
Misalnya, saya menggunakan versi stabil dari paket "github.com/onsi/ginkgo v1.8.0".
Sekarang saya ingin - tanpa mengubah baris paket yang diperlukan ini di go.mod - untuk menambahkan tambalan dari garpu saya, di atas versi ginkgo:
Setelah pertama kali Anda membangun atau menguji modul Anda, GO akan mencoba menarik versi baru, dan kemudian membuat baris "ganti" dengan versi semu yang benar. Misalnya dalam kasus saya, itu akan ditambahkan di bagian bawah go.mod:
sumber
Sedikit contekan tentang pertanyaan modul.
Untuk memeriksa semua versi yang ada: mis
go list -m -versions github.com/gorilla/mux
Misalnya
go get github.com/gorilla/[email protected]
sumber