自定义本地生成

当你在使用 GitHub、源代码管理或任何共享代码库等代码存储库的团队中工作,但想要在本地计算机上自定义生成(可能是暂时重现 bug 或测试其他配置)时,可以方便地将这些自定义项与同共享代码存储库共享的共享项目文件分开。 本文介绍 MSBuild 中提供的一些生成扩展,这些扩展使你能够进行用户特定或仅限本地的自定义配置。

.user 文件

在此上下文中,使用 $(MSBuildProjectFullPath).user,也称为 .user 文件,也是一个选项。 此文件旨在保留特定于本地计算机的扩展、选项或变量。 它不会被上传到源代码管理,并且会自动在 .gitignore 上进行检查。 对于更广泛的变更,最好更改项目本身,以便将来的维护人员不必了解此扩展机制。

在受支持的多目标项目上,.user 文件会自动导入到内部生成和外部生成中,因此只需在解决方案中创建该文件即可。 如果使用的是另一种类型的生成,也仍可使用 .user 文件。 可以在解决方案中创建它,然后在项目文件中导入它。

<Import Project="$(MSBuildProjectFullPath).user" Condition="Exists('$(MSBuildProjectFullPath).user')"/>

MSBuildExtensionsPath 和 MSBuildUserExtensionsPath

按照惯例,许多核心生成逻辑文件

$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\{TargetFileName}\ImportBefore\*.targets

会在其内容前后各导入一次

$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\{TargetFileName}\ImportAfter\*.targets

。 这一约定使已安装的 SDK 可以增强常见项目类型的生成逻辑。

$(MSBuildUserExtensionsPath) 中搜索相同的目录结构,即按用户文件夹 %LOCALAPPDATA%\Microsoft\MSBuild。 放置在该文件夹中的文件将被导入该用户凭据下运行的相应项目类型的所有生成。 通过在模式 ImportUserLocationsByWildcardBefore{ImportingFileNameWithNoDots} 中设置以导入文件命名的属性,可以禁用用户扩展。 例如,将 ImportUserLocationsByWildcardBeforeMicrosoftCommonProps 设置为 false 会阻止导入 $(MSBuildUserExtensionsPath)\$(MSBuildToolsVersion)\Imports\Microsoft.Common.props\ImportBefore\*

基于项目语言的自定义配置

如果需要基于 .NET 语言(C#、Visual Basic 或 F#)的不同行为,则可以添加具有条件的属性组,这些属性组依赖于 $(MSBuildProjectExtension) 中的项目文件扩展名来定义特定于语言的属性及其值。

<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.vbproj'">
   <!-- Put VB-only property definitions here -->
</PropertyGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.fsproj'">
   <!-- Put F#-only property definitions here -->
</PropertyGroup>
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.csproj'">
   <!-- Put C#-only property definitions here -->
</PropertyGroup>