问题描述
I have a .NET Framework solution that I'm trying to set up with a pipeline on Azure DevOps. I'm getting an error when trying to restore packages though:
NU1202: Package AppCenter.Analytics.Metrics 1.1.0 is not compatible with net40 (.NETFramework,Version=v4.0). Package AppCenter.Analytics.Metrics 1.1.0 supports: netstandard1.0 (.NETStandard,Version=v1.0)
And many more like this. It's right - that package isn't compatible with net40, but it shouldn't matter. There are several projects in the solution, but the oldest .NET version is 4.5, so I can't figure out where the v4.0 is coming from in the above. Other things that may be relevant:
The build output reports a NuGet version of 5.3.1.6268 and MSBuild version of 16.3.2.50909. The solution restores and builds correctly locally. I noticed a "v4.0" in the .sln.metaproj file:<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
. That seems relevant, but I can't figure out where it's coming from or how to change it. Azure devops doesn't see this file as it's ignored by git, but I wonder what's causing that 4.0 there.
Here's a snippet from the pipeline.yaml:
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release 2019'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
command: 'restore'
restoreSolution: '$(solution)'
feedsToUse: 'select'
vstsFeed: '#####'
And here's one of the offending csproj files. There's some funny business for targeting multiple versions of Revit, and finding the location of Rhino dlls, but I can't see anything that would lead to trying to install packages for .NET v4.0:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft/developer/msbuild/2003">
<PropertyGroup>
<Rhino7DefaultInstallDir>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINESOFTWAREMcNeelRhinoceros7.0Install', 'Path', null, RegistryView.Registry64))</Rhino7DefaultInstallDir>
<Rhino7DebugInstallDir>$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USERSoftwareMcNeelRhinoceros7.0-WIP-Developer-Debug-trunkInstall', 'Path', null, RegistryView.Registry64))</Rhino7DebugInstallDir>
<Rhino7InstallDir>$([MSBuild]::ValueOrDefault('$(Rhino7DebugInstallDir)', '$(Rhino7DefaultInstallDir)'))</Rhino7InstallDir>
<Rhino7DefaultPluginsDir>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINESOFTWAREMcNeelRhinoceros7.0Install', 'Default Plug-ins Folder', null, RegistryView.Registry64))</Rhino7DefaultPluginsDir>
<Rhino7DebugPluginsDir>$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USERSoftwareMcNeelRhinoceros7.0-WIP-Developer-Debug-trunkInstall', 'Default Plug-ins Folder', null, RegistryView.Registry64))</Rhino7DebugPluginsDir>
<Rhino7PluginsDir>$([MSBuild]::ValueOrDefault('$(Rhino7DebugPluginsDir)', '$(Rhino7DefaultPluginsDir)'))</Rhino7PluginsDir>
</PropertyGroup>
<Import Project="....packagesCostura.Fody.3.3.3uildCostura.Fody.props" Condition="Exists('....packagesCostura.Fody.3.3.3uildCostura.Fody.props')" />
<PropertyGroup Condition="$(Configuration.Contains('2018'))">
<TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>
<RevitVersion>2018</RevitVersion>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('2019'))">
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<RevitVersion>2019</RevitVersion>
</PropertyGroup>
<PropertyGroup Condition="$(Configuration.Contains('2020'))">
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<RevitVersion>2020</RevitVersion>
</PropertyGroup>
<PropertyGroup>
<!-- Common ruleset shared by all projects -->
<CodeAnalysisRuleset>$(SolutionDir)solution.ruleset</CodeAnalysisRuleset>
</PropertyGroup>
<ItemGroup>
<AdditionalFiles Include="$(SolutionDir)stylecop.json" />
</ItemGroup>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>9.0.30729</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{D6C256D4-B518-464F-9E68-CB282202E846}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Namespace</RootNamespace>
<AssemblyName>AssemblyName</AssemblyName>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug 2018|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>binDebug 2018</OutputPath>
<DefineConstants>TRACE;DEBUG;REVIT_2018</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release 2018|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>binRelease 2018</OutputPath>
<PlatformTarget>AnyCPU</PlatformTarget>
<DefineConstants>REVIT_2018</DefineConstants>
<Optimize>true</Optimize>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug 2019|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>binDebug 2019</OutputPath>
<DefineConstants>TRACE;DEBUG;REVIT_2018; REVIT_2019</DefineConstants>
<DebugType>portable</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release 2019|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>binRelease 2019</OutputPath>
<PlatformTarget>AnyCPU</PlatformTarget>
<DefineConstants>REVIT_2018; REVIT_2019</DefineConstants>
<Optimize>true</Optimize>
<LangVersion>7.3</LangVersion>
<DebugType>portable</DebugType>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug 2020|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>binDebug 2020</OutputPath>
<DefineConstants>TRACE;DEBUG;REVIT_2018; REVIT_2019; REVIT_2020</DefineConstants>
<DebugType>full</DebugType>
<PlatformTarget>AnyCPU</PlatformTarget>
<ErrorReport>prompt</ErrorReport>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release 2020|AnyCPU'">
<DebugSymbols>true</DebugSymbols>
<OutputPath>binRelease 2020</OutputPath>
<PlatformTarget>AnyCPU</PlatformTarget>
<DefineConstants>REVIT_2018; REVIT_2019; REVIT_2020</DefineConstants>
<Optimize>true</Optimize>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualBasic" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>C:Program Files (x86)Reference AssembliesMicrosoftWindowsPowerShell3.0System.Management.Automation.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
... Files ...
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="PropertiesResources.resx">
<SubType>Designer</SubType>
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
... More Files in ItemGroups ...
<ItemGroup>
... Project References ...
</ItemGroup>
<ItemGroup>
<PackageReference Include="AppCenter.Analytics.Metrics">
<Version>1.1.0</Version>
</PackageReference>
<PackageReference Include="Microsoft.AppCenter.Analytics">
<Version>2.6.2</Version>
</PackageReference>
<PackageReference Include="Microsoft.AppCenter.Crashes">
<Version>2.6.2</Version>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers">
<Version>2.9.8</Version>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="StyleCop.Analyzers">
<Version>1.1.118</Version>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<Choose>
<When Condition="$(Configuration.Contains('Debug'))">
<ItemGroup>
<Reference Include="Eto">
<HintPath>$(Rhino7InstallDir)Eto.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RhinoCommon">
<HintPath>$(Rhino7InstallDir)RhinoCommon.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Rhino.UI">
<HintPath>$(Rhino7InstallDir)Rhino.UI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="GH_IO">
<HintPath>$(Rhino7PluginsDir)GrasshopperGH_IO.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Grasshopper">
<HintPath>$(Rhino7PluginsDir)GrasshopperGrasshopper.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RevitAPI">
<HintPath>C:Program FilesAutodeskRevit $(RevitVersion)RevitAPI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RevitAPIUI">
<HintPath>C:Program FilesAutodeskRevit $(RevitVersion)RevitAPIUI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AdWindows">
<HintPath>C:Program FilesAutodeskRevit $(RevitVersion)AdWindows.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<PackageReference Include="RhinoCommon" Version="7.0.19274.12465-wip" IncludeAssets="compile; build" />
<PackageReference Include="Grasshopper" Version="7.0.19274.12465-wip" IncludeAssets="compile; build" />
<PackageReference Include="Revit_All_Main_Versions_API_x64" Version="$(RevitVersion).0.*" IncludeAssets="build; compile" />
</ItemGroup>
</Otherwise>
</Choose>
<Import Project="$(MSBuildToolsPath)Microsoft.CSharp.targets" />
<PropertyGroup>
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
</PropertyGroup>
</Project>
I haven't been able to figure out what to check for or how to debug this. Thanks!
解决方案I noticed a "v4.0" in the .sln.metaproj file. I haven't been able to figure out what to check for or how to debug this.
Some tips that may help for trouble-shooting and resolving the issue:
#1. I think the .sln.metaproj
in solution folder and .csproj.metaproj
in project folder should be excluded from Source Control. At least these files is not recommended to publish to Azure Devops Repos
.
Check their content we can find something like <ProjectConfiguration Project="{xxx}" AbsolutePath="C:Usersxxxsourceepos...>
, it's an absolute path in local machine. When using Hosted agent in Build Pipeline, these paths are invalid.
#2. Also, I checked the log of Nuget Restore
task, and confirm the content of xx.xx.metaproj
files won't affect the nuget restore
process. So I think your issue didn't result from this.
#3 The NU1202 indicates the package is not compatible with current project. Check the log of Nuget Restore
task you'll see something like this:
The error message will tell us which project causes the issue. Open the xx.csproj
file in Devops Repos
to check its content. I assume the version of the project targets v4.0 or one of its targetFrameworks(multi-targeting) is v4.0. And if that project is a sdk-format project, you may need to use dotnet restore
task to restore packages for that.
Update:
See here, nuget restore
command won't receive and recognize build configuration. So for this situation, nuget can't access the propertyGroup whose conditions is $(Configuration.Contains('xxx'))
. Then it is equivalent to nuget restore xx.sln
=>nuget restore one project whose TargetFrameworkVersion
is empty.And then nuget will consider this project uses default 4.0. So the issue occurs.
Steps to reproduce:
1.Create a simple framework 4.7 project, add this into xx.csproj
:
<PackageReference Include="AppCenter.Analytics.Metrics">
<Version>1.1.0</Version>
</PackageReference>
2.Comment the <!--<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>-->
3.Save all and nuget restore xx.sln
, same issue occurs:
Possible Workaround:
nuget restore
won't accept something like nuget restore xx.sln -property:Configuration=xxx
like nuget pack
command. So this issue will always occur unless we define the valid TargetFramework version in propertyGroup no matter which conditions. (I guess this is not what you want, but this issue cannot be avoided for this situation)
So I think a better choice is to use msbuild /t:restore
instead of nuget restore
. For VS2017 and above, msbuild has contained the restore
option itself. And it works for those fx
based projects that use PackageReference format.
So you can use VS build task with arguments /t:restore
to restore the packages instead of using Nuget restore(this is not suitable for your custom csproj script).
这篇关于运行 Nuget restore 时出现 NU1202 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
更多推荐
[db:关键词]
发布评论