3

如果检测到任何程序集冲突,我试图强制构建失败。

默认的 MSBuild 脚本运行一个名为 ResolveAssemblyReference 的任务来定位所有依赖项并尝试解决任何冲突。但是,它将偏爱主要引用和更高版本的程序集,并且根据 ResolveAssemblyReference 任务中的各种规则,它将选择更高版本的程序集或更糟的是,任意选择冲突获胜者。

这种方法存在问题;在某些情况下,构建会顺利通过,但在运行时会失败。例如

应用程序->Assemby1->Assembly3 V1

应用程序->Assembly2->Assembly3 V1.1

在某些情况下,根据 ResolveAssemblyReference 中的强名称和规则,Assembly3V1 可能被选为冲突赢家,因此如果 Assembly2 依赖于 Assembly3 1.1 版中的新方法或类,则可能会生成运行时错误。(有很多变化也可能导致成功的构建和运行时失败)

我们正在远离项目引用并开始使用 NuGet 进行内部组件管理,因此,这个问题对我们来说是一个更大的问题。我想修改我们的默认 MSBuild 脚本以在检测到任何冲突时使构建失败(具有覆盖/忽略审查冲突的能力)。

问题是,虽然 ResolveAssemblyReference 任务完成了识别冲突的彻底工作,但它只会在失去冲突的引用是主要引用的特定情况下生成警告。对于所有其他冲突,它只是将消息记录到构建输出。

如果检测到冲突,我正在寻找一种生成警告或错误的方法,因此构建将失败。

想法?

4

0 回答 0