Bila kode Anda menggunakan paket-paket eksternal, paket tersebut (yang didistribusi dalam modul) menjadi dependensi. Suatu saat, Anda mungkin ingin memperbarui atau mengganti paket tersebut. Go menyediakan perkakas manajemen dependensi yang membantu menjaga aplikasi Go Anda aman saat menggunakan dependensi eksternal.
Topik ini menjelaskan bagaimana melakukan manajemen dependensi pada kode Anda dengan perkakas Go. Topik ini juga menjelaskan beberapa pekerjaan lain yang berkaitan dengan dependensi yang mungkin suatu saat nanti berguna.
Lihat juga
-
Jika Anda baru belajar tentang dependensi dengan modul, lihatlah Tutorial: memulai dari awal untuk pengenalan singkat.
-
Menggunakan perintah
go
untuk mengatur dependensi modul memastikan kebutuhan Anda konsisten dan isi dari berkas go.mod selalu valid. Untuk referensi dari perintah tersebut, lihat Perintah go. Anda juga bisa membaca bantuan lewat baris perintah dengan mengetikango help
nama-perintah, misalnyago help mod tidy
. -
Perintah go untuk mengatur dependensi mengubah berkas
go.mod
. Untuk informasi lebih lanjut tentang format berkas ini, lihat Referensi berkas go.mod. -
Membuat program penyunting atau Integrated Development Environment (IDE) Anda supaya mendukung Go modul untuk mempermudah pekerjaan manajemen dependensi. Untuk informasi tentang program penyunting yang mendukung Go, lihat Plugin untuk editor dan IDE.
-
Topik ini tidak menjelaskan bagaimana mengembangkan, menerbitkan, dan memberi versi pada modul supaya dapat digunakan oleh orang lain. Untuk informasi tentang hal tersebut, lihat Mengembangkan dan menerbitkan modul.
Alur kerja menggunakan dan mengatur dependensi
Anda bisa mengambil dan menggunakan paket-paket eksternal menggunakan perkakas
Go.
Pada situs
pkg.go.dev,
Anda bisa mencari paket yang akan digunakan, kemudian menggunakan perintah
go
untuk mengimpor paket tersebut ke dalam kode Anda untuk memanggil
fungsinya.
Berikut daftar langkah-langkah yang sering digunakan dalam manajemen dependensi. Untuk informasi lebih lanjut tentang setiap langkah, lihat bagian-bagian dari topik ini.
-
Impor paket tersebut ke dalam kode.
-
Tambahkan kode Anda ke dalam sebuah modul untuk melacak dependensi (jika belum berada dalam modul). Lihat Mengaktifkan pelacakan dependensi.
-
Tambahkan paket eksternal sebagai dependensi supaya Anda dapat mengaturnya.
-
Perbarui versi dependensi bila diperlukan.
Mengatur dependensi modul
Dalam Go, dependensi adalah modul-modul yang berisi paket-paket yang kita impor. Proses pengaturan dependensi ini didukung oleh:
-
Sebuah sistem terdesentralisasi untuk menerbitkan modul dan mengambil kode. Pengembang kode membuat modul mereka tersedia untuk digunakan oleh pengembang lain lewat repositori mereka sendiri dan menerbitkannya dengan nomor versi.
-
Sebuah mesin pencari paket dan penjelajah dokumentasi (pkg.go.dev) di mana Anda dapat mencari modul. Lihat Mencari dan mengimpor paket.
-
Sebuah konvensi penomoran versi modul yang membantu Anda memahami stabilitas dan jaminan kompatibilitas modul. lihat Penomoran versi modul.
-
Perkakas go yang mempermudah Anda mengatur dependensi, termasuk mendapatkan sumber kode, memperbarui, dan lainnya. Lihat topik ini lebih lanjut pada bagian selanjutnya.
Mencari dan mengimpor paket
Anda dapat menggunakan situs pkg.go.dev untuk mencari paket-paket dengan fungsi yang akan Anda gunakan.
Saat paket yang ingin Anda gunakan telah ditemukan, cari impor path dari paket tersebut pada bagian atas halaman dan klik tombol "Copy path" untuk menyalin. Dalam kode Anda, salin lah path tersebut menjadi perintah impor, seperti contoh berikut:
import "rsc.io/quote"
Setelah kode Anda mengimpor paket tersebut, aktif kan pelacakan dependensi dan ambil kode paket untuk mengompilasi. Lebih lanjut, lihat Mengaktifkan pelacakan dependensi pada kode Anda dan Menambahkan dependensi.
Mengaktifkan pelacakan dependensi pada kode Anda
Untuk melacak dan mengatur dependensi yang Anda tambahkan, kita mulai dengan memasukkan kode Anda ke dalam modul-nya sendiri. Langkah ini akan membuat berkas go.mod pada direktori paling atas dari repositori Anda. Dependensi yang Anda tambahkan akan tercatat dalam berkas tersebut.
Untuk memasukkan kode Anda ke dalam sebuah modul, gunakan
perintah go mod init
.
Misalnya, lewat baris perintah, pindah lah ke direktori sumber kode Anda,
kemudian jalankan perintah berikut:
$ go mod init example.com/mymodule
Argumen dari perintah go mod init
adalah path ke modul Anda.
Jika memungkinkan, path dari modul seharusnya lokasi repositori dari sumber
kode Anda.
Jika Anda belum tahu lokasi dari repositori Anda, gunakan pengganti yang aman,
seperti nama dari domain yang Anda miliki atau example.com
, bersama dengan
path yang berisi nama modul atau direktori sumber kode.
Untuk lebih lanjut lihat
Penamaan sebuah modul
Saat Anda menggunakan perkakas Go untuk mengatur dependensi, perkakas tersebut akan memperbarui berkas go.mod untuk menyimpan daftar dependensi.
Saat Anda menambahkan dependensi, perkakas Go membuat sebuah berkas go.sum yang berisi checksum dari modul yang Anda pakai. Go menggunakan berkas go.sum untuk memverifikasi integritas dari berkas modul yang diunduh, terutama untuk pengembang lain yang bekerja dalam proyek Anda.
Masukan berkas go.mod dan go.sum ke dalam repositori berikut dengan kode Anda.
Lihat referensi go.mod untuk informasi lebih lanjut.
Penamaan sebuah modul
Saat Anda menjalankan perintah "go mod init <path-modul>" untuk membuat sebuah modul untuk melacak dependensi, Anda mengirim sebuah parameter path-modul yang berfungsi sebagai nama modul. Path dari modul menjadi prefiks untuk paket-paket dalam modul tersebut. Pastikan memberi nama path modul yang tidak konflik dengan path modul yang lain.
Sebuah path modul digunakan untuk menunjukkan asal dari modul, seperti nama sebuah perusahaan atau nama penerbit atau pemilik. Namun path tersebut juga bisa lebih deskriptif, menjelaskan tujuan dan/atau fungsi dari modul.
Path dari modul biasanya memiliki format berikut:
<prefiks>/<teks-penjelasan>
-
Prefiks biasanya sebuah string yang menjelaskan modul, seperti sebuah string yang menjelaskan asalnya. Ia bisa berupa:
-
Lokasi repositori tempat perkakas Go dapat mengambil sumber kode (dibutuhkan jika Anda akan menerbitkan modul).
Misalnya, ia bisa berbentuk
github.com/<nama-proyek>/
.Gunakan praktik ini jika Anda akan menerbitkan modul untuk orang lain. Untuk informasi lebih lanjut tentang penerbitan modul, lihat Pengembangan dan penerbitan modul.
-
Sebuah nama yang dapat Anda atur.
Jika Anda tidak menggunakan sebuah repositori, pastikan memilih prefiks yang Anda percaya tidak digunakan oleh orang lain. Pilihan yang baik biasanya berupa nama perusahaan Anda. Hindari istilah seperti
widgets
,utilities
, atauapp
.
-
-
Untuk teks-penjelasan, pilihan yang bagus yaitu nama proyek. Ingatlah bahwa nama paket lebih menjelaskan fungsionalitas. Path modul berfungsi sebagai sebuah namespace atau pengelompokan untuk nama-nama paket tersebut.
Prefiks path modul yang telah dipakai
Go menjamin kata-kata berikut tidak bisa digunakan sebagai nama paket.
-
test
— Anda bisa menggunakantest
sebagai prefiks pada path modul untuk modul yang dirancang menguji fungsi-fungsi di dalam modul lain.Gunakan prefiks
test
untuk modul-modul yang dibuat sebagai bagian dari sebuah tes. Misalnya, tes Anda bisa saja menjalankango mod init test
dan kemudian menyiapkan modul tersebut dengan cara tertentu untuk mengujinya dengan perkakas analisis Go. -
example
— Digunakan sebagai prefiks path modul pada beberapa dokumentasi Go, seperti tutorial-tutorial membuat modul untuk melacak dependensi.Ingatlah bahwa dokumentasi Go juga menggunakan
example.com
sebagai contoh bagi modul yang akan diterbitkan.
Menambahkan sebuah dependensi
Saat Anda mengimpor paket dari sebuah modul, Anda dapat menambahkan modul
tersebut ke dalam dependensi dengan menggunakan
perintah go get
.
Perintah tersebut melakukan hal-hal berikut:
-
Jika diperlukan, perintah tersebut akan menambahkan direktif
require
ke berkas go.mod untuk modul-modul yang dibutuhkan membangun name paket yang diberikan pada baris perintah. Sebuah direktifrequire
melacak versi minimum dari sebuah modul yang dibutuhkan oleh modul Anda. Lihat referensi go.mod untuk lebih lanjut. -
Jika diperlukan, ia akan mengunduh sumber kode modul supaya dapat mengompilasi paket-paket yang bergantung pada modul tersebut. Ia bisa mengunduh modul lewat sebuah modul proksi seperti proxy.golang.org atau langsung dari repositori. Sumber kode tersebut disimpan dalam tembolok lokal.
Anda dapat mengatur lokasi tempat perkakas Go mengunduh modul. Untuk lebih lanjut, lihat Menentukan peladen proksi modul.
Hal berikut menjelaskan beberapa contohnya.
-
Untuk menambahkan semua dependensi dari sebuah paket ke dalam modul, jalankan perintah seperti di bawah ("." mengacu ke paket dalam direktori sekarang):
$ go get .
-
Untuk menambahkan sebuah dependensi, tulis path modul sebagai argumen dari perintah
$ go get example.com/theirmodule
Perintah tersebut juga mengautentikasi setiap modul yang diunduh. Hal ini untuk memastikan bahwa modul tidak berubah setelah diterbitkan. Jika modul telah berubah sejak diterbitkan —misalnya, pengembang mengubah isi dari commit— perkakas Go akan menampikan pesan galat keamanan. Pemeriksaan autentikasi ini melindungi Anda dari modul yang mungkin telah dirusak.
Mengambil versi tertentu dari sebuah dependensi
Anda bisa mengambil versi tertentu dari sebuah modul dengan menentukan
versi-nya dalam perintah go get
.
Perintah tersebut memperbarui direktif require
dalam berkas go.mod
(walaupun sebenarnya Anda bisa menyunting secara manual).
Anda melakukan hal ini jika:
-
Anda ingin mengambil versi pra-rilis dari sebuah modul untuk mencobanya.
-
Anda menemukan bahwa versi yang sekarang Anda gunakan tidak bekerja dengan seharusnya, sehingga Anda ingin mengambil versi yang Anda tahu bekerja dengan benar.
-
Anda ingin meningkatkan atau menurunkan versi sebuah modul yang Anda butuhkan.
Berikut contoh-contoh untuk menggunakan
perintah go get
:
-
Untuk mendapatkan nomor versi tertentu, tambahkan path modul dengan tanda @ diikuti dengan versi yang Anda inginkan:
$ go get example.com/theirmodule@v1.3.4
-
Untuk mendapatkan versi terakhir, tambahkan path modul dengan
@latest
:$ go get example.com/theirmodule@latest
Berkas go.mod berikut mengilustrasikan contoh direktif require
(lihat
referensi go.mod
untuk lebih lanjut)
yang membutuhkan nomor versi tertentu:
require example.com/theirmodule v1.3.4
Menemukan pembaruan yang tersedia
Anda bisa memeriksa apakah ada versi terbaru dari dependensi yang Anda gunakan
dalam modul Anda.
Gunakan perintah go list
untuk mencetak daftar dari dependensi modul Anda,
berikut dengan versi terbaru yang tersedia untuk modul tersebut.
Saat Anda menemukan pembaruan, Anda bisa mencobanya pada kode Anda untuk
menentukan apakah bisa ditingkatkan ke versi yang baru atau tidak.
Untuk lebih lanjut tentang perintah go list
, lihat
go list -m
.
Berikut beberapa contoh.
-
Cetak semua dependensi dari modul Anda sekarang, berikut dengan versi terbaru yang tersedia:
$ go list -m -u all
-
Cetak versi terakhir yang tersedia pada modul tertentu:
$ go list -m -u example.com/theirmodule
Meningkatkan atau menurunkan versi dari sebuah dependensi
Anda bisa meningkatkan atau menurunkan nomor versi dari sebuah dependensi modul menggunakan perkakas Go dengan mencari versi yang tersedia kemudian menambahkan versi yang diinginkan sebagai dependensi.
-
Untuk menemukan daftar versi, gunakan perintah
go list
seperti yang dijelaskan dalam Menemukan pembaruan yang tersedia. -
Untuk mengatur dependensi ke versi tertentu, gunakan perintah
go get
seperti yang dijelaskan dalam Mengambil versi tertentu dari dependensi.
Sinkronisasi dependensi kode Anda
Anda bisa memastikan bahwa semua dependensi dari kode telah tersimpan atau semua dependensi dari paket-paket yang tidak diimpor lagi telah dihapus.
Hal ini bisa berguna saat Anda telah melakukan perubahan pada kode dan dependensi Anda, bisa jadi dengan membuat sekumpulan dependensi baru dan/atau mengunduh modul yang tidak lagi digunakan oleh paket dalam kode Anda.
Supaya dependensi Anda tetap rapi, gunakan perintah go mod tidy
.
Dari sekumpulan paket-paket yang diimpor dalam kode Anda, perintah ini
mengubah berkas go.mod untuk menambahkan modul yang dibutuhkan tapi belum
disimpan dalam go.mod.
Ia juga menghapus modul yang tidak digunakan.
Perintah tersebut tidak memiliki argumen kecuali satu opsi, -v, yang mencetak informasi tentang modul yang dihapus.
$ go mod tidy
Mengembang dan menguji kode modul yang belum diterbitkan
Anda bisa menentukan kode Anda supaya menggunakan dependensi yang mungkin tidak akan diterbitkan. Kode dari modul-modul ini bisa jadi dalam repositori-nya sendiri, dalam fork repositori-nya sendiri, atau dalam satu perangkat penyimpanan dengan modul yang sekarang.
Anda bisa melakukan hal ini saat:
-
Anda ingin membuat perubahan tersendiri terhadap kode modul eksternal, seperti setelah forking dan/atau cloning. Misalnya, Anda ingin menyiapkan perbaikan terhadap modul tersebut, kemudian mengirim perbaikan ke pengembang modul.
-
Anda mengembangkan modul baru dan belum menerbitkannya, jadi modul tersebut tidak tersedia dalam sebuah repositori yang dapat diambil oleh perintah
go get
.
Menggunakan kode modul dalam direktori lokal
Anda bisa menentukan bahwa kode dari modul yang dibutuhkan berada dalam perangkat yang sama dengan kode yang membutuhkannya. Hal ini bisa berguna bila Anda:
-
Mengembangkan modul Anda sendiri yang terpisah dan ingin mengujinya pada modul yang sekarang.
-
Memperbaiki isu atau menambah fitur pada modul eksternal dan ingin mengujinya pada modul yang sekarang. (Ingatlah bahwa Anda bisa menggunakan modul eksternal dari fork Anda sendiri. Untuk lebih lanjut, lihat Menggunakan kode modul eksternal dari fork repositori Anda.)
Untuk memberitahu perintah Go menggunakan salinan lokal dari kode modul,
gunakan direktif replace
dalam berkas go.mod untuk mengganti path modul
pada direktif require
.
Lihat
referensi go.mod
untuk informasi lebih lanjut tentang direktif tersebut.
Dalam contoh berkas go.mod berikut, modul yang sekarang membutuhkan modul
eksternal example.com/theirmodule
, dengan nomor versi yang tidak ada
(v0.0.0-unpublished
) digunakan untuk memastikan penggantian bekerja dengan
benar.
Direktif replace
kemudian mengganti path modul asli dengan ../theirmodule
,
sebuah direktori yang berada pada tingkat yang sama dengan direktori modul
yang sekarang.
module example.com/mymodule go 1.16 require example.com/theirmodule v0.0.0-unpublished replace example.com/theirmodule v0.0.0-unpublished => ../theirmodule
Saat menyiapkan pasangan require
/replace
, gunakan perintah
go mod edit
dan
go get
untuk memastikan kebutuhan-kebutuhan yang ada di dalam berkas tetap konsisten:
$ go mod edit -replace=example.com/theirmodule@v0.0.0-unpublished=../theirmodule $ go get -d example.com/theirmodule@v0.0.0-unpublished
Note
|
Saat menggunakan direktif replace , perkakas Go tidak mengautentikasi
eksternal modul seperti yang dijelaskan dalam
Menambahkan sebuah dependensi
|
Untuk informasi lebih lanjut tentang nomor versi, lihat Penomoran versi modul.
Menggunakan kode modul eksternal dari repositori fork Anda sendiri
Saat Anda telah mem-fork sebuah repositori dari modul eksternal (seperti memperbaiki isu dalam kode modul atau menambahkan sebuah fitur), Anda bisa mengatur supaya perkakas Go untuk menggunakan fork Anda tersebut sebagai pengganti dari modul asli. Hal ini bisa berguna untuk menguji perubahan pada kode Anda. (Ingatlah bahwa Anda bisa menggunakan modul eksternal lewat direktori di dalam lokal sistem. Untuk lebih lanjut, lihat Menggunakan kode modul dalam direktori lokal.)
Anda bisa melakukan hal ini dengan menggunakan direktif replace
dalam berkas
go.mod untuk mengganti path asli dari modul eksternal dengan path ke
fork dari repositori Anda.
Direktif tersebut mengarahkan perkakas Go supaya menggunakan path pengganti
(lokasi dari fork) saat mengompilasi, namun tetap menggunakan perintah
import
yang sama, tidak berubah dari path modul yang asli.
Untuk lebih lanjut tentang direktif replace
, lihat
referensi berkas go.mod.
Dalam contoh berkas go.mod berikut, modul yang sekarang membutuhkan modul
eksternal example.com/theirmodule
.
Direktif replace
kemudian mengganti path modul asli dengan
example.com/myfork/theirmodule
, sebuah fork dari repositori theirmodule
.
module example.com/mymodule go 1.16 require example.com/theirmodule v1.2.3 replace example.com/theirmodule v1.2.3 => example.com/myfork/theirmodule v1.2.3-fixed
Saat menyiapkan pasangan require
/replace
, gunakan perkakas Go untuk
memastikan bahwa kebutuhan-kebutuhan yang ada di dalam berkas tetap konsisten.
Gunakan perintah
go list
untuk melihat versi yang digunakan pada modul yang sekarang.
Kemudian gunakan perintah
go mod edit
untuk mengganti modul yang dibutuhkan dengan fork-nya:
$ go list -m example.com/theirmodule example.com/theirmodule v1.2.3 $ go mod edit -replace=example.com/theirmodule@v1.2.3=example.com/myfork/theirmodule@v1.2.3-fixed
Note
|
Saat Anda menggunakan direktif replace , perkakas Go tidak
mengautentikasi modul eksternal seperti yang dijelaskan dalam
Menambahkan sebuah dependensi.
|
Untuk lebih lanjut tentang nomor versi, lihat Penomoran versi modul.
Menggunakan versi commit sebagai versi dependensi modul
Anda dapat menggunakan perintah go get
untuk mengambil kode yang belum
dirilis dari sebuah modul dengan identifikasi commit tertentu yang ada dalam
repositori.
Untuk melakukan hal ini, gunakan perintah go get
, tentukan commit yang
Anda inginkan dengan tanda @
.
Saat menggunakan go get
, perintah tersebut akan menambah direktif
require
ke dalam berkas go.mod, menggunakan nomor versi-pseudo berdasarkan
detil tentang commit.
Berikut beberapa contoh penggunaan versi commit. Contoh ini berdasarkan pada sebuah modul yang sumber kodenya disimpan dalam repositori git.
-
Untuk menggunakan modul pada commit tertentu, gunakan format berikut @
commithash
:$ go get example.com/theirmodule@4cf76c2
-
Untuk menggunakan modul pada branch tertentu, gunakan format berikut @
branchname
:$ go get example.com/theirmodule@bugfixes
Menghapus sebuah dependensi
Saat kode Anda tidak lagi menggunakan paket-paket yang ada dalam sebuah modul, Anda dapat berhenti melacak modul tersebut sebagai dependensi.
Untuk menghapus semua modul yang sudah tidak digunakan lagi,
jalankan perintah
go mod tidy
.
Perintah ini secara otomatis akan menghapus semua modul dalam berkas go.mod
yang sudah tidak digunakan lagi.
$ go mod tidy
Untuk menghapus sebuah dependensi tertentu gunakan perintah
go get
,
dengan memberikan path modul dan menambahkan @none
, seperti pada contoh
berikut:
$ go get example.com/theirmodule@none
Perintah go get
akan menurunkan atau menghapus dependensi lain yang
bergantung pada modul yang dihapus.
Menentukan peladen proksi dari modul
Saat Anda menggunakan perkakas Go saat bekerja dengan modul, perkakas tersebut secara bawaan mengunduh modul-modul lewat proxy.golang.org (peladen modul publik yang disediakan oleh Google) atau secara langsung lewat modul repositori. Anda dapat menyuruh perkakas Go untuk menggunakan peladen proksi yang lain untuk mengunduh dan mengautentikasi modul.
Anda bisa saja melakukan hal ini jika Anda (atau tim Anda) telah menyiapkan atau memilih peladen proksi modul yang berbeda. Misalnya, beberapa orang menggunakan peladen proksi sendiri supaya memiliki kontrol lebih terhadap dependensi yang digunakan.
Untuk menentukan peladen proksi tertentu pada perkakas Go, set variabel
sistem GOPROXY
ke URL dari satu atau lebih peladen.
Perkakas Go akan mencoba setiap URL tersebut secara berurutan.
Secara bawaan, GOPROXY
berisi peladen proksi modul milik Google, kemudian
pengunduhan langsung dari modul repositori (seperti yang ditentukan dari
path modul):
GOPROXY="https://proxy.golang.org,direct"
Untuk lebih lanjut tentang variabel sistem GOPROXY
, termasuk nilai-nilai
yang mempengaruhi perilakunya, lihat
referensi perintah go
.
Anda dapat men-set variabel tersebut ke peladen proksi modul yang lain, dengan
memisahkan URL dengan sebuah karaketer koma atau batang (|
).
-
Saat Anda menggunakan koma, perkakas Go akan mencoba URL selanjutnya dari dalam daftar jika URL yang sekarang mengembalikan HTTP status kode 404 atau 410.
GOPROXY="https://proxy.example.com,https://proxy2.example.com"
-
Saat Anda menggunakan karakter batang (
|
), perkakas Go akan mencoba URL selanjutnya dalam daftar tanpa memeriksa HTTP status kode:GOPROXY="https://proxy.example.com|https://proxy2.example.com"