Go 1.18 menambahkan fitur ruang kerja (workspace) ke Go, yang membuat kita dapat bekerja dengan beberapa modul secara simultan.

Anda dapat mengunduh Go 1.18 (atau yang terbaru) dengan mengunjungi halaman unduh.

Halaman catatan rilis menjelaskan lebih rinci tentang semua perubahan pada rilis Go 1.18.

Ruang kerja Go

Ruang kerja pada Go 1.18 membuat kita dapat bekerja dengan banyak modul secara bersamaan tanpa harus menyunting berkas "go.mod" pada setiap modul. Setiap modul dalam sebuah ruang kerja diperlakukan sebagai modul utama saat mencari dependensi.

Sebelumnya, untuk menambahkan sebuah fitur ke dalam modul dan memakainya di modul yang lain, kita harus menerbitkan perubahan tersebut terlebih dahulu pada modul yang pertama, atau menyunting berkas go.mod dan mengganti modul yang ingin kita uji tersebut dengan direktif replace menunjuk ke direktori di lokal, yang belum diterbitkan. Supaya tidak salah saat menerbitkan, kita harus menghapus direktif replace dari berkas "go.mod" setelah kita menerbitkan perubahan yang dilakukan pada modul yang pertama.

Dengan ruang kerja Go, kita mengontrol semua dependensi menggunakan berkas "go.work" di dalam direktori paling atas dari ruang kerja kita. Berkas "go.work" memiliki direktif use dan replace yang menimpa setiap berkas "go.mod", sehingga tidak perlu menyunting setiap berkas "go.mod" satu per satu.

Sebuah ruang kerja Go dibuat dengan menjalankan "go work init" dengan argumen berupa daftar direktori dari modul di lokal kita yang dipisahkan oleh spasi. Perintah init membuat berkas "go.work" yang berisi daftar modul dalam ruang kerja tersebut. Jika kita menjalankan "go work init" tanpa argumen, perintah tersebut akan membuat sebuah ruang kerja kosong.

Untuk menambahkan modul ke dalam ruang kerja, jalankan "go work use [moddir]" atau secara manual menyunting berkas "go.work". Jalankan "go work use -r $DIR" untuk menambahkan modul yang ada di dalam direktori $DIR secara rekursif. Jika sebuah direktori tidak memiliki berkas "go.mod", atau direktori tersebut sudah tidak ada lagi, maka direktif use untuk direktori tersebut akan secara otomatis dihapus dari dalam berkas "go.work".

Sintak dari berkas "go.work" mirip dengan berkas "go.mod" dan berisi direktif-direktif berikut:

  • go: menandakan versi perkakas go, misalnya "go 1.18"

  • use: menambahkan sebuah modul di lokal ke dalam kumpulan modul-modul utama untuk sebuah ruang kerja. Argumen dari direktif ini yaitu path relatif ke direktori yang berisi berkas "go.mod". Direktif ini tidak menambahkan sub-modul yang ada di dalam sebuah modul secara otomatis.

  • replace: mirip dengan direktif replace pada berkas go.mod, sebuah direktif replace menimpa versi tertentu dari sebuah modul dengan versi yang ditemukan di tempat lain.

Alur kerja

Ruang kerja Go sangat fleksibel dan mendukung beragam alur kerja. Bagian-bagian selanjutnya menjelaskan secara singkat beberapa alur kerja yang menurut kami sangat umum digunakan.

Menambahkan fitur ke modul lain dan menggunakan di modul kita

  1. Buat sebuah direktori untuk ruang kerja.

  2. Salin modul lain yang akan kita ubah di lokal.

  3. Tambahkan fitur pada modul lain tersebut.

  4. Jalankan "go work init [path-ke-modul-lain]" di dalam direktori ruang kerja.

  5. Buat perubahan pada modul kita yang menggunakan fitur yang baru kita tambahkan pada modul lain tersebut.

  6. Jalankan "go work use [path-ke-modul-kita]" di dalam direktori ruang kerja.

    Perintah "go work use" menambahkan path dari modul kita ke dalam berkas "go.work":

    go 1.18
    
    use (
    	./path-ke-modul-lain
    	./path-ke-modul-kita
    )
  7. Jalankan pengujian pada modul kita berdasarkan fitur yang baru ditambahkan.

  8. Terbit kan modul lain dengan fitur baru tersebut

  9. Terbit kan modul kita yang telah berisi penggunaan fitur dari modul lain tersebut.

Bekerja dengan banyak modul dalam satu repositori

Saat bekerja dengan banyak modul dalam satu repositori, berkas "go.work" mendefinisikan ruang kerja itu sendiri, bukan menggunakan direktif replace di setiap berkas "go.mod".

  1. Buat sebuah direktori untuk ruang kerja.

  2. Salin repositori yang berisi modul-modul yang akan kita ubah. Modul-modul tersebut tidak harus berada di dalam direktori yang sama dengan ruang kerja, karena kita dapat menentukan path relatif dengan menggunakan direktif use nantinya.

  3. Jalankan "go work init [path-ke-modul-satu] [path-ke-modul-dua]" di dalam direktori ruang kerja.

    Contoh: Kita sedang mengerjakan modul "example.com/x/tools/groundhog" yang bergantung pada paket-paket lain yang ada di modul "example.com/x/tools".

    Kita salin repositori "example.com/x/tools" ke dalam direktori bernama "tools" dan menjalankan "go work init tools tools/groundhog" di dalam direktori ruang kerja.

    Isi dari berkas "go.work" akan seperti berikut:

    go 1.18
    
    use (
    	./tools
    	./tools/groundhog
    )

    Setiap perubahan yang dibuat dalam modul "tools" akan dapat digunakan oleh "tools/groundhog" di dalam ruang kerja tersebut.

