运行Nuget Restore时出现NU1202错误

时间:2019-12-03 22:12:38

标签: .net azure-devops azure-pipelines

我有一个.NET Framework解决方案,试图在Azure DevOps上使用管道进行设置。尝试还原软件包时出现错误:

StaffAccounts

还有更多类似的东西。是的-该软件包与net40不兼容,但这无关紧要。该解决方案中有多个项目,但是最旧的.NET版本是4.5,因此我无法确定上述v4.0的来源。其他可能相关的事情:

  1. 构建输出报告5.3.1.6268的NuGet版本和16.3.2.50909的MSBuild版本。
  2. 该解决方案可以在本地正确还原和构建。
  3. 我在.sln.metaproj文件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) 中注意到一个“ v4.0”。这似乎很重要,但是我不知道它是从哪里来的或者如何更改它。 Azure devops看不到该文件,因为它已被git忽略,但我想知道是什么原因导致该文件在那里出现4.0。

这是pipeline.yaml中的代码段:

<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>

这是有问题的csproj文件之一。针对多个Revit版本并查找Rhino dll的位置有些有趣的事情,但是我看不到会导致尝试为.NET v4.0安装软件包的任何事情:

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: '#####'

我一直无法弄清楚要检查什么或如何调试它。谢谢!

1 个答案:

答案 0 :(得分:1)

  

我注意到.sln.metaproj文件中有一个“ v4.0”。我没能   弄清楚要检查什么或如何调试它。

一些提示,可能有助于解决问题和解决问题:

#1。我认为解决方案文件夹中的.sln.metaproj和项目文件夹中的.csproj.metaproj应该从源代码管理中排除。至少不建议将这些文件发布到Azure Devops Repos

检查其内容,我们可以找到类似<ProjectConfiguration Project="{xxx}" AbsolutePath="C:\Users\xxx\source\repos\...>的内容,这是本地计算机中的绝对路径。在构建管道中使用托管代理时,这些路径无效。

#2。另外,我检查了Nuget Restore任务的日志,并确认xx.xx.metaproj文件的内容不会影响nuget restore进程。因此,我认为您的问题并非由此造成的。

#3 NU1202指示该软件包与当前项目不兼容。查看Nuget Restore任务的日志,您会看到类似以下内容的信息:

enter image description here

错误消息将告诉我们哪个项目导致了问题。打开xx.csproj中的Devops Repos文件以检查其内容。我假设项目目标版本为v4.0或其targetFrameworks(multi-targeting)的版本为v4.0。并且,如果该项目是sdk格式的项目,则可能需要使用dotnet restore任务来为此还原软件包。

更新

请参见herenuget restore命令将不会接收和识别构建配置。因此,在这种情况下,nuget无法访问条件为$(Configuration.Contains('xxx'))的propertyGroup。相当于nuget restore xx.sln => nuget恢复一个TargetFrameworkVersion为空的项目。然后nuget会认为该项目使用默认4.0。因此出现了问题。

复制步骤:

1。创建一个简单的.net framework 4.7项目,并将其添加到xx.csproj中:

    <PackageReference Include="AppCenter.Analytics.Metrics">
      <Version>1.1.0</Version>
    </PackageReference>

2。注释<!--<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>-->

3。保存所有和nuget restore xx.sln,会发生相同的问题:

enter image description here

可能的解决方法:

nuget restore将不接受类似nuget restore xx.sln -property:Configuration=xxx之类的nuget pack命令。因此,无论我们在哪种情况下,除非在propertyGroup中定义 valid TargetFramework版本,否则始终会发生此问题。 (我想这不是您想要的,但是在这种情况下无法避免此问题)

因此,我认为更好的选择是使用msbuild /t:restore而不是nuget restore。对于VS2017及更高版本,msbuild本身包含restore选项。它适用于那些使用PackageReference格式的基于.net fx的项目。

因此,您可以使用带有参数/t:restore的VS build任务来还原软件包,而不是使用Nuget restore(这不适用于您的自定义csproj脚本)。

enter image description here