Я работаю с несколькими проектами Xamarin Forms и проектами, которые производят многоцелевые пакеты Xamarin. Я потратил целый день на то, чтобы заставить один из проектов работать должным образом в DevOps Azure, и я сдаюсь.
Когда я работаю с одним конкретным модульным тестовым проектом локально, он устанавливает следующую структуру каталогов:
+ 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)
- это просто путь к нашему файлу решения, а имя канала пакета соответствует его имени. Они кажутся мне довольно простыми.