在代码存储库(如 GitHub、源代码管理或任何共享代码库)中使用共享代码时,可以使用 MSBuild 在本地计算机上临时自定义生成。 你可能希望暂时重现 bug 或测试不同的配置,并将这些自定义项与共享代码存储库中的文件分开。 本文介绍 MSBuild 中提供的一些生成扩展,可让你进行特定于用户或仅限本地的自定义生成配置。
先决条件
- 使用 MSBuild 生成的 Visual Studio 项目。
使用用户文件
可以在此上下文中使用 $(MSBuildProjectFullPath).user
,也称为 用户 文件,用于存储特定于本地计算机的扩展、选项或变量。 用户文件不应该上传到源代码管理,且会自动进行.gitignore
检查。 对于更广泛的更改,请更改项目本身,因此未来的维护人员不必了解此扩展机制。
在受支持的多目标项目上,用户文件会自动导入内部生成和外部生成,因此可以在解决方案中创建此文件。 如果正在处理另一种类型的生成,可以通过在解决方案中创建该用户文件,然后在项目文件中导入该文件,如下所示:
<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>