從組建中排除檔案
在專案檔中,您可以使用萬用字元,來包含一個目錄中的所有檔案或巢狀目錄集合做為組建的輸入。 不過,目錄中可能有一個您不想包含來建置輸入的檔案,或者巢狀目錄集合中可能有一個您不想包含的目錄。 您可以明確地從輸入清單中排除該檔案或目錄。 專案中也可能有一個您只想在符合特定條件的情況下包含的檔案。 您可以明確地宣告要在組建中包含檔案的條件。
注意
本文所述的技術不適用於 F# 和 C++。 這些專案系統自行管理來源檔案。
使用 Visual Studio 排除檔案
如果您使用 Visual Studio,請在 [方案總管] 選取檔案、檢視 [屬性] 視窗 (按 Alt+Enter),然後將 [建置動作] 設定為 [無]。
這會導致 MSBuild 專案檔的下列變更:
<ItemGroup>
<Compile Remove="ClassToExclude.cs" />
</ItemGroup>
<ItemGroup>
<None Include="ClassToExclude.cs" />
</ItemGroup>
雖然這適用於少數檔案,但不會擴大為更多檔案或符合特定模式的檔案。 在 .NET 專案,您可以使用 MSBuild,以萬用字元運算式排除檔案和目錄,也稱為 glob,如下所述。
在 .NET 專案排除檔案或目錄
項目清單是組建的輸入檔。 對於多數專案,例如 .NET SDK 專案,有不同類型項目的預先定義項目清單 (例如,Compile
針對來源檔案、Content
針對特定靜態檔案等等),而且標準匯入已定義這些項目。 您可以在 Common MSBuild 專案項目找到這些項目的清單。 在專案程式碼中,這些已預先定義為包含所有相關項目;例如,C# 專案的 Compile
包含具有 .cs
延伸項目的所有檔案。
若要排除檔案,您可以在項目使用 Remove
屬性。
<ItemGroup>
<Compile Remove="ClassToExclude.cs" />
</ItemGroup>
您可以指定多個個別檔案,或各種 Glob 模式:
<ItemGroup>
<Compile Remove="Contoso*.cs" /> <!-- Wildcard on filename -->
<Compile Remove="File1.cs;File2.cs" /> <!-- List of files with separator -->
<Compile Remove="Contoso/**/*.cs" /> <!-- All .cs files in a directory subtree -->
</ItemGroup>
如需支援模式清單,請參閱模式格式。
在 MSBuild 語言包含及排除檔案或目錄
在原始 MSBuild 語言 (也就是,不使用任何標準匯入或 SDK 參考),您想包含的項目會個別宣告,或是使用 Include
屬性以群組的方式宣告。 例如:
<CSFile Include="Form1.cs"/>
<CSFile Include ="File1.cs;File2.cs"/>
<CSFile Include="*.cs"/>
<JPGFile Include="Images\**\*.jpg"/>
如果您使用萬用字元來包含一個目錄中的所有檔案或巢狀目錄集合作為建置的輸入,則目錄中可能有一或多個您不想包含的檔案,或巢狀目錄集合中可能有一個您不想包含的目錄。 若要從項目清單中排除項目,請使用 Exclude
屬性。
Exclude
其實不是項目作業;它不能單獨使用,只能做為 Include
的修飾元。
包含 Form2
以外的所有 .cs
或 *.vb
檔案
使用下列其中一個
Include
和Exclude
屬性:<CSFile Include="*.cs" Exclude="Form2.cs"/>
或
<VBFile Include="*.vb" Exclude="Form2.vb"/>
包含 Form2
和 Form3
以外的所有 .cs
或 .vb
檔案
使用下列其中一個
Include
和Exclude
屬性:<CSFile Include="*.cs" Exclude="Form2.cs;Form3.cs"/>
或
<VBFile Include="*.vb" Exclude="Form2.vb;Form3.vb"/>
包含 Images
目錄之子目錄中的所有 .jpg
檔案,但 Version2
目錄中的檔案除外
使用下列
Include
和Exclude
屬性:<JPGFile Include="Images\**\*.jpg" Exclude = "Images\**\Version2\*.jpg"/>
注意
您必須指定這兩個屬性的路徑。 如果您使用絕對路徑,在
Include
屬性中指定檔案位置,也必須在Exclude
屬性中使用絕對路徑。如果您在Include
屬性中使用相對路徑,就必須在Exclude
屬性中使用相對路徑。
排除和移除
如果您要定義自己的項目清單,請儘量使用 Exclude
。 在與 Include
相同的宣告使用 Exclude
具有效能優點,因為不需要處理排除的項目。
在有預先定義的項目清單使用 Remove
時請使用 Compile
,例如 Content
和 這類標準項目清單的情況。 在那種情況不支援 Exclude
。
注意
如果您使用支援它的 SDK,可以將 $(OverrideDefaultCompileItems)
屬性設定為 true
,並使用 Include
及選擇性使用 Exclude
定義自己的 Compile
項目。
使用條件來從組建的輸入中排除檔案或目錄
例如,如果偵錯組建中 (但不在發行組建中) 有您想要包含的項目,您可以使用 Condition
屬性來指定要包含該項目的條件。
只包含發行組建中的 Formula.vb 檔案
以如下方式使用
Condition
屬性:<Compile Include="Formula.vb" Condition=" '$(Configuration)' == 'Release' " />
範例
下列程式碼範例所建置的專案,將包含目錄中 Form2.cs 以外的所有 .cs 檔案。
<Project DefaultTargets="Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<PropertyGroup>
<builtdir>built</builtdir>
</PropertyGroup>
<ItemGroup>
<CSFile Include="*.cs" Exclude="Form2.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>