Membangun dan Menjalankan

Siklus dotnet new, dotnet run, dan dotnet build beserta perbedaan konfigurasi Debug dan Release.

Daftar isi

Topik ini membahas siklus kerja program .NET yang sudah tumbuh melampaui satu berkas, yaitu membuat proyek dengan dotnet new, menjalankannya dengan dotnet run, dan mengompilasinya dengan dotnet build. Perbedaan konfigurasi build Debug dan Release juga dijelaskan karena keduanya menghasilkan program yang sama dengan cara penanganan yang berbeda. Setelah topik ini diselesaikan, pembuatan proyek, eksekusi, dan penyiapan build untuk dibagikan dapat dilakukan dari terminal.

Membuat proyek dengan dotnet new#

Proyek adalah folder yang memuat kode sumber beserta berkas konfigurasi .csproj yang mendeskripsikan cara program dibangun. Perintah dotnet new menghasilkan proyek baru dari sebuah template, yaitu rangkaian berkas awal yang sudah siap diedit. Opsi -o menentukan folder tujuannya, sehingga perintah berikut membuat proyek console bernama HaloApp di dalam folder kerja sementara.

bash
# buat proyek console baru di folder kerja sementara; hanya baris penting yang ditampilkan
rm -rf /tmp/cs-dasar/HaloApp
dotnet new console -o /tmp/cs-dasar/HaloApp | grep "created successfully"
text Keluaran
The template "Console App" was created successfully.

Baris dotnet new juga mencetak pesan pemulihan package (restore) yang memuat jalur absolut dan lama prosesnya, sehingga keluaran di atas hanya menampilkan baris yang penting. Pemulihan itu mengunduh dan mengaitkan dependensi proyek ke folder package global, dan pada proyek console polos tidak ada dependensi selain library standar .NET. Proyek hasil perintah tersebut berisi dua berkas, yaitu HaloApp.csproj dan Program.cs. Isi HaloApp.csproj-nya sebagai berikut.

xml Contoh: isi berkas HaloApp.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Elemen TargetFramework menunjukkan versi .NET yang menjadi target build, dan pada SDK 10 nilainya net10.0. Bila SDK yang terpasang adalah versi lain, nilainya menyesuaikan secara otomatis, misalnya net8.0. Dua elemen terakhir mengaktifkan implicit usings, yaitu pemakaian namespace umum secara otomatis, dan nullable reference type yang dibahas pada topik tersendiri.

Menjalankan dengan dotnet run#

Perintah dotnet run menggabungkan tiga langkah sekaligus, yaitu pemulihan package, kompilasi, dan eksekusi program hasil kompilasinya. Perintah ini dicari dari proyek pada folder kerja saat itu, sehingga dipanggil dari dalam folder proyek. Isi Program.cs bawaan template diganti dengan program berikut yang berada di samping halaman ini.

csharp Program.cs
// Program sederhana untuk menguji siklus dotnet new, dotnet run, dan dotnet build.
Console.WriteLine("Proyek HaloApp berhasil dibuat.");
Console.WriteLine("Kode yang sama berjalan pada konfigurasi Debug maupun Release.");
text Keluaran
Proyek HaloApp berhasil dibuat.
Kode yang sama berjalan pada konfigurasi Debug maupun Release.

Salin berkas tersebut ke proyek, kemudian jalankan proyeknya dengan urutan perintah berikut.

bash
# salin Program.cs ke proyek, lalu kompilasi dan jalankan sekaligus
cp Program.cs /tmp/cs-dasar/HaloApp/Program.cs
cd /tmp/cs-dasar/HaloApp && dotnet run
text Keluaran
Proyek HaloApp berhasil dibuat.
Kode yang sama berjalan pada konfigurasi Debug maupun Release.

Setiap kali dotnet run dipanggil, proyek diperiksa dan hanya bagian yang berubah yang dikompilasi ulang. Perubahan kode sumber cukup diikuti dengan menjalankan ulang perintah yang sama, sehingga dotnet run menjadi cara tercepat untuk menguji program selama pengembangan.

Mengompilasi dengan dotnet build#

