我正在与少数Xamarin Forms项目以及产生多目标Xamarin软件包的项目合作。我花了整整一天的时间努力让其中一个项目在Azure DevOps中正常工作,我放弃了。
当我在本地处理一个特定的单元测试项目时,它会设置以下目录结构:
+ ProjectName
+ bin
+ obj
+ ...
+ packages
+ <nuget packages here>
这种结构在项目文件的某些部分中表现出来,如下所示:
<Import Project="..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" />
<Import Project="..\..\packages\NUnit.3.12.0\build\NUnit.props" Condition="Exists('..\..\packages\NUnit.3.12.0\build\NUnit.props')" />
项目文件的另一部分依赖于此:
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\..\packages\NUnit.3.12.0\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit.3.12.0\build\NUnit.props'))" />
<Error Condition="!Exists('..\..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.15.1\build\net35\NUnit3TestAdapter.props'))" />
</Target>
当我在本地构建时,一切都很好。项目建立。测试通过。当我在Azure DevOps中构建此文件时,它会失败:
(EnsureNuGetPackageBuildImports target) ->
D:\a\1\s\[Redacted].Unit.Tests\[Redacted].Unit.Tests.csproj(97,5): error : This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is ..\..\packages\NUnit.3.12.0\build\NUnit.props.
因此,很明显,Azure DevOps对于packages
文件夹的创建位置有不同的想法。如果我将..\..
修改为..\
,则一切正常。这与许多项目是一致的。在我的其他几个项目中,所有.csproj文件都使用..\
,它们具有以下目录结构:
+ ProjectName
+ bin
+ obj
+ packages
+ ...
我在.csproj
中都找不到任何东西,这似乎表明任何人都在指示nuget进行其他操作。但是每个人的行为都非常不同。我唯一的猜测是我对“中断”有一些超级隐藏的本地配置,该配置会更改默认行为,并且该文件不在源代码管理中,因此DevOps使用“真实”默认值吗?
什么可能导致这种情况发生?
有人要求使用.yml来查看我们如何还原软件包:我相信就是这样:
- task: NuGetToolInstaller@1
displayName: "Install nuget"
inputs:
versionSpec: '4.4.1'
- task: NuGetCommand@2
displayName: 'restore $(solution)'
inputs:
restoreSolution: '$(solution)'
vstsFeed: "$(packageFeedName)"
我不是团队的迷恋者,但我对yml知之甚少。 $(solution)
只是我们解决方案文件的路径,而包供稿名称就是它的意思。它们对我来说似乎很简单。