Mengganti dependensi

Untuk menguji modul-modul kita dengan konfigurasi dependensi yang berbeda, kita bisa membuat banyak ruang kerja dengan berkas "go.work" yang terpisah, atau tetap dengan satu ruang kerja tapi menutup penggunaan direktif use yang tidak kita gunakan dalam berkas "go.work".

Untuk membuat banyak ruang kerja:

  1. Buat direktori-direktori terpisah dengan kebutuhan dependensi yang berbeda-beda.

  2. Jalankan "go work init" di setiap direktori ruang kerja tersebut.

  3. Tambahkan dependensi yang kita inginkan di setiap direktori ruang kerja lewat perintah "go work use [path-ke-dependensi]".

  4. Jalankan "go run [path-ke-modul-utama]" di setiap ruang kerja untuk menggunakan dependensi yang ditentukan oleh berkas "go.work".

Untuk mencoba dependensi yang berbeda dalam ruang kerja yang sama, bukalah berkas "go.work" dan tambah atau tutup dependensi yang kita inginkan atau tidak gunakan.

Masih menggunakan GOPATH?

Mungkin dengan menggunakan ruang kerja akan mengubah pikiran Anda. Pengguna GOPATH dapat menggunakan dependensi menggunakan berkas "go.work" yang berada di direktori utama dari GOPATH. Ruang kerja Go tidak bertujuan untuk membuat ulang alur kerja pada GOPATH, namun ia membuat sebuah pengaturan yang memiliki kesamaan dengan GOPATH dengan kelebihan penggunaan modul-modul.

Untuk membuat sebuah ruang kerja untuk GOPATH:

  1. Jalankan "go work init" di dalam direktori GOPATH.

  2. Untuk menggunakan modul lokal atau versi tertentu sebagai dependensi dari ruang kerja kita, jalankan "go work use [path-ke-modul]".

  3. Untuk menimpa dependensi yang sudah ada dalam berkas "go.mod" kita, gunakan "go work replace [path-ke-modul]".

  4. Untuk menambahkan semua modul di dalam GOPATH atau direktori apa pun, jalankan "go work -r" yang secara rekursif menambahkan direktori-direktori yang berisi berkas "go.mod" ke ruang kerja. Jika sebuah direktori tidak lagi berisi berkas "go.mod", atau sudah tidak ada lagi, maka direktif use dari direktori tersebut akan dihapus dari berkas "go.work".

    Note
    Jika kita memiliki proyek yang tidak menggunakan berkas "go.mod" dan ingin ditambahkan ke dalam ruang kerja Go, masuk lah ke dalam direktori proyek tersebut dan jalankan "go mod init", kemudian tambahkan proyek tersebut ke dalam ruang kerja dengan cara "go work use [path-ke-proyek]".

Perintah-perintah pada ruang kerja

Selain "go work init" dan "go work use", Go 1.18 juga memperkenalkan perintah-perintah berikut untuk ruang kerja:

  • go work sync: simpan dependensi yang ada di dalam berkas "go.work" kembali ke dalam berkas "go.mod" di setiap modul-modul di ruang kerja.

  • go work edit: menyediakan antar muka untuk menyunting "go.work", biasanya digunakan oleh perkakas atau skrip.

Perintah pembangunan yang mengerti Go modul dan beberapa sub perintah dari "go mod" memeriksa variabel lingkungan GOWORK untuk menentukan apakah konteks mereka sedang bekerja dalam ruang kerja atau bukan.

Mode ruang kerja akan otomatis aktif bila variabel GOWORK berisi path ke sebuah berkas yang berakhiran ".work". Untuk mengetahui berkas "go.work" yang sedang digunakan, jalankan "go env GOWORK". Keluaran akan kosong bila perintah go tidak sedang dalam mode ruang kerja.

Bila mode ruang kerja aktif, berkas "go.work" akan dibaca untuk menentukan tiga parameter bagi mode ruang kerja: versi Go, daftar direktori, dan daftar pengganti modul.

Beberapa perintah berikut dapat Anda coba dalam mode ruang kerja (dengan syarat Anda sudah tahu penggunaannya!):

go work init
go work sync
go work use
go list
go build
go test
go run
go vet

Peningkatan penyuntingan

Kami sangat gembira dengan pembaruan terhadap peladen bahasa Go gopls dan ekstensi Go pada VSCode yang membuat bekerja pada banyak modul pada editor yang kompatibel dengan LSP sangat mudah dan menyenangkan.

Mencari referensi, penyelesaian kode, dan mencari definisi; bekerja dengan baik antar modul dalam sebuah ruang kerja. Versi 0.8.1 dari gopls memperkenalkan diagnostik, penyelesaian, pemformatan dari berkas "go.work". Anda bisa menggunakan figure gopls tersebut pada penyunting yang mendukung LSP.

Catatan untuk penyunting tertentu

Rilis vscode-go yang terbaru membolehkan akses cepat ke berkas ruang kerja lewat menu "Quick Pick".

https://user-images

Penyunting GoLand mendukung ruang kerja dan berencana menambahkan warna sintaksis dan penyelesaian kode untuk berkas "go.work".

Untuk informasi lebih lanjut tentang penggunaan gopls dengan penyunting yang berbeda lihat dokumentasi gopls

Selanjutnya?