Lingkungan (environment) adalah kumpulan proyek yang menentukan package mana yang terlihat oleh Julia pada satu saat, sedangkan registry adalah katalog package yang dapat dipasang. Topik ini membahas depot sebagai penyimpanan seluruh pekerjaan Pkg, susunan stack lingkungan pada LOAD_PATH, lingkungan bernama, serta registry General sebagai sumber utama package. Setelah topik ini dipraktikkan, alasan sebuah package ditemukan atau tidak ditemukan dapat dilacak pada susunan lingkungan yang aktif.
Depot dan isinya#
Depot adalah folder yang menampung seluruh pekerjaan Pkg, yaitu package yang sudah diinstal, cache hasil kompilasi, registry yang terdaftar, dan lingkungan bernama. Lokasi bawaannya adalah folder .julia pada direktori rumah pengguna, dan jalur itu dapat dialihkan ke tempat lain melalui variabel lingkungan JULIA_DEPOT_PATH. Pemisahan depot sangat berguna pada mesin kerja bersama, karena setiap kebutuhan dapat diberi depot sendiri tanpa saling mengganggu.
println(basename(DEPOT_PATH[1]))
println(sort(readdir(joinpath(DEPOT_PATH[1], "environments"))))depot
["v1.13"]Pada contoh di atas, DEPOT_PATH adalah daftar jalur depot yang sedang berlaku, dan entri pertamanya menjadi tempat utama pekerjaan Pkg. Kode pada contoh menampilkan nama folder terakhir pada jalur depot aktif, bukan jalur lengkapnya, karena jalur lengkap berbeda antarmesin. Folder environments di dalam depot menampung lingkungan bernama, dan pada instalasi baru hanya lingkungan bawaan v1.13 yang terdapat di sana. Lingkungan bawaan inilah yang aktif apabila tidak ada proyek yang diaktifkan.
Stack lingkungan pada LOAD_PATH#
Julia mencari package melalui daftar lingkungan yang disebut LOAD_PATH. Nilai bawaannya terdiri atas tiga entri, yaitu @ untuk lingkungan proyek yang sedang aktif, @v#.# untuk lingkungan bernama mengikuti versi Julia, dan @stdlib untuk pustaka standar. Pencarian berlangsung berurutan dari entri pertama, sehingga package yang tercatat pada proyek aktif selalu diutamakan daripada package bernama sama di lingkungan lain.
using Test
println(Base.LOAD_PATH)
println(nameof(Test), " adalah modul pustaka standar")["@", "@v#.#", "@stdlib"]
Test adalah modul pustaka standarBaris terakhir pada contoh memeriksa bahwa pustaka standar Test terlihat oleh sesi aktif tanpa perlu diinstal. Hal itu terjadi karena entri @stdlib pada LOAD_PATH membuat seluruh pustaka standar tersedia secara otomatis. Susunan tiga entri ini diilustrasikan pada diagram berikut, yang menunjukkan urutan pencarian dari proyek aktif menuju pustaka standar.
Nilai LOAD_PATH dapat disesuaikan melalui variabel lingkungan JULIA_LOAD_PATH atau langsung dengan push! pada Base.LOAD_PATH. Proyek yang memakai package pustaka umum bersama banyak proyek lain dapat menyimpannya pada lingkungan bernama khusus, lalu menambahkan nama lingkungan itu ke LOAD_PATH, sehingga proyek tidak perlu mengulang add untuk setiap package tersebut.
Lingkungan bernama#
Lingkungan bernama adalah lingkungan yang dikenali Pkg melalui nama, berbeda dari proyek yang dikenali melalui jalur folder. Lingkungan bawaan v1.13 adalah lingkungan bernama yang menjadi tujuan add apabila tidak ada proyek yang aktif. Lingkungan bernama baru dibuat dengan Pkg.activate("nama") tanpa proyek aktif, dan setelahnya folder tersebut tersimpan pada environments/nama di dalam depot.
(@v1.13) pkg> activate alat-umum
Activating environment at `~/tools/depot/environments/alat-umum/Project.toml`
(@alat-umum) pkg> add BenchmarkTools
Resolving package versions...
Updating `~/tools/depot/environments/alat-umum/Project.toml`
[6e4b80f9] + BenchmarkTools v1.6.3
(@alat-umum) pkg> status
Status `~/tools/depot/environments/alat-umum/Project.toml`
[6e4b80f9] BenchmarkTools v1.6.3Transkrip di atas memperlihatkan pembuatan lingkungan bernama alat-umum dan pemasangan satu package ke dalamnya. Lingkungan seperti ini cocok untuk package alat yang dipakai lintas proyek, misalnya BenchmarkTools untuk pengukuran waktu. Proyek tetap mencantumkan package yang dipakai langsung oleh kodenya, sedangkan lingkungan bernama menyimpan package yang dipakai secara eksploratif melalui stack.
Registry General#
Registry adalah katalog yang menyediakan nama package, UUID, nomor versi, dan checksum untuk diunduh. Julia memakai registry umum bernama General sebagai sumber bawaan, dan registry ini terunduh otomatis pada operasi add pertama. Seluruh package yang dipakai pada jalur ini, mulai dari BenchmarkTools hingga DataFrames, tersedia pada General sehingga tidak perlu registry tambahan.
Perintah registry status pada mode package menampilkan registry yang terdaftar pada depot, sedangkan registry add mendaftarkan registry lain, misalnya registry internal organisasi. Setiap operasi resolusi membaca registry terdaftar untuk menemukan versi yang tersedia, sehingga registry yang kedaluwarsa dapat membuat package terbaru tidak terlihat. Perintah registry update menyegarkannya. Pada pekerjaan yang memakai package bersumber dari beberapa registry, nama registry dapat dituliskan pada perintah add untuk memilih sumbernya secara eksplisit.
Kesalahan umum#
Kesalahan pertama adalah menempatkan package tanpa membedakan proyek dan lingkungan bernama. Package yang dipakai langsung oleh kode proyek wajib tercatat pada Project.toml proyek tersebut, dan keberadaannya pada lingkungan bawaan tidak menggantikan catatan itu. Proyek yang bergantung pada isi @v1.13 gagal dibangun pada mesin lain yang lingkungannya berbeda. Karena itu, graf dependensi setiap proyek selalu dinyatakan sendiri.
Kesalahan kedua adalah melupakan urutan LOAD_PATH saat nama package bertabrakan. Apabila dua lingkungan pada stack memuat package dengan nama yang sama, entri yang lebih depan diutamakan tanpa peringatan, dan perilaku program berubah mengikuti lingkungan yang diaktifkan. Pemeriksaan pathof(NamaPackage) pada sesi kerja menampilkan asal berkas package yang sedang dimuat, sehingga sumber tabrakan dapat ditemukan. Terakhir, registry yang tidak pernah diperbarui membuat add gagal menemukan versi yang sudah terbit. Perintah registry update menyelesaikannya.
Ringkasan#
- Depot menampung package, cache kompilasi, registry, dan lingkungan bernama, dengan jalur yang dapat dialihkan melalui
JULIA_DEPOT_PATH. - LOAD_PATH terdiri atas entri berurutan
@,@v#.#, dan@stdlib, sehingga proyek aktif menimpa lingkungan bawaan dan pustaka standar selalu terlihat. - Lingkungan bernama cocok untuk package alat lintas proyek, dan registry General menjadi sumber bawaan seluruh package pada jalur ini.
Referensi#
- Environments — Pkg.jl — Dokumentasi resmi proyek, lingkungan bernama, dan LOAD_PATH.
- Frequently Asked Questions — Pkg.jl — Penjelasan depot, registry, dan kebiasaan kerja yang dianjurkan.
- Environment Variables — Julia manual
— Daftar variabel lingkungan Julia termasuk
JULIA_DEPOT_PATHdanJULIA_LOAD_PATH.