更改波次
更改波次是 MSBuild 中的一组行为变更,你可以通过指定特定标志作为环境变量来选择停用。 这样做的目的是警告你潜在的破坏性更改,以便在这些更改成为标准功能之前灵活地适应这些更改。 特定更改波中的所有功能只能整体启用或禁用,无法单独进行操作。
当你升级到新版 MSBuild 时,潜在的颠覆性更改是默认启用的,但如果某项功能对你的生成产生负面影响,你可以轻松地禁用相应更改波次。 每个更改波都由 MSBuild 版本号(例如 16.8)标识,但设置更改波仅控制可能影响生成过程的某些功能,而不是该 MSBuild 版本中的所有更改。 本文稍后的部分中列出了每个更改波次中的功能。 禁用一个变更波也会禁用更高版本的变更波。
选择停用变更波功能
若要禁用更改波次中的功能,请将环境变量 MSBuildDisableFeaturesFromVersion
设置为包含要禁用的功能的更改波次(或 MSBuild 版本)。 这是为开发这些功能而使用的 MSBuild 版本。 请参阅下面的更改波次与功能的映射。
MSBuildDisableFeaturesFromVersion 值
如果未将 MSBuildDisableFeaturesFromVersion
设置为有效的更改波,则会收到警告和/或默认为特定波形。 下表显示了可能的设置:
MSBuildDisableFeaturesFromVersion 值 |
结果 | 收到警告? |
---|---|---|
未设置 | 启用所有更改波,这意味着启用每个更改波背后的所有功能。 | 不 |
任何有效的当前更改波次(例如 16.8 ) |
禁用更改波次 16.8 及更高版本后面的所有功能。 |
不 |
无效值(例如,16.9 ,当有效波为 16.8 和 16.10 时) |
默认为最接近的有效值(升序)。 例如,如果设置 16.9 ,则默认为 16.10 。 |
不 |
不轮换(例如,如果最高波为 17.0 ,则为 17.1 ) |
固定为最接近的有效值。 例如,17.1 固定到 17.0 ,16.5 固定到 16.8 |
是的 |
无效格式(例如,16x8 、17_0 、garbage ) |
启用所有更改波,这意味着启用每个更改波背后的所有功能。 | 是的 |
更改波次和关联的功能
17.10
- 在不使用 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 评估
常见问题
为什么要每隔一个地定位版本来轮换更改波次?
我们认为,这足以与受影响的人进行讨论,并帮助适应这些变化。
为什么是环境变量而不是项目属性?
在某些情况下,我们希望在 MSBuild 加载项目之前将功能置于更改波下。 因此,更改波需要使用环境变量。
为什么选择退出而不是选择加入?
选择停用对我们来说是一种更好的方法,否则当某项功能影响客户的生成时,我们可能会得到有限的反馈。
相关内容
- MSBuild
- MSBuild 16 中的新增功能