我有一个.NET Framework解决方案,试图在Azure DevOps上使用管道进行设置。尝试还原软件包时出现错误:
StaffAccounts
还有更多类似的东西。是的-该软件包与net40不兼容,但这无关紧要。该解决方案中有多个项目,但是最旧的.NET版本是4.5,因此我无法确定上述v4.0的来源。其他可能相关的事情:
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: '#####'
我一直无法弄清楚要检查什么或如何调试它。谢谢!
答案 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
任务的日志,您会看到类似以下内容的信息:
错误消息将告诉我们哪个项目导致了问题。打开xx.csproj
中的Devops Repos
文件以检查其内容。我假设项目目标版本为v4.0或其targetFrameworks(multi-targeting)的版本为v4.0。并且,如果该项目是sdk格式的项目,则可能需要使用dotnet restore
任务来为此还原软件包。
更新:
请参见here,nuget 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
,会发生相同的问题:
可能的解决方法:
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脚本)。