Kode yang hanya berjalan di laptop kita belum benar-benar selesai. Begitu analisis atau tool tersebut dipakai rekan tim atau klien, kita menghadapi pertanyaan deployment: bagaimana paket kode sampai ke tangan pengguna, dan apakah pengguna punya MATLAB dengan versi yang cocok. Chapter ini merakit paket distribusi minimal — folder proyek plus start.m dan README.md — lalu mengemasnya menjadi arsip dan mengujinya persis seperti komputer penerima. Cakupan materinya:
- opsi distribusi: share source, MATLAB Compiler, Apps, Web App Server, MATLAB Online
- persiapan kode: path relatif, guard versi MATLAB, kebersihan dari
userpath - paket distribusi: struktur folder +
README.md+start.m+ data minimal - MATLAB Runtime, lisensi, dan kompatibilitas versi
Opsi Distribusi Kode MATLAB #
Aturan praktisnya: pilih opsi distribusi berdasarkan satu pertanyaan — apakah penerima sudah punya MATLAB dan toolbox yang dibutuhkan kode kita? Mekanisme tiap opsi berbeda: ada yang membagikan source code, ada yang membungkusnya menjadi executable mandiri. Tabel berikut merangkum lima opsi utama:
| Opsi | Hasil distribusi | Prasyarat penerima | Cocok untuk |
|---|---|---|---|
Bagikan source (.m + start.m) | folder / arsip .zip | MATLAB + toolbox yang sama | tim internal |
MATLAB Compiler (mcc -m) | standalone executable | MATLAB Runtime (gratis) | klien tanpa MATLAB |
MATLAB Apps (.mlappinstall) | aplikasi di Apps gallery | MATLAB versi sesuai | tool internal interaktif |
| MATLAB Web App Server | aplikasi lewat browser | hanya browser + server | tim lintas platform |
| MATLAB Online | proyek di cloud MATLAB | akun MATLAB Online | kolaborasi jarak jauh |
Opsi termurah dan paling sering dipakai adalah membagikan source: cukup arsip .zip berisi folder proyek. Opsi paling berat adalah MATLAB Compiler, yang menerjemahkan pemanggilan fungsi menjadi aplikasi mandiri; penerima hanya memasang MATLAB Runtime yang gratis. Bentuk perintah dasarnya:
mcc -m -o aplikasiKonversi -a data.csv start.mPerintah mcc tersebut membaca start.m, mengikutsertakan data.csv ke dalam paket (-a), dan menghasilkan standalone executable bernama aplikasiKonversi (-o). Perintah mcc membutuhkan produk MATLAB Compiler dan hanya berjalan di MATLAB, bukan di GNU Octave — runner chapter ini tidak mengujinya.
Menyiapkan Kode Sebelum Dibungkus #
Aturan penyiapannya: kode harus berjalan dari folder mana pun, tanpa satu pun absolute path. Mekanismenya: fungsi mfilename('fullpath') mengembalikan path lengkap berkas yang sedang dieksekusi, sehingga fileparts() memotongnya menjadi folder induk, dan fullfile() merangkai subfolder relatif terhadap folder tersebut. Dengan begitu paket bekerja di lokasi ekstraksi mana pun. start.m berikut adalah titik masuk paket contoh kita:
tulisBaris(fullfile(g, 'start.m'), { ...
'% start.m - titik masuk distribusi', ...
'root = fileparts(mfilename(''fullpath''));', ...
'addpath(fullfile(root, ''src''));', ...
'fprintf(''distribusi siap: konversiSuhu(212) = %g C\n'', konversiSuhu(212));'});Mari kita bedah baris-baris kode di atas:
- Baris 1 (
tulisBaris(fullfile(g, 'start.m'), {...})): skripcontoh.mmenulis berkasstart.mke folder paket; isi berkas ditulis sebagai cell array satu baris per elemen. - Baris 2 (
% start.m - titik masuk distribusi): komentar menandai peran berkas — pengguna tinggal menjalankan satu berkas ini. - Baris 3 (
root = fileparts(mfilename('fullpath'))): folder paket dideteksi dari lokasistart.msendiri, bukan dari current folder atauuserpathpengguna. - Baris 4 (
addpath(fullfile(root, 'src'))): subfoldersrcmasuk ke MATLAB path hanya untuk sesi ini, sehingga fungsi di dalamnya dapat dipanggil. - Baris 5 (
fprintf(...) konversiSuhu(212)): pemanggilan pertama sekaligus uji asap:212derajat Fahrenheit harus menjadi100derajat Celsius.
Kode yang memakai fitur baru MATLAB sebaiknya memasang guard versi di awal, karena penerima bisa memakai release lebih lama:
if verLessThan('matlab', '9.1')
error('paket ini membutuhkan MATLAB R2016b atau lebih baru.');
endFungsi verLessThan membandingkan versi release yang sedang berjalan dengan nomor 9.1 (R2016b) dan mengembalikan true bila release lebih lama. Fungsi ini hanya ada di MATLAB — runner Octave mengembalikan exist('verLessThan') == 0 — sehingga snippet di atas diverifikasi lewat dokumentasi resmi, bukan dieksekusi runner.
Merakit Paket Distribusi #
Aturan paket minimum: satu folder berisi start.m, README.md, subfolder src untuk fungsi, dan data terkecil yang masih diperlukan. Mekanismenya: contoh.m chapter ini membangun paket mini di temporary folder (tempname menghasilkan nama unik), menulis tiga berkas, lalu membungkus semuanya:
g = tempname();
mkdir(g);
mkdir(fullfile(g, 'src'));
tulisBaris(fullfile(g, 'src', 'konversiSuhu.m'), { ...
'function c = konversiSuhu(f)', ...
'%KONVERSSUHU Konversi Fahrenheit ke Celsius.', ...
'c = (f - 32) * 5 / 9;', ...
'end'});Mari kita bedah baris-baris kode di atas:
- Baris 1-2 (
g = tempname(); mkdir(g)): folder paket dibuat di temporary directory — lokasi sengaja tidak permanen karena ini simulasi. - Baris 3 (
mkdir(fullfile(g, 'src'))): subfoldersrcmemisahkan fungsi dari titik masuk — struktur yang sama dengan proyek MATLAB besar. - Baris 4-8 (
tulisBaris(... konversiSuhu.m ...)): fungsi inti ditulis sebagai berkas biasa; paket berbagi source code, jadi penerima bisa membaca dan memodifikasinya.
Struktur akhir paket sebelum dikemas:
paket-konversi/
README.md -> persyaratan versi + cara pakai
start.m -> titik masuk, membangun path lokal
src/
konversiSuhu.m -> fungsi konversi Fahrenheit-CelsiusPengemasan memakai zip lewat system() — cara yang sama ketika kita membagikan arsip ke rekan:
z = [tempname(), '.zip'];
[st, ~] = system(['cd ' g ' && zip -r -q ' z ' .']);
fprintf('system(''zip -r -q ...''): status %d\n', st);
fprintf('arsip .zip dibuat: exist = %d\n', exist(z, 'file') > 0);Alur uji lengkap paket — bangun, kemas, ekstrak, jalankan, bersihkan — terlihat pada diagram berikut:
Menguji Paket Seperti Komputer Baru #
Aturan ujinya: paket harus dites dari folder ekstraksi yang bersih, bukan dari folder sumbernya. Mekanismenya: contoh.m mengekstrak arsip ke folder berbeda, berpindah ke sana, menjalankan start.m, lalu memverifikasi fungsi aktif hanya lewat path lokal:
e = tempname();
mkdir(e);
unzip(z, e);
cwdAsal = pwd();
cd(e);
run(fullfile(e, 'start.m'));
dd = dir(e);
berkas = sort({dd(~[dd.isdir]).name});
folder = {dd([dd.isdir]).name};
folder = folder(~ismember(folder, {'.', '..'}));
fprintf('struktur diekstraksi: %s + folder: %s\n', ...
strjoin(berkas, ', '), strjoin(sort(folder), ', '));
fprintf('fungsi aktif hanya lewat start.m (path lokal): %d\n', ...
~isempty(which('konversiSuhu')));Mari kita bedah baris-baris kode di atas:
- Baris 1-3 (
e = tempname(); mkdir(e); unzip(z, e)): arsip diekstrak ke folder “komputer baru” — tidak ada berkas sisa dari folder sumber. - Baris 4-6 (
cwdAsal = pwd(); cd(e); run(...)): direktori kerja dipindahkan sebelumstart.mdijalankan lewatrun, meniru apa yang dilakukan penerima. - Baris 7-10 (
dd = dir(e); berkas = ...; folder = ...): isi folder ekstraksi dihitung — file dan folder dipisahkan,.dan..dibuang. - Baris 11-13 (
fprintf('struktur diekstraksi: ...')): struktur hasil ekstraksi dicetak sebagai bukti arsip utuh. - Baris 14-15 (
~isempty(which('konversiSuhu'))):whichhanya menemukan fungsi bilaaddpathdistart.mberhasil — uji path relatif tanpa membukauserpath.
Output yang Dihasilkan (keseluruhan contoh.m):
== Bagian 1: bangun proyek mini ==
proyek-mini dibuat: src/konversiSuhu.m, start.m, README.md
== Bagian 2: kemas menjadi arsip ==
system('zip -r -q ...'): status 0
arsip .zip dibuat: exist = 1
== Bagian 3: uji dari lokasi ekstraksi ==
distribusi siap: konversiSuhu(212) = 100 C
struktur diekstraksi: README.md, start.m + folder: src
fungsi aktif hanya lewat start.m (path lokal): 1
== Bagian 4: pembersihan ==
proyek, ekstraksi dihapus; arsip dihapus: 0 0 0Angka 0 0 0 pada baris terakhir berasal dari tiga exist setelah pembersihan: folder proyek, folder ekstraksi, dan arsip semuanya sudah terhapus, jadi tidak ada residue yang tertinggal.
MATLAB Runtime dan Catatan Lisensi #
Aturan Compiler: aplikasi hasil mcc -m tidak membutuhkan MATLAB berbayar, tetapi membutuhkan MATLAB Runtime. Mekanismenya: Runtime berisi pustaka numerik dan grafis versi headless yang dipakai executable saat berjalan; ukurannya besar (urutan gigabyte), dan tiap versi Runtime hanya menjalankan aplikasi yang dikompilasi dengan release MATLAB yang persis sama. Konsekuensinya: sertakan tautan pengunduh Runtime release yang tepat, atau ikutkan instalernya di dalam paket.
Dua catatan penutup: pertama, bila kita membagikan source lewat File Exchange, unggahan jatuh di bawah File Exchange license — kita tetap pemegang hak cipta, tetapi periksa daftar toolbox yang dipakai kode karena penerima memerlukan lisensi yang sama. Kedua, kompatibilitas versi: kode .m lama umumnya tetap berjalan di MATLAB baru (MathWorks menjaga backward compatibility), sedangkan kode yang memakai fitur baru gagal di release lama — guard verLessThan di atas menangkap kasus tersebut dengan pesan galat yang jelas.
Ringkasan #
Paket distribusi minimum terdiri dari satu folder berisi start.m (membangun path relatif lewat fileparts(mfilename('fullpath')) + addpath), README.md berisi persyaratan dan cara pakai, serta subfolder src untuk fungsi. Skrip contoh.m membuktikan siklusnya di Octave: paket mini tiga berkas dibangun, dikemas zip (status 0), diekstrak ke folder “komputer baru”, konversiSuhu(212) menghasilkan tepat 100 C, which mengonfirmasi fungsi aktif lewat path lokal, dan pembersihan meninggalkan 0 0 0 residue. Untuk penerima tanpa MATLAB, MATLAB Compiler mengubah paket yang sama menjadi standalone executable dengan syarat MATLAB Runtime ber-versi cocok.