Panduan: Membuat file proyek MSBuild dari awal

Bahasa pemrograman yang menargetkan .NET Framework menggunakan file proyek MSBuild untuk menjelaskan dan mengontrol proses build aplikasi. Saat Anda menggunakan Visual Studio untuk membuat file proyek MSBuild, XML yang sesuai ditambahkan ke file secara otomatis. Namun, Anda mungkin perlu untuk memahami cara XML diatur dan bagaimana Anda dapat mengubahnya untuk mengontrol build.

Catatan

Artikel ini sesuai jika Anda ingin mempelajari dasar-dasar cara kerja MSBuild secara independen dari SDK apa pun. Membangun dengan SDK, seperti saat Anda menggunakan dotnet build atau Anda menambahkan Sdk atribut ke elemen proyek akar, tidak tercakup dalam artikel ini. Lihat .NET Project SDK.

Untuk informasi tentang membuat file proyek untuk proyek C++, lihat MSBuild (C++).

Panduan ini menunjukkan cara membuat file proyek dasar secara bertahap, dengan hanya menggunakan editor teks. Panduan ini mengikuti langkah-langkah berikut:

  1. Memperbarui variabel lingkungan PATH.

  2. Buat file sumber aplikasi minimal.

  3. Buat file proyek MSBuild minimal.

  4. Buat aplikasi menggunakan file proyek.

  5. Tambahkan properti untuk mengontrol build.

  6. Kontrol build dengan mengubah nilai properti.

  7. Tambahkan target ke build.

  8. Kontrol build dengan menentukan target.

  9. Membangun secara bertahap.

Panduan ini menunjukkan cara membangun proyek di perintah dan memeriksa hasilnya. Untuk informasi selengkapnya tentang MSBuild dan cara menjalankan MSBuild di prompt perintah, lihat Panduan: Menggunakan MSBuild.

Untuk menyelesaikan panduan, Anda harus menginstal Visual Studio karena menyertakan pengkompilasi MSBuild dan C#, yang diperlukan untuk panduan.

Perluas jalur

Sebelum dapat menggunakan MSBuild, Anda harus memperluas variabel lingkungan PATH untuk menyertakan semua alat yang diperlukan. Anda dapat menggunakan Perintah Pengembang untuk Visual Studio. Cari di Windows 10 di kotak pencarian di bilah tugas Windows. Untuk menyiapkan lingkungan dalam prompt perintah biasa atau di lingkungan pembuatan skrip, jalankan VSDevCmd.bat di subfolder Common7/Tools dari penginstalan Visual Studio.

Membuat aplikasi minimal

Bagian ini menunjukkan cara membuat file sumber aplikasi C# minimal menggunakan editor teks.

  1. Pada prompt perintah, telusuri ke folder tempat Anda ingin membuat aplikasi, misalnya, \My Documents\ atau \Desktop\.

  2. Buat subfolder bernama \HelloWorld\ dan ubah direktori untuk masuk ke dalamnya.

  3. Di editor teks, buat file baru HelloWorld.cs lalu salin dan tempel kode berikut:

    using System;
    
    class HelloWorld
    {
        static void Main()
        {
    #if DebugConfig
            Console.WriteLine("WE ARE IN THE DEBUG CONFIGURATION");
    #endif
    
            Console.WriteLine("Hello, world!");
        }
    }
    
  4. Bangun aplikasi dengan mengetik csc helloworld.cs di prompt perintah.

  5. Bangun aplikasi dengan mengetik csc helloworld.cs di prompt perintah.

    Pesan Halo, dunia! harus ditampilkan.

  6. Hapus executable.

Membuat file proyek MSBuild minimal

Sekarang setelah Anda memiliki file sumber aplikasi minimal, Anda dapat membuat file proyek minimal untuk membangun aplikasi. File proyek ini berisi elemen-elemen berikut:

  • Node root Project yang diperlukan.

  • Node ItemGroup yang berisi elemen item.

  • Elemen item yang merujuk ke file sumber aplikasi.

  • Node Target untuk berisi tugas yang diperlukan untuk membangun aplikasi.

  • Elemen Task untuk memulai pengkompilasi C# untuk membangun aplikasi.

