更改波次
变更波是 MSBuild 中的一组行为变更,你可以通过指定特定标志作为环境变量来选择停用。 这样做的目的是警告你潜在的颠覆性更改,以便你可以在这些更改成为标准功能前灵活地适应它们。 特定变更波中的所有功能只能一起启用或禁用,而不能单独启用或禁用。
当你升级到新版 MSBuild 时,潜在的颠覆性更改是默认启用的,但如果某项功能对你的生成产生负面影响,你可以轻松地禁用相应变更波。 每个变更波都由 MSBuild 版本号(例如 16.8)标识,但设置变更波只控制某些可能影响生成过程的功能,而不是相应 MSBuild 版本中的所有更改。 本文稍后的部分中列出了每个变更波中的功能。 禁用一个变更波也会禁用更高版本的变更波。
选择停用变更波功能
若要禁用变更波中的功能,请将环境变量 MSBuildDisableFeaturesFromVersion
设置为包含要禁用的功能的变更波(或 MSBuild 版本)。 这是为其开发功能的 MSBuild 的版本。 请参阅下面的变更波与功能的映射。
MSBuildDisableFeaturesFromVersion 值
如果你没有将 MSBuildDisableFeaturesFromVersion
设置为有效的变更波,则会收到警告和/或默认为特定变更波。 下表显示了可能的设置:
MSBuildDisableFeaturesFromVersion 值 |
结果 | 收到警告? |
---|---|---|
取消设置 | 启用所有变更波,这意味着每个变更波后面的所有功能都被启用。 | 否 |
任何有效的当前变更波(例如 16.8 ) |
禁用变更波 16.8 及更高版本后面的所有功能。 |
否 |
无效值(例如,如果有效波为 16.8 和 16.10 ,则为 16.9 ) |
默认为最接近的有效值(升序)。 例如,如果设置 16.9 ,则默认为 16.10 。 |
否 |
不轮换(例如,如果最高波为 17.0 ,则为 17.1 ) |
固定为最接近的有效值。 例如,17.1 固定为 17.0 ,16.5 固定为 16.8 |
是 |
无效格式(例如 16x8 、17_0 、garbage ) |
启用所有变更波,这意味着每个变更波后面的所有功能都被启用。 | 是 |
变更波和关联的功能
17.1
- 在不使用 BinFmt 的情况下对 AppDomain 配置进行序列化 - 只有在通过编辑
MSBuild.runtimeconfig.json
在运行时允许 BinaryFormatter 的情况下,才能选择退出此功能 - 在进程范围内缓存 SDK 解析程序数据
17.8
- [RAR] 不要对 SDK 提供的引用执行 I/O
- 在复制前删除目标文件
- 针对哈希任务从 SHA1 迁移到 SHA256
- 弃用自定义派生 BuildEventArgs - 只有在通过编辑
MSBuild.runtimeconfig.json
在运行时允许 BinaryFormatter 的情况下,才能选择退出此功能
17.6
17.4
- 加载程序集时采用 deps.json
- 在平台协商期间将
Platform
视为默认值 - 将接受的 SDK 名称匹配模式添加到 SDK 清单
- 引发警告,指示项目类型无效
- MSBuild 服务器
- 验证区域性时调用新的 CultureInfo API(仅限 .NET Core)
17.0
- 计划程序应遵循 BuildParameters.DisableInprocNode
- 不要在 .NET Framework 上编译通配正则表达式
- 默认为通过可传递的方式复制内容项
- 默认情况下,引用程序集现在不再放置在
bin
目录中(还原到此处并返回到此处) - 改进调试体验:添加全局开关 MSBuildDebugEngine;从 BuildManager 注入二进制记录器;将静态图形作为 .dot 文件打印
- 修复 BuildManager 与 LoggingService 中的死锁
- 优化文件记录器和控制台记录器的诊断级别
- 优化了不可变文件最新检查
- 为目录枚举添加 Microsoft.IO.Redist
- ToolsetConfigurationSection 的进程范围缓存
- 规范化 RAR 输出路径
变更波不再旋转
16.8
16.10
- 当条件中的属性展开有空格时出错
- 允许具有 TargetPath 的自定义 CopyToOutputDirectory 位置
- 允许其用户名中包含特定特殊字符的用户在使用 exec 时成功生成
- 当 SDK 无法解决时,还原操作失败
- 优化 glob 评估
FAQ
为什么要每隔一个地定位版本来轮换变更波?
我们认为,有足够的时间与受影响的人进行讨论,并协助适应这些更改。
为什么是环境变量,而不是项目属性?
在某些情况下,我们希望在 MSBuild 加载项目之前,将功能置于变更波下。 因此,变更波需要使用环境变量。
为什么是选择停用,而不是选择启用?
选择停用对我们来说是一种更好的方法,否则当某项功能影响客户的生成时,我们可能会得到有限的反馈。
相关内容
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