.Net class 构建机器上的库编译错误
.Net class library compilation error on build machine
我有一个 SDK 风格的 .Net class 库,它可以在我的本地机器上正确编译,但是在构建服务器上失败。
.csproj的内容是
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net35;net40;netstandard1.0</TargetFrameworks>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<Version>1.5.6</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
</Project>
显示的错误是:
NETSDK1045:当前的 .NET SDK 不支持面向 .NET Standard 4.0。以 .NET Standard 2.1 或更低版本为目标,或者使用支持 .NET Standard 4.0
的 .NET SDK 版本
我在构建服务器上安装了 .NET Core 3.1.113,在本地计算机上安装了 .NET 5。
注意:如果我从 TargetFrameworks 中删除 netstandard1.0
,那么两台机器上的构建都会成功。但是我希望我的库也以 .net 标准 1.0 为目标。
我无法理解为什么 v4.0 在构建服务器上被视为 .NET Standard 4.0。谁能告诉我可能是什么问题?
I cannot understand why v4.0 is treated as .NET Standard 4.0 on build
server. Can anyone let me know what the problem might be?
这很奇怪,我以前从未见过这个问题。并且没有关于 .NET Standard 4.0
的信息,我不知道为什么 VS 将 v4.0
(net framework 4.0) 视为 net standard 4.0
。可能是你的服务器环境有问题
请遵循这些:
1) 首先,请使用CMD下的dotnet --list-sdks
检查您是否安装了net core 2.1
sdk或任何其他版本。实际上,net core 2.1 sdk 可以支持以前的sdks,包括net standard 1.0
。也许你最好安装 net core 2.1 sdk。另外,您可以安装最新的 Net Core 3.1 Sdk.
2)查看系统环境变量,是否有名为MSBuildSDKsPath
的变量,如果有,请将其删除。然后,重启。
3)删除构建服务器下的bin
和obj
文件夹。另外,我建议你最好使用 Build Tool for VS 在服务器上构建你的项目,而不是 dotnet build
。 dotnet cli
不包含net framework的工具。另外,你的项目是multi-targetframeworks,可以构建net core
和net standard
,而且你还得下载net framework sdk。
太复杂了,你可以安装the Build Tool for VS2019(更像是一个集成了dotnet、net framework、all vs环境的轻量级cmd)。另外,安装Net desktop build tool和net core build tool工作负载,同时安装相关的sdks。
当完成后,删除bin
和obj
文件夹,在VS命令的构建工具下输入:
msbuild xxx\xxx.csproj -t:clean,restore,build
从您的 .csproj
文件中删除 以下行:
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
这会覆盖 SDK 从 TargetFramework
推断的版本值,这将干扰您对 net3.5
的定义等等 - 您实际上构建了 .NET Framework 4.0 两次,然后覆盖了 netstandard1.0
到 .NET Standard(推断 TargetFrameworkIdentifier
)到 4.0。较新版本的 SDK 可能具有不同的推理逻辑,这可能是 3.1 和 5.0 SDK 之间的差异,但这仍然是 csproj 中的错误。
如果您的构建逻辑依赖于项目中定义的 TargetFrameworkVersion
,我建议您尝试更改您的构建逻辑 - 在您依赖 [=12= 的现代 csproj 文件中,这非常危险] 和 TargetFrameworks
(复数)。您也可以尝试将其移动到一个单独的 <PropertyGroup>
中,条件始终为假(例如 <PropertyGroup Condition="'$(ThisIsToWorkAroundBuildScripts)' == 'True'">
)
我有一个 SDK 风格的 .Net class 库,它可以在我的本地机器上正确编译,但是在构建服务器上失败。
.csproj的内容是
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net35;net40;netstandard1.0</TargetFrameworks>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<Version>1.5.6</Version>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
</Project>
显示的错误是: NETSDK1045:当前的 .NET SDK 不支持面向 .NET Standard 4.0。以 .NET Standard 2.1 或更低版本为目标,或者使用支持 .NET Standard 4.0
的 .NET SDK 版本我在构建服务器上安装了 .NET Core 3.1.113,在本地计算机上安装了 .NET 5。
注意:如果我从 TargetFrameworks 中删除 netstandard1.0
,那么两台机器上的构建都会成功。但是我希望我的库也以 .net 标准 1.0 为目标。
我无法理解为什么 v4.0 在构建服务器上被视为 .NET Standard 4.0。谁能告诉我可能是什么问题?
I cannot understand why v4.0 is treated as .NET Standard 4.0 on build server. Can anyone let me know what the problem might be?
这很奇怪,我以前从未见过这个问题。并且没有关于 .NET Standard 4.0
的信息,我不知道为什么 VS 将 v4.0
(net framework 4.0) 视为 net standard 4.0
。可能是你的服务器环境有问题
请遵循这些:
1) 首先,请使用CMD下的dotnet --list-sdks
检查您是否安装了net core 2.1
sdk或任何其他版本。实际上,net core 2.1 sdk 可以支持以前的sdks,包括net standard 1.0
。也许你最好安装 net core 2.1 sdk。另外,您可以安装最新的 Net Core 3.1 Sdk.
2)查看系统环境变量,是否有名为MSBuildSDKsPath
的变量,如果有,请将其删除。然后,重启。
3)删除构建服务器下的bin
和obj
文件夹。另外,我建议你最好使用 Build Tool for VS 在服务器上构建你的项目,而不是 dotnet build
。 dotnet cli
不包含net framework的工具。另外,你的项目是multi-targetframeworks,可以构建net core
和net standard
,而且你还得下载net framework sdk。
太复杂了,你可以安装the Build Tool for VS2019(更像是一个集成了dotnet、net framework、all vs环境的轻量级cmd)。另外,安装Net desktop build tool和net core build tool工作负载,同时安装相关的sdks。
当完成后,删除bin
和obj
文件夹,在VS命令的构建工具下输入:
msbuild xxx\xxx.csproj -t:clean,restore,build
从您的 .csproj
文件中删除 以下行:
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
这会覆盖 SDK 从 TargetFramework
推断的版本值,这将干扰您对 net3.5
的定义等等 - 您实际上构建了 .NET Framework 4.0 两次,然后覆盖了 netstandard1.0
到 .NET Standard(推断 TargetFrameworkIdentifier
)到 4.0。较新版本的 SDK 可能具有不同的推理逻辑,这可能是 3.1 和 5.0 SDK 之间的差异,但这仍然是 csproj 中的错误。
如果您的构建逻辑依赖于项目中定义的 TargetFrameworkVersion
,我建议您尝试更改您的构建逻辑 - 在您依赖 [=12= 的现代 csproj 文件中,这非常危险] 和 TargetFrameworks
(复数)。您也可以尝试将其移动到一个单独的 <PropertyGroup>
中,条件始终为假(例如 <PropertyGroup Condition="'$(ThisIsToWorkAroundBuildScripts)' == 'True'">
)