Bagikan melalui


Pilih file yang akan dibuat

Di sebagian besar proyek, Anda tidak perlu secara khusus memilih file yang akan dibuat. Misalnya, proyek apa pun yang dibuat dengan Visual Studio membangun semua file sumber dalam proyek. Namun, Anda mungkin perlu tahu cara mengedit file proyek untuk menangani skenario yang berbeda dari default, seperti ketika Anda ingin membangun file dari lokasi lain di luar folder proyek, atau saat Anda membuat proses build Anda sendiri alih-alih menggunakan SDK seperti .NET SDK.

Perilaku default menurut jenis proyek

Perilaku default yang menentukan file apa yang disertakan MSBuild dalam build berbeda menurut jenis proyek.

Untuk proyek .NET SDK, .NET SDK standar menentukan daftar item defaultCompile yang berisi file di pohon folder proyek yang cocok dengan ekstensi file khusus bahasa yang sesuai. Misalnya, untuk proyek C#, Compile item diisi dengan pola **/*.csglob , yang cocok dengan semua file sumber di folder proyek dan semua subfoldernya secara rekursif. Anda tidak melihat Compile elemen dalam file proyek, karena didefinisikan dalam file SDK .props yang diimpor secara implisit. Lihat Gambaran umum SDK proyek .NET - default menyertakan dan mengecualikan.

Jika menggunakan Visual Studio, Anda dapat memodifikasi kumpulan file sumber untuk dibuat dengan mengubah Tindakan Build pada file. Atur ke None untuk mengecualikan file dari build. Melakukan ini di Visual Studio memengaruhi file proyek. Anda akan melihat bahwa baris ditambahkan untuk menghapus file sumber dari Compile daftar item dan menambahkannya ke None daftar item.

  <ItemGroup>
    <Compile Remove="Class.cs" />
  </ItemGroup>

  <ItemGroup>
    <None Include="Class.cs" />
  </ItemGroup>

Untuk .NET Framework atau proyek non-SDK lainnya, Compile item dibuat secara eksplisit dalam file proyek dengan mencantumkan semua file sumber.

Untuk proyek C++, file sumber secara eksplisit ditambahkan ke ClCompile elemen dalam file proyek.

Saat Anda membuat file proyek MSBuild dengan tangan tanpa menggunakan SDK, Anda dapat mencantumkan setiap file sumber secara terpisah dalam file proyek, atau Anda dapat menggunakan kartubebas untuk menyertakan semua file dalam satu direktori atau sekumpulan direktori berlapis. Anda juga dapat menggunakan teknik dalam artikel ini untuk mengubah Compile daftar item (dalam proyek .NET) atau ClCompile daftar item dalam proyek C++ untuk menyesuaikan file apa yang dibuat.

Tentukan input

Item mewakili input (seperti file sumber) untuk build. Untuk informasi selengkapnya tentang item, lihat Item.

Untuk menyertakan file untuk build, file harus disertakan dalam daftar item. Seperti yang dibahas sebelumnya, dalam proyek .NET SDK dan .NET Framework, daftar item untuk file sumber adalah Compile. Anda tidak melihat Compile daftar item dalam proyek .NET SDK, karena ditentukan dalam impor impor implisit. Lihat Menggunakan SDK proyek.

File proyek yang tidak bergantung pada impor standar dapat menggunakan nama daftar item arbitrer, seperti VBFile atau CSFile. Lihat Contoh 1 dan Contoh 2 nanti di artikel ini. Untuk menyiapkan build berdasarkan daftar item, Anda meneruskan ini menurut nama ke tugas build, seperti yang dibahas nanti di artikel ini.

Beberapa file dapat ditambahkan ke daftar item dengan menyertakan file satu per satu atau menggunakan kartubebas untuk menyertakan banyak file sekaligus.

