Reputation: 621
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:
<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.com/developer/msbuild/2003">
<PropertyGroup>
<Rhino7DefaultInstallDir>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\McNeel\Rhinoceros\7.0\Install', 'Path', null, RegistryView.Registry64))</Rhino7DefaultInstallDir>
<Rhino7DebugInstallDir>$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\Software\McNeel\Rhinoceros\7.0-WIP-Developer-Debug-trunk\Install', 'Path', null, RegistryView.Registry64))</Rhino7DebugInstallDir>
<Rhino7InstallDir>$([MSBuild]::ValueOrDefault('$(Rhino7DebugInstallDir)', '$(Rhino7DefaultInstallDir)'))</Rhino7InstallDir>
<Rhino7DefaultPluginsDir>$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\McNeel\Rhinoceros\7.0\Install', 'Default Plug-ins Folder', null, RegistryView.Registry64))</Rhino7DefaultPluginsDir>
<Rhino7DebugPluginsDir>$([MSBuild]::GetRegistryValueFromView('HKEY_CURRENT_USER\Software\McNeel\Rhinoceros\7.0-WIP-Developer-Debug-trunk\Install', 'Default Plug-ins Folder', null, RegistryView.Registry64))</Rhino7DebugPluginsDir>
<Rhino7PluginsDir>$([MSBuild]::ValueOrDefault('$(Rhino7DebugPluginsDir)', '$(Rhino7DefaultPluginsDir)'))</Rhino7PluginsDir>
</PropertyGroup>
<Import Project="..\..\packages\Costura.Fody.3.3.3\build\Costura.Fody.props" Condition="Exists('..\..\packages\Costura.Fody.3.3.3\build\Costura.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>bin\Debug 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>bin\Release 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>bin\Debug 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>bin\Release 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>bin\Debug 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>bin\Release 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 Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
... Files ...
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Properties\Resources.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)Grasshopper\GH_IO.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Grasshopper">
<HintPath>$(Rhino7PluginsDir)Grasshopper\Grasshopper.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RevitAPI">
<HintPath>C:\Program Files\Autodesk\Revit $(RevitVersion)\RevitAPI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="RevitAPIUI">
<HintPath>C:\Program Files\Autodesk\Revit $(RevitVersion)\RevitAPIUI.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="AdWindows">
<HintPath>C:\Program Files\Autodesk\Revit $(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!
Upvotes: 4
Views: 13533
Reputation: 28216
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:\Users\xxx\source\repos\...>
, 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 .net 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 .net 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).
Upvotes: 2