c# - 如果 MSBuild 工具为时过早,如何让 MSBuild .proj 失败
问题描述
我有一个 MSBuild .proj 文件,由不同的人在各种机器上以通常的方式执行,比如 msbuild.exe thingummy.proj
它编译的 C# 项目包括 .Net 4.5 功能,所以如果你用不知道以后的 .Nets 的早期 MSBuild 编译它,您将收到“类、结构或接口成员声明中的无效标记 '='”这类消息,这些消息在其他地方都有详细记录。(例如,通过命令行而不是在 Visual Studio 上使用 MSBuild 时出现无效令牌错误)
直接的解决方法是将您的 MSBuild 更新到最新版本,并确保您使用的是您认为的 MSBuild 版本。但是,如果不是得到一个深奥的“无效令牌......”消息(有点“想一想......”),而是说“需要 MSBuild v16 或更高版本(你的是v4.7)”或类似的东西。
所以我正在寻找一个MinimumMSBuildVersionRequired
参数或类似的东西放在我的 msbuildthingummy.proj
文件的顶部,以便在构建过程开始时,MSBuild 测试运行这个脚本的 MSBuild 是否足够新。我已经翻遍了,但找不到合适的候选人。
.proj
我可以在我的MSBuild 脚本中设置这样的参数吗?或者在使用不适当的 MSBuild 版本运行时提供信息性消息的其他解决方法?
解决方案
好的,感谢@pavelanikhouski 的输入,这行得通:
在我的脚本顶部,我添加了这个:
<Project InitialTargets="MyInitialChecks" ...
'InitialTargets' 很神奇(一定是这样)。'MyInitialChecks' 是我选择的任何东西作为我的检查器目标的名称。
然后我添加一个检查器目标,如下所示:
<Target Name="MyInitialChecks" >
<Error Condition="$(MSBuildToolsVersion) < 15.0"
Text="The version of MSBuild being used for this build (v$(MSBuildToolsVersion)) is too early. v15.0 or later is required." />
</Target>
直到并包括 Visual Studio 2017 和 MSBuildToolsVersion v15.0。
正如 Pavel 所指出的,当谈到 VS2019 时,所有的赌注都没有了,因为它不再报告 MSBuildToolsVersion。请参阅https://developercommunity.visualstudio.com/content/problem/404485/vs2019-msbuildtoolsversion-is-not-a-version.html
推荐阅读
- apache-pulsar - ApachePulsar:如何获取命名空间“sample/standalone/ns1”的策略?
- ios - 如何保护我的工作线程不被系统进程抢占?
- ios - Firebase 存储完成永远不会触发/被回调
- javascript - 将字符串拆分为数组是特定的方式
- reactjs - VSTS 运行 npm build 的时间太长
- python - 需要在matplotlib中绘制两种不同颜色的数据
- bloomberg - 如何将 BQL Bloomberg excel 公式实现到 python API (blpapi)?
- python - 在高度并行化的 HyperOpt 实例中,为什么 subprocess.Popen/os.system 与 > 和 2> 不起作用?
- java - 为什么 GC 不在同一方法中运行
- codeigniter - 进入实时共享主机时无法加载动态库