Untuk membuat file proyek MSBuild minimal

  1. Di editor teks, buat file baru HelloWorld.csproj dan masukkan kode berikut:

    <Project>
      <ItemGroup>
        <Compile Include="helloworld.cs" />
      </ItemGroup>
    </Project>
    

    Ini ItemGroup berisi elemen Compile item dan menentukan satu file sumber sebagai item.

  2. Tambahkan node Target sebagai elemen turunan dari node Project. Beri nama node Build.

    <Target Name="Build">
    </Target>
    
  3. Sisipkan elemen tugas ini sebagai elemen turunan dari node Target:

    <Csc Sources="@(Compile)"/>
    
  4. Simpan file proyek ini dan beri nama Helloworld.csproj.

File proyek minimal Anda harus menyerupai kode berikut:

<Project>
  <ItemGroup>
    <Compile Include="helloworld.cs"/>
  </ItemGroup>
  <Target Name="Build">
    <Csc Sources="@(Compile)"/>
  </Target>
</Project>

Tugas dalam target Build dijalankan secara berurutan. Dalam hal ini, tugas pengkompilasi Csc C# adalah satu-satunya tugas. Ini mengharapkan daftar file sumber untuk dikompilasi, dan ini diberikan oleh nilai item Compile. Item Compile hanya mereferensikan satu file sumber, Helloworld.cs.

Catatan

Dalam elemen item, Anda dapat menggunakan karakter wildcard tanda bintang (*) untuk mereferensikan semua file yang memiliki ekstensi nama file .cs, sebagai berikut:

<Compile Include="*.cs" />

Membangun aplikasi

Sekarang, untuk membangun aplikasi, gunakan file proyek yang baru saja Anda buat.

  1. Pada perintah, ketik msbuild helloworld.csproj -t:Build.

    Ini membangun target Build file proyek Helloworld dengan memanggil pengkompilasi C# untuk membuat aplikasi Helloworld.

  2. Uji aplikasi dengan mengetik helloworld.

    Pesan Halo, dunia! harus ditampilkan.

Catatan

Anda dapat melihat detail selengkapnya tentang build dengan meningkatkan tingkat verbositas. Untuk mengatur tingkat verbositas ke "terperinci", ketik perintah ini di prompt perintah:

msbuild helloworld.csproj -t:Build -verbosity:detailed

Menambahkan properti build

Anda dapat menambahkan properti build ke file proyek untuk mengontrol build lebih lanjut. Sekarang tambahkan properti ini:

  • Properti AssemblyName untuk menentukan nama aplikasi.

  • Properti OutputPath untuk menentukan folder untuk memuat aplikasi.

Untuk menambahkan properti build

  1. Hapus aplikasi yang ada yang dapat dieksekusi (nanti, Anda akan menambahkan Clean target untuk menangani penghapusan file output lama).

  2. Dalam file proyek, sisipkan elemen PropertyGroup ini tepat setelah elemen pembuka Project:

    <PropertyGroup>
      <AssemblyName>MSBuildSample</AssemblyName>
      <OutputPath>Bin\</OutputPath>
    </PropertyGroup>
    
  3. Tambahkan tugas ini ke target Build, tepat sebelum tugas Csc:

    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    

    Tugas MakeDir membuat folder yang dinamai menurut properti OutputPath, asalkan tidak ada folder dengan nama tersebut yang saat ini ada.

  4. Tambahkan atribut ini OutputAssembly ke tugas Csc:

    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
    

    Ini menginstruksikan pengkompilasi C# untuk menghasilkan rakitan yang dinamai AssemblyName oleh properti dan memasukkannya ke dalam folder yang dinamai OutputPath oleh properti .

  5. Simpan perubahan.

File proyek Anda sekarang akan menyerupai kode berikut:

<Project>
  <PropertyGroup>
    <AssemblyName>MSBuildSample</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="helloworld.cs" />
  </ItemGroup>
  <Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
</Project>

Catatan

