如何仅在工具支持的情况下有条件地构建 .Net Core 3.0?
How do I conditionally build .Net Core 3.0 only if supported by tooling?
我想使用 TargetFrameworks .csproj 元素将 .Net Core 3.0 (netcoreapp3.0) 和 .Net Framework 4.8 (net48) 作为控制台应用程序的多目标,如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
<AssemblyName>MyConsoleApp</AssemblyName>
</PropertyGroup>
</Project>
但是,我希望同一个 .csproj 文件在旧工具中正常降级,并在工具不支持 netcoreapp3.0(例如Visual Studio 2017).
看了条件编译的文档,好像只说编译时改设置,没有说要不要先编译。
我怎样才能做到这一点?
I reviewed the conditional compilation documentation, but it seems to
talk only about changing settings when compiling, not whether to do
the compilation in the first place.
是的,msbuild conditions 应该在 <Project>
节点内工作。根据您的要求,我只能想象一种可能的方式,将 conditions
添加到第一个 PropertyGroup
(Condition="'$(VisualStudioVersion)'=='16.0'"
),类似于这种格式:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(VisualStudioVersion)'=='16.0'">
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(VisualStudioVersion)'!='16.0'">
<OutputType>Exe</OutputType>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>
<!-- ... other PropertyGroup with conditions-->
<!--I use this script to confirm that when building the project in VS2017(msbuild15.0),the VS version is 15.0 while in VS2019(msbuild16.0), VS version is 16.0-->
<Target Name="TestVersion" AfterTargets="build">
<Message Text="version=>$(VisualStudioVersion)" Importance="high"/>
</Target>
</Project>
不得不说,大多数时候,我们对 class 库项目而不是控制台项目使用多目标,不确定您这样做的具体原因...希望它能有所帮助 :)
更新:
在未安装VS的情况下构建.net
项目,可以考虑使用Build Tools for VS package
,这里是build tools for VS2019的link(包含msbuild 16.0)。在 All downloads=>Tools for VS2019
中我们可以找到构建工具包。
为确保我们可以使用此包中的 msbuild.exe 构建 .net framework4.8 和 .net core3.0 控制台项目,请确保我们在安装时启用了这些工作负载和组件:
我们可以导航至 Individual Components
以确保启用 .net core 3.0 和 .net 4.8。
我想使用 TargetFrameworks .csproj 元素将 .Net Core 3.0 (netcoreapp3.0) 和 .Net Framework 4.8 (net48) 作为控制台应用程序的多目标,如下所示:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
<AssemblyName>MyConsoleApp</AssemblyName>
</PropertyGroup>
</Project>
但是,我希望同一个 .csproj 文件在旧工具中正常降级,并在工具不支持 netcoreapp3.0(例如Visual Studio 2017).
看了条件编译的文档,好像只说编译时改设置,没有说要不要先编译。
我怎样才能做到这一点?
I reviewed the conditional compilation documentation, but it seems to talk only about changing settings when compiling, not whether to do the compilation in the first place.
是的,msbuild conditions 应该在 <Project>
节点内工作。根据您的要求,我只能想象一种可能的方式,将 conditions
添加到第一个 PropertyGroup
(Condition="'$(VisualStudioVersion)'=='16.0'"
),类似于这种格式:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup Condition="'$(VisualStudioVersion)'=='16.0'">
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.0;net48</TargetFrameworks>
</PropertyGroup>
<PropertyGroup Condition="'$(VisualStudioVersion)'!='16.0'">
<OutputType>Exe</OutputType>
<TargetFramework>net48</TargetFramework>
</PropertyGroup>
<!-- ... other PropertyGroup with conditions-->
<!--I use this script to confirm that when building the project in VS2017(msbuild15.0),the VS version is 15.0 while in VS2019(msbuild16.0), VS version is 16.0-->
<Target Name="TestVersion" AfterTargets="build">
<Message Text="version=>$(VisualStudioVersion)" Importance="high"/>
</Target>
</Project>
不得不说,大多数时候,我们对 class 库项目而不是控制台项目使用多目标,不确定您这样做的具体原因...希望它能有所帮助 :)
更新:
在未安装VS的情况下构建.net
项目,可以考虑使用Build Tools for VS package
,这里是build tools for VS2019的link(包含msbuild 16.0)。在 All downloads=>Tools for VS2019
中我们可以找到构建工具包。
为确保我们可以使用此包中的 msbuild.exe 构建 .net framework4.8 和 .net core3.0 控制台项目,请确保我们在安装时启用了这些工作负载和组件:
我们可以导航至 Individual Components
以确保启用 .net core 3.0 和 .net 4.8。