Untuk mendeklarasikan item satu per satu

  • Gunakan atribut Include yang mirip dengan hal berikut ini:

    <Compile Include="Form1.cs"/>

    or

    <Compile Include="Form1.vb"/>

    Catatan

    Jika item dalam koleksi item tidak berada dalam direktori yang sama dengan file proyek, Anda harus menentukan jalur lengkap atau relatif ke item. Misalnya: Include="..\..\Form2.cs".

Daftar item yang sama dapat dimodifikasi berulang kali oleh beberapa Include atribut. Masing-masing Include menambahkan ke apa yang ada sebelumnya.

Untuk mendeklarasikan beberapa item

  • Gunakan atribut Include yang mirip dengan hal berikut ini:

    <Compile Include="Form1.cs;Form2.cs"/>

    or

    <Compile Include="Form1.vb;Form2.vb"/>

Tentukan input dengan kartubebas

Anda juga dapat menggunakan kartubebas untuk menyertakan semua file secara rekursif atau hanya file tertentu dari subdirektori sebagai input untuk build. Untuk informasi selengkapnya tentang kartubebas, lihat Item

Contoh berikut didasarkan pada proyek yang berisi file grafis di direktori dan subdirektori berikut, dengan file proyek yang terletak di direktori Proyek:

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Untuk menyertakan semua file .jpg dalam direktori dan subdirektori Gambar

  • Gunakan atribut berikut Include:

    Include="Images\**\*.jpg"

Untuk menyertakan semua file .jpg yang dimulai dengan img

  • Gunakan atribut berikut Include:

    Include="Images\**\img*.jpg"

Untuk menyertakan semua file dalam direktori dengan nama yang berakhiran jpg

  • Gunakan salah satu atribut Include berikut:

    Include="Images\**\*jpgs\*.*"

    or

    Include="Images\**\*jpgs\*"

Mengecualikan dan menghapus item

Anda mungkin ingin menentukan file yang cocok dengan pola tertentu, dengan beberapa pengecualian. Anda dapat melakukannya dalam satu operasi dengan kombinasi Include dan Exclude.

<ItemGroup>
  <!-- Include every C# source file, except anything in the "sub" folder -->
  <Compile Include="**/*.cs" Exclude="sub/**/*.cs">
</ItemGroup>

Untuk menghapus item yang sebelumnya disertakan, atau disertakan secara default oleh SDK, Anda dapat menggunakan atribut .Remove

<ItemGroup>
  <!-- Remove anything in the "sub" folder -->
  <Compile Remove="sub/**/*.cs">
</ItemGroup>

Meneruskan item ke tugas atau target

Di sebagian besar file proyek, Anda tidak perlu secara eksplisit meneruskan Compile item ke target atau tugas, karena ini ditangani oleh impor standar. Tetapi dalam kasus target file proyek, Anda dapat menggunakan @() notasi dalam tugas untuk menentukan seluruh daftar item sebagai input untuk build. Anda dapat menggunakan notasi ini apakah Anda mencantumkan semua file secara terpisah atau menggunakan wildcard.

Untuk menggunakan semua file C# atau Visual Basic sebagai input ke tugas pengkompilasi

  • Gunakan atribut Include yang mirip dengan hal berikut ini:

    <CSC Sources="@(CSFile)">...</CSC>

    or

    <VBC Sources="@(VBFile)">...</VBC>

Catatan

Anda harus menggunakan kartubebas dengan item untuk menentukan input untuk build; Anda tidak dapat menentukan input menggunakan atribut Sources dalam tugas MSBuild seperti Csc atau Vbc. Contoh berikut tidak valid dalam file proyek:

<CSC Sources="*.cs">...</CSC>

Contoh 1

Contoh kode berikut menunjukkan proyek yang menyertakan semua file input secara terpisah.

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
        <Builtdir>built</Builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="Form1.cs"/>
        <CSFile Include="AssemblyInfo.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>

Contoh 2

Contoh kode berikut menggunakan kartubebas untuk menyertakan semua file .cs.

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

    <PropertyGroup>
        <builtdir>built</builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="*.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>