選取要建置的檔案
在多數專案,您不必特別選取要建置的檔案。 例如,使用 Visual Studio 建立的任何專案,都會建置專案中的所有來源檔案。 不過,您可能需要了解,如何針對處理不同於預設值的案例編輯專案檔,例如您想從專案資料夾外的其他位置建置檔案,或是不想使用 .NET SDK 這類 SDK,想自行建立建置流程。
依專案類型的預設行為
決定 MSBuild 包含在組建中檔案的預設行為,因專案類型而有所不同。
對於 .NET SDK 專案,標準 .NET SDK 定義預設的 Compile
項目清單,其中包含專案資料夾樹中與相應的語言特定檔案副檔名相符的檔案。 例如,針對 C# 專案,Compile
項目會填入 glob 模式 **/*.cs
,以遞迴方式比對專案資料夾及其所有子資料夾中的所有來源檔案。 您在專案檔看不到 Compile
元素,因為 SDK .props
檔案將它定義為隱含匯入。 請參閱 .NET 專案 SDK 概觀 - 預設的包含和排除。
如果您使用的是 Visual Studio,在檔案變更建置動作即可修改要建置的來源檔案集合。 將它設定為 None
,從組建排除檔案。 在 Visual Studio 執行此動作會影響專案檔。 您隨即會看到新增行,從 Compile
項目清單移除來源檔案,並將它新增至 None
項目清單。
<ItemGroup>
<Compile Remove="Class.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Class.cs" />
</ItemGroup>
若為 .NET Framework 或其他非 SDK 專案,Compile
項目會列出所有來源檔案,在專案檔明確建構專案。
若為 C++ 專案,來源檔案會在專案檔明確新增至 ClCompile
元素。
不使用 SDK 手動製作 MSBuild 專案檔時,您可以在專案檔分別列出每個來源檔案,或是您可以使用萬用字元,包含一個目錄或巢狀目錄集合中的所有檔案。 您也可以使用本文中的技巧修改 Compile
項目清單 (在 .NET 專案中),或 C++ 專案中的 ClCompile
項目清單,自訂要建置哪些檔案。
指定輸入
項目代表建置的輸入 (例如來源檔案)。 如需項目的詳細資訊,請參閱項目。
若要包含組建的檔案,必須在項目清單包含該檔案。 如先前所述,在 .NET SDK 和 .NET Framework 專案,來源檔案的項目清單為 Compile
。 您不會在 .NET SDK 專案看到 Compile
項目清單,因為它是以隱含匯入的方式定義。 請參閱使用使用專案 SDK。
不依賴標準匯入的專案檔,可以使用任意項目清單名稱,例如 VBFile
或 CSFile
。 請參閱本文稍後的範例 1 和範例 2。 若要根據項目清單設定組建,請透過名稱將此項目傳遞至組建工作,如本文稍後所述。
多個檔案可以新增至項目清單,方法是個別包含檔案,或是使用萬用字元來一次包含許多檔案。
個別宣告項目
使用
Include
屬性,類似如下︰<Compile Include="Form1.cs"/>
或
<Compile Include="Form1.vb"/>
注意
如果項目集合中的項目不在與專案檔相同的目錄中,您必須指定項目的完整或相對路徑。 例如:
Include="..\..\Form2.cs"
。
使用多個 Include
屬性即可重複修改相同的項目清單。 每個 Include
都會新增至先前的內容。
宣告多個項目
使用
Include
屬性,類似如下︰<Compile Include="Form1.cs;Form2.cs"/>
或
<Compile Include="Form1.vb;Form2.vb"/>
使用萬用字元指定輸入
您也可以使用萬用字元,以遞迴方式包含所有檔案,或只包含來自子目錄的特定檔案,作為建置的輸入。 如需萬用字元的詳細資訊,請參閱項目
下列範例所根據的專案,包含下列目錄和子目錄中的圖形檔案,且專案檔位於「專案」目錄中︰
Project\Images\BestJpgs
Project\Images\ImgJpgs
Project\Images\ImgJpgs\Img1
包含 Images 目錄和子目錄中的所有 .jpg 檔案
使用下列
Include
屬性:Include="Images\**\*.jpg"
包含開頭為 img 的所有 .jpg 檔案
使用下列
Include
屬性:Include="Images\**\img*.jpg"
包含目錄中名稱結尾為 jpgs 的所有檔案
使用下列其中一個
Include
屬性:Include="Images\**\*jpgs\*.*"
或
Include="Images\**\*jpgs\*"
排除和移除項目
您不妨指定符合特定模式但有一些例外的檔案。 您可以使用 Include
和 Exclude
的組合,在單一作業執行此作業。
<ItemGroup>
<!-- Include every C# source file, except anything in the "sub" folder -->
<Compile Include="**/*.cs" Exclude="sub/**/*.cs">
</ItemGroup>
若要移除先前包含或 SDK 預設包含的項目,您可以使用 Remove
屬性。
<ItemGroup>
<!-- Remove anything in the "sub" folder -->
<Compile Remove="sub/**/*.cs">
</ItemGroup>
將項目傳遞至工作或目標
在多數專案檔,您不必將 Compile
項目明確傳遞至目標或工作,因為標準匯入會處理這個流程。 然而,若是目標專案檔案,您可以在工作中使用 @()
標記法,指定整份項目清單作為組建的輸入。 不論您分別列出所有檔案,還是使用萬用字元,都可以使用這個標記法。
使用所有 C# 或 Visual Basic 檔案作為編譯器工作的輸入
使用
Include
屬性,類似如下︰<CSC Sources="@(CSFile)">...</CSC>
或
<VBC Sources="@(VBFile)">...</VBC>
注意
您必須對項目使用萬用字元來指定組建的輸入;您不能使用 MSBuild 工作中的 Sources
屬性 (例如 Csc 或 Vbc) 指定輸入。 下列範例在專案檔案中無效︰
<CSC Sources="*.cs">...</CSC>
範例 1
下列程式碼範例會顯示個別包含所有輸入檔案的專案。
<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>
範例 2
下列程式碼範例會使用萬用字元來包含所有 .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>