Kami menyarankan agar Anda menambahkan pemisah jalur garis miring terbelakang (\) di akhir nama folder saat Anda menentukannya di elemen OutputPath, alih-alih menambahkannya dalam atribut OutputAssembly tugas Csc. Karena itu,

<OutputPath>Bin\</OutputPath>

OutputAssembly="$(OutputPath)$(AssemblyName).exe" />

lebih baik dari

<OutputPath>Bin</OutputPath>

OutputAssembly="$(OutputPath)\$(AssemblyName).exe" />

Menguji properti build

Sekarang Anda dapat membangun aplikasi menggunakan file proyek tempat Anda menggunakan properti build untuk menentukan folder output dan nama aplikasi.

  1. Pada perintah, ketik msbuild helloworld.csproj -t:Build.

    Ini membuat folder \Bin\ dan kemudian memanggil pengkompilasi C# untuk membuat aplikasi MSBuildSample dan meletakkannya di folder \Bin\ .

  2. Untuk memverifikasi bahwa folder \Bin\ telah dibuat, dan bahwa folder tersebut berisi aplikasi MSBuildSample, ketik dir Bin.

  3. Uji aplikasi dengan mengetik Bin\MSBuildSample untuk menjalankan executable.

    Pesan Halo, dunia! harus ditampilkan.

Menambahkan target build

Selanjutnya, tambahkan dua target lagi ke file proyek, sebagai berikut:

  • Target Bersihkan yang menghapus file lama.

  • Target Pembangunan ulang yang menggunakan atribut DependsOnTargets untuk memaksa tugas Bersih dijalankan sebelum tugas Build.

Sekarang setelah Anda memiliki beberapa target, Anda dapat menetapkan target Build sebagai target default.

Untuk menambahkan target build

  1. Dalam file proyek, tambahkan dua target ini tepat setelah target Build:

    <Target Name="Clean" >
      <Delete Files="$(OutputPath)$(AssemblyName).exe" />
    </Target>
    <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
    

    Target Clean memanggil tugas Delete untuk menghapus aplikasi. Target Rebuild tidak berjalan sampai target Clean dan target Build telah berjalan. Meskipun target Rebuild tidak memiliki tugas, target Clean berjalan sebelum target Build.

  2. Tambahkan atribut ini DefaultTargets ke elemen pembuka Project:

    <Project DefaultTargets="Build">
    

    Hal ini menetapkan target Build sebagai target default.

File proyek Anda sekarang akan menyerupai kode berikut:

<Project DefaultTargets="Build">
  <PropertyGroup>
    <AssemblyName>MSBuildSample</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="helloworld.cs" />
  </ItemGroup>
  <Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Clean" >
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
</Project>

Menguji target build

Anda dapat menjalankan target build baru untuk menguji fitur file proyek ini:

  • Membangun build default.

  • Mengatur nama aplikasi pada perintah.

  • Menghapus aplikasi sebelum aplikasi lain dibuat.

  • Menghapus aplikasi tanpa membangun aplikasi lain.

Untuk menguji target build

  1. Pada perintah, ketik msbuild helloworld.csproj -p:AssemblyName=Greetings.

    Karena Anda tidak menggunakan sakelar -t untuk secara eksplisit mengatur target, MSBuild menjalankan target Build default. Sakelar -p mengambil alih properti AssemblyName dan memberinya nilai baru, Greetings. Ini menyebabkan aplikasi baru, Greetings.exe, dibuat di folder \Bin\.

  2. Untuk memverifikasi bahwa folder \Bin\ berisi aplikasi MSBuildSample dan aplikasi Greetings baru, ketik dir Bin.

  3. Uji aplikasi Salam (misalnya, dengan mengetik Bin\Greetings di Windows).

    Pesan Halo, dunia! harus ditampilkan.

  4. Hapus aplikasi MSBuildSample dengan mengetik msbuild helloworld.csproj -t:clean.

    Ini menjalankan tugas Bersihkan untuk menghapus aplikasi yang memiliki nilai properti default AssemblyName, MSBuildSample.

  5. Hapus aplikasi Greetings dengan mengetik msbuild helloworld.csproj -t:clean -p:AssemblyName=Greetings.

    Ini menjalankan tugas Bersihkan untuk menghapus aplikasi yang memiliki nilai properti AssemblyName yang diberikan, Greetings.

  6. Untuk memverifikasi bahwa folder \Bin\ sekarang kosong, ketik dir Bin.

  7. Ketik msbuild.

    Meskipun file proyek tidak ditentukan, MSBuild membangun file helloworld.csproj karena hanya ada satu file proyek di folder saat ini. Hal ini menyebabkan aplikasi MSBuildSample dibuat di folder \Bin\.

    Untuk memverifikasi bahwa folder \Bin\ berisi aplikasi MSBuildSample, ketik dir Bin.

Membangun secara bertahap

Anda dapat memberi tahu MSBuild untuk membuat target hanya jika file sumber atau file target yang bergantung pada target telah berubah. MSBuild menggunakan stempel waktu file untuk menentukan apakah file telah berubah.

Untuk membangun secara bertahap

  1. Dalam file proyek, tambahkan atribut ini ke target Build yang terbuka:

    Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe"
    

    Ini menentukan bahwa target Build bergantung pada file input yang ditentukan dalam grup item Compile, dan bahwa target output adalah file aplikasi.

    Target Build yang dihasilkan harus menyerupai kode berikut:

    <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
      <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
      <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
    </Target>
    
  2. Uji target Build dengan mengetik msbuild -v:d di perintah.

    Ingatlah bahwa helloworld.csproj adalah file proyek default, dan bahwa Build adalah target default.

    Sakelar -v:d adalah singkatan dari -verbosity:detail yang Anda gunakan sebelumnya.

    Jika Anda sudah membuat output, baris ini harus ditampilkan:

    Melompati target "Build" karena semua file output sudah diperbarui sehubungan dengan file input.

    MSBuild melompati target Build karena tidak ada file sumber yang berubah sejak aplikasi terakhir dibuat.

C# contoh

Contoh berikut menunjukkan file proyek yang mengompilasi aplikasi C# dan mencatat pesan yang berisi nama file output.

Kode

<Project DefaultTargets = "Compile">

    <!-- Set the application name as a property -->
    <PropertyGroup>
        <appname>HelloWorldCS</appname>
    </PropertyGroup>

    <!-- Specify the inputs by type and file name -->
    <ItemGroup>
        <CSFile Include = "*.cs"/>
    </ItemGroup>

    <Target Name="Compile">
        <!-- Run the C# compilation using input files of type CSFile -->
        <CSC
            Sources = "@(CSFile)"
            OutputAssembly = "$(appname).exe">
            <!-- Set the OutputAssembly attribute of the CSC task
            to the name of the executable file that is created -->
            <Output
                TaskParameter = "OutputAssembly"
                ItemName = "EXEFile" />
        </CSC>
        <!-- Log the file name of the output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

Contoh Visual Basic

Contoh berikut menunjukkan file proyek yang mengompilasi aplikasi Visual Basic dan mencatat pesan yang berisi nama file output.

Kode

<Project DefaultTargets = "Compile">

    <!-- Set the application name as a property -->
    <PropertyGroup>
        <appname>HelloWorldVB</appname>
    </PropertyGroup>

    <!-- Specify the inputs by type and file name -->
    <ItemGroup>
        <VBFile Include = "consolehwvb1.vb"/>
    </ItemGroup>

    <Target Name = "Compile">
        <!-- Run the Visual Basic compilation using input files of type VBFile -->
        <VBC
            Sources = "@(VBFile)"
            OutputAssembly= "$(appname).exe">
            <!-- Set the OutputAssembly attribute of the VBC task
            to the name of the executable file that is created -->
            <Output
                TaskParameter = "OutputAssembly"
                ItemName = "EXEFile" />
        </VBC>
        <!-- Log the file name of the output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

Apa selanjutnya?

Visual Studio dapat secara otomatis melakukan banyak pekerjaan yang ditunjukkan dalam panduan ini. Untuk mempelajari cara menggunakan Visual Studio untuk membuat, mengedit, membangun, dan menguji file proyek MSBuild, lihat Panduan: Menggunakan MSBuild.