Perintah dotnet build mengompilasi proyek tanpa menjalankannya. Hasil kompilasi diletakkan di folder bin di dalam folder proyek, lengkap dengan berkas .dll yang dapat dieksekusi runtime .NET. Pemisahan langkah build dari langkah run berguna ketika hanya validasi kompilasi yang diinginkan, misalnya sebelum kode dikirim ke repository.

bash
# kompilasi proyek dalam konfigurasi default; hanya baris penting yang ditampilkan
cd /tmp/cs-dasar/HaloApp
dotnet build | grep -E "Build succeeded|Warning\(s\)|Error\(s\)"
text Keluaran
Build succeeded.
    0 Warning(s)
    0 Error(s)

Keluaran lengkap perintah ini memuat lama proses dan jalur absolut yang berubah-ubah antar mesin, sehingga keluaran di atas hanya menampilkan ringkasannya. Angka nol pada baris Warning(s) dan Error(s) menunjukkan kompilasi bersih. Kompilator juga dapat menampilkan warning (peringatan), yaitu kode yang sah untuk dijalankan tetapi berpotensi menimbulkan perilaku yang tidak diinginkan. Peringatan tidak menggagalkan build, tetapi daftar kosongnya merupakan kondisi yang layak dijaga sejak proyek masih kecil.

Konfigurasi Debug dan Release#

Setiap proyek .NET didefinisikan pada dua konfigurasi build, yaitu Debug dan Release. Konfigurasi Debug adalah default dan dirancang untuk sesi debug, karena kompilasi tidak mengaktifkan optimasi dan informasi pelacakan baris dipertahankan. Konfigurasi Release mengaktifkan optimasi kompilator untuk kecepatan dan ukuran, sehingga cocok untuk program yang sudah selesai dan akan dibagikan. Kedua konfigurasi menghasilkan folder keluaran yang terpisah.

bash
# kompilasi konfigurasi Release, lalu lihat folder keluaran untuk tiap konfigurasi
dotnet build -c Release | grep "Build succeeded"
ls bin
text Keluaran
Build succeeded.
Debug
Release

Folder bin/Debug/net10.0 dan bin/Release/net10.0 masing-masing memuat salinan lengkap program untuk konfigurasinya. Opsi -c juga berlaku pada dotnet run, sehingga dotnet run -c Release menjalankan versi yang telah dioptimasi. Perbedaan konfigurasi tidak mengubah urutan eksekusi kode, tetapi mengubah cara kompilator menyusunnya. Program Debug berjalan lebih lambat karena optimasinya dimatikan, dan selisihnya menonjol pada pekerjaan berulang yang berat, sedangkan program Release lebih sulit ditelusuri karena banyak bagian yang sudah disusun ulang oleh optimasi.

Kesalahan umum#

  • Perintah dotnet tidak ditemukan. Pesan dotnet: command not found muncul bila .NET SDK belum terpasang atau folder instalasinya belum masuk ke variabel PATH. Instal SDK terlebih dahulu, lalu buka sesi terminal baru.
  • dotnet run dipanggil di luar folder proyek. Perintah ini gagal karena tidak menemukan berkas .csproj pada folder kerja. Masuk ke folder proyek dengan cd, atau sebutkan jalur proyeknya secara eksplisit.
  • Keluaran tidak berubah setelah kode diedit. Program yang dijalankan adalah hasil build terakhir, bukan berkas sumbernya. Jalankan ulang dotnet run atau dotnet build agar perubahan kode ikut terkompilasi.

Ringkasan#

  • dotnet new console -o <folder> membuat proyek baru lengkap dengan berkas .csproj yang mengatur target framework dan fitur bahasa.
  • dotnet run menggabungkan restore, build, dan eksekusi, sedangkan dotnet build hanya mengompilasi ke folder bin.
  • Konfigurasi Debug tanpa optimasi dirancang untuk sesi debug, sedangkan konfigurasi Release beroptimasi penuh untuk program yang akan dibagikan.
  • Kedua konfigurasi menghasilkan folder keluaran terpisah, yaitu bin/Debug/net10.0 dan bin/Release/net10.0.

Referensi#