Как NuGet решает, куда поместить каталог пакетов? - PullRequest
4 голосов
/ 14 октября 2019

Я работаю с несколькими проектами 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) - это просто путь к нашему файлу решения, а имя канала пакета соответствует его имени. Они кажутся мне довольно простыми.

...