Mos*_*ndi 1 msbuild visual-studio
我正在尝试使用 Directory.Build.props 文件将一堆项目的 TargetFrameworkVersion 从 v4.6.1 更改为 v4.8。
我在 Directory.Build.props 文件下有 .net 框架和 .net 标准项目的组合,我想在更新时忽略 .net 标准项目。
对于 .net 框架项目,一切都按预期工作但是,条件"'$(TargetFramework.Contains(netstandard))' == 'false'"相反!对于 .net 标准的。
换句话说,为这个项目添加了属性并且构建失败,而它不应该。
MyClassLibrary.csproj
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
目录.Build.props
<?xml version="1.0" encoding="utf-8"?>
<Project>
<PropertyGroup Condition="'$(TargetFramework.Contains(netstandard))' == 'false'">
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
怎么会错?
正如本文档所说,Directory.Build.props在 MSBuild 期间很早就导入了,这意味着它将先执行文件的内容,然后再从xxx.csproj项目中的文件中读取所有属性。
并且Directory.Build.targets在xxx.csproj文件末尾导入,因此它可以覆盖属性。
Directory.Build.props通常用于创建全局属性,而Directory.Build.targets用于覆盖属性。
================================================== ========================
对于Net Framework项目,
在您的问题,MSBuild的第一读取性能TargetFrameworkVersion 4.8在Directory.Build.props事实上也是如此。
项目TargetFramework中不存在该属性net framework(它是新sdk项目的属性),所以值为空,条件总是flase这样,条件成立。(flase=false)。
然后,MSBuild 读取xxx.csproj,它将读取属性TargetFrameworkVersion 4.6.1然后覆盖该属性4.8。因此它将始终使用 value 4.6.1。
================================================== ========================
对于Net Standard项目,属性TargetFramework在xxx.csproj文件下定义。当您第一次阅读内容并在Directory.Build.props文件中使用它时。
因为文件在读取之前运行xxx.csproj,TargetFramework属性还没有定义,所以条件是false。false=false导致条件的建立。TargetFrameworkVersion 4.8当 net 标准项目使用 property 时,它将读取property TargetFramework。
TargetFrameworkVersion设置为net framework 4.8而在网络标准项目中,该值通常是v2.0或v2.1(net standard 2.0或net standard 2.1),它不能读net framework 4.8入网络标准项目。并且后续xxx.csproj文件没有值可以覆盖TargetFrameworkVersion为正常值net standard。
因此作为 的值TargetFrameworkVersion嵌入到net standard项目中net framework,因此由于不兼容而导致构建失败。
解决方案
相反,您应该将Directory.Build.props文件重命名为Directory.Build.targets.
然后,重新启动您的项目,重建您的解决方案以启用它。它可以在我身边很好地工作。
请注意:尽管您右键单击项目属性-->应用程序-->目标框架显示旧的net framework 4.6.1,但MSBuild已将其设置为net48.
只是UI显示问题,没关系,可以无视。
| 归档时间: |
|
| 查看次数: |
1261 次 |
| 最近记录: |