Topik ini menjelaskan application sebagai unit pengemasan dan kehidupan kode Erlang: metadata di berkas .app, callback start/2, urutan start, dan cara aplikasi dinyatakan bergantung pada aplikasi lain. Setelah membaca, kumpulan modul dan supervisor dari topik gen_server dan supervisor dapat dimulai dan dihentikan sebagai satu kesatuan.
Application sebagai unit kehidupan#
Kata application pada OTP tidak berarti program yang dijalankan pengguna, melainkan unit yang mengikat modul, proses, dan konfigurasi menjadi satu kesatuan yang dapat dimulai dan dihentikan bersama. Kernel dan stdlib adalah dua aplikasi bawaan yang selalu berjalan, dan setiap proyek rebar3 dari modul Mengenal Erlang menghasilkan satu aplikasi dari templat .app.src-nya. Application menjawab tiga pertanyaan operasional: modul apa yang dimiliki, proses apa yang harus hidup, dan aplikasi apa yang harus sudah jalan sebelum aplikasi ini mulai.
Berkas .app dan callback#
Metadata aplikasi hidup di berkas .app, dan proyek rebar3 menuliskannya sebagai templat di src/tiketapp.app.src yang diproses saat build. Berkas berikut, ditempatkan di folder ebin, cukup untuk memulai aplikasi pada topik ini:
{application, tiketapp, [
{description, "Layanan antrean tiket"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib]},
{mod, {tiket_app, []}}
]}.Kunci applications menyatakan dependensi, dan kunci mod menunjuk modul callback beserta argumennya. Callback mengimplementasikan behaviour application dan bertugas memulai pohon supervisi:
-module(tiket_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_Jenis, _Arg) -> sup_tiket:start_link().
stop(_State) -> ok.start/2 mengembalikan hasil start_link supervisor, sehingga proses akar pohon terikat langsung ke umur aplikasi. Saat aplikasi dihentikan, OTP menghentikan pohon secara tertib dari daun ke akar, lalu memanggil stop/1.
Memulai dan menghentikan#
Dengan berkas .app dan semua modul yang telah dikompilasi ke folder ebin, aplikasi dimulai dari shell dengan satu fungsi:
Erlang/OTP 29 [erts-17.1.1] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]
Eshell V17.1.1 (press Ctrl+G to abort, type help(). for help)
1> application:ensure_all_started(tiketapp).
{ok,[tiketapp]}
2> application:which_applications().
[{tiketapp,"Layanan antrean tiket","0.1.0"},
{stdlib,"ERTS CXC 138 10","8.1.1"},
{kernel,"ERTS CXC 138 10","11.0.4"}]
3> tiket:ambil().
{error,kosong}
4> tiket:masuk(7).
ok
5> tiket:ambil().
{ok,7}
6> application:stop(tiketapp).
=INFO REPORT==== 3-Nov-2026::11:35:58.295893 ===
application: tiketapp
exited: stopped
type: temporary
ok
7> whereis(tiket).
undefinedensure_all_started/1 memeriksa seluruh rantai dependensi dan memulai yang belum jalan, sehingga pemanggil tidak mengurutkan apa pun sendiri. which_applications/0 menunjukkan aplikasi yang hidup beserta deskripsi dan versinya, dan daftar itu terbaca seperti inventaris VM yang sedang berjalan. Setelah stop/1, laporan informasi mengonfirmasi penghentian, dan whereis/1 menegaskan proses tiket sudah tidak ada.
Dependensi dan included application#
Kunci applications pada berkas .app adalah pernyataan urutan mulai, bukan sekadar daftar: VM menjamin setiap aplikasi di daftar itu sudah berjalan sebelum start/2 dipanggil, dan pemeriksaan ensure_all_started/1 mengikuti rantai itu sampai ke bawah. Aturan praktisnya, kernel dan stdlib selalu didaftarkan, lalu setiap aplikasi pustaka yang modulnya dipanggil. Bentuk yang lebih rapat, included application, meletakkan pohon supervisi aplikasi lain di bawah pohon sendiri sehingga keduanya hidup dan mati bersama. Bentuk ini membutuhkan penataan supervisi tambahan agar urutan penghentiannya terkendali, dan pemakaiannya jauh lebih jarang daripada dependensi biasa karena kebanyakan kebutuhan terjawab oleh rantai applications biasa.
Lingkungan konfigurasi aplikasi#
Kunci env pada berkas .app menyimpan konfigurasi bawaan aplikasi, dan nilainya dibaca dari mana saja lewat application:get_env/2. Variasi berkas .app berikut menambahkan kunci batas:
{application, tiketapp, [
{description, "Layanan antrean tiket"},
{vsn, "0.1.0"},
{applications, [kernel, stdlib]},
{env, [{batas, 100}]},
{mod, {tiket_app, []}}
]}.Pembacaannya setelah aplikasi berjalan:
1> application:ensure_all_started(tiketapp).
{ok,[tiketapp]}
2> application:get_env(tiketapp, batas).
{ok,100}Nilai bawaan ini bisa ditimpa saat start lewat argumen aplikasi atau berkas konfigurasi VM, sehingga nilai di .app menjadi default yang aman, bukan satu-satunya sumber. Callback start/2 menerima argumen kedua dari kunci mod, yang dipakai untuk meneruskan konfigurasi yang tidak praktis dinyatakan sebagai variabel lingkungan.
Application di proyek rebar3#
Proyek rebar3 dari topik penyiapan sudah menghasilkan semua bagian ini secara otomatis: templat src/nama.app.src menjadi berkas .app saat build, kunci applications di templatnya telah berisi kernel dan stdlib, dan perintah rebar3 shell memulai aplikasi proyek sebelum menyerahkan prompt kepada pemakai. Perbedaan dengan contoh manual pada topik ini hanya alatnya: rebar3 mengompilasi ke folder _build, menyusun berkas .app dari templat, dan mengurus kode path, sedangkan kontraknya persis sama. Karena itu, memahami siklus ensure_all_started dan stop di atas membuat perilaku rebar3 shell menjadi terbaca dan dapat dijelaskan.
Ringkasan#
- Application adalah unit yang mengikat modul, proses, dan konfigurasi untuk dimulai dan dihentikan bersama.
- Berkas .app menyatakan metadata, dependensi pada kunci applications, dan callback pada kunci mod.
- Callback application start/2 memulai pohon supervisi, dan stop/1 berjalan setelah pohon dihentikan dari daun ke akar.
- ensure_all_started/1 menuntaskan rantai dependensi otomatis, dan which_applications/0 membaca inventaris VM yang berjalan.
- Kunci env menyimpan konfigurasi bawaan yang dibaca application:get_env/2 dan dapat ditimpa saat start.
Referensi#
- Erlang Design Principles: Applications — Ericsson — Dokumentasi resmi aplikasi, berkas .app, dan callback-nya.
- application — Ericsson — Dokumentasi resmi fungsi ensure_all_started, which_applications, dan stop.
- Rebar3 Documentation — Erlang Ecosystem Foundation — Penanganan berkas .app.src dan build aplikasi oleh rebar3.