Несколько версий пакета в Azure Artifact

Я настроил канал артефактов в Azure Devops и отправил в него некоторые из наших частных пакетов с помощью «nuget.exe push».

У меня есть проблема в том, что некоторые пакеты имеют несколько версий (например, 1.1, 1.2, 1.3 и т. Д.), И у нас есть ряд проектов, в которых некоторые будут использовать 1.1, некоторые - 1.2 и т. Д.

После загрузки версий 1.1, 1.2 и 1.3 в ленту артефактов для моих проектов доступна только 1.3, так как это последняя версия. Если я нажму на загруженный пакет в интерфейсе Devops, я увижу предыдущие версии, но ни один из проектов DevOps, использующих 1.1 или 1.2, не будет собран, поскольку они не могут найти более старые версии.

Я читал в нескольких местах, что можно обойтись одним фидом артефактов для каждого проекта с необходимыми версиями, помещенными в этот фид. Проблема, с которой я столкнулся, заключается в том, что я упростил масштаб своей проблемы, поскольку на самом деле у нас есть около 20 пакетов, каждый из которых может иметь до 30 различных версий, а у меня около 50 проектов. Создание канала для каждого из них заняло бы очень много времени и потребовало бы дублирования большого количества пакетов, когда я их отправляю.

Если я добавляю какой-либо пакет в проект из nuget, я могу выбрать, какую версию я хочу добавить, но похоже, что я не могу воспроизвести это при использовании канала артефактов. Я делаю это неправильно или есть лучший способ добиться того, что мне нужно?

РЕДАКТИРОВАТЬ:

Я не использую канал уровня проекта, он указан в Devops как канал уровня организации.

Файл packages.config специально нацелен на определенную версию, например.

<package id="CommonResourceAssembly" version="2.17.60.0" targetFramework="net451" />

и журнал ошибок показывает, что не может найти эту версию:

##[error].nuget\NuGet.targets(103,9): Error : Unable to find version '2.17.60.0' of package 'CommonResourceAssembly'.

Сам канал показывает, что версия 2.17.61 является текущей, но 2.17.60 - это то, что необходимо для этого конкретного проекта, и она отображается в истории версий:  Текущий канал

История версий


person ca8msm    schedule 20.12.2019    source источник


Ответы (2)


Я делаю это неправильно или есть лучший способ добиться того, что мне нужно?

Боюсь, что вы сделали неверные настройки. Это потому, что артефакт Azure поддерживает несколько версий пакетов. Это также причина, по которой вы можете увидеть предыдущие версии в интерфейсе Devops.

Когда мы используем восстановление nuget в конвейере DevOps Azure, задача восстановления nuget восстанавливает пакет в соответствии с версией пакета, указанной в _1 _ / _ 2_, например:

Packages.config:

<packages>
  <package id="Newtonsoft.Json" version="8.0.3" targetFramework="net46" />
</packages>

PackageReference:

<ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="8.0.3" />
</ItemGroup>

Итак, проверьте следующие возможности, которые могут вызвать эту проблему:

  • Убедитесь, что ваш артефакт Azure фиды с заданной областью проекта (если фиды Azure Artifact созданы до 11/4/2019, перейдите ко второму пункту):

    введите здесь описание изображения

  • Проверьте, используете ли вы подстановочные знаки в _5 _ / _ 6_:

    <PackageReference Include="Packagename" Version="1.*" />
    
  • Проверьте, есть ли в вашем решении nuget.config со следующими настройками:

    <configuration>
       <config> 
         <add key="dependencyversion" value="Highest" /> 
       </config>
    </configuration>
    

Если приведенное выше не помогло вам, поделитесь с нами дополнительной информацией об этой проблеме, информацией / изображением о _9 _ / _ 10_ для проекта с ошибкой сборки, информацией / изображением об артефакте Azure, включая версию пакета 1.1, 1.2, последнюю, но не важную , журнал ошибок.

Надеюсь это поможет.

person Leo Liu-MSFT    schedule 23.12.2019
comment
Спасибо, это фид для всей организации, который я создал, и я обновил исходный пост, добавив больше деталей. Видите ли вы какие-то неправильные настройки из обновлений? - person ca8msm; 23.12.2019
comment
@ ca8msm, спасибо за быстрый ответ. Я проверил ваши обновления, но не нашел никаких неправильных настроек из обновлений. Просто странное место, ошибка исходит от .nuget\NuGet.targets, а не от nuget / nuget.exe, похоже, ваш пакет все еще использует метод восстановления старой версии, chrismay.org/2015/01/07/. Итак, вы можете проверить, возникла ли эта проблема в общедоступном пакете, если да, сообщите нам, чтобы мы могли воспроизвести ее. - person Leo Liu-MSFT; 23.12.2019

Благодаря помощи @Leo Liu-MSFT я решил, что нужно изменить:

1 Удалите файлы nuget.exe и nuget.targets из папки .nuget.

2 Удалите ссылки во всех файлах .csproj, указывающие на файл nuget.targets:

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />   <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
  <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable 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('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />   </Target>

3 Добавьте шаг в конвейер YAML перед сборкой, который просматривает файл nuget.config для восстановления пакетов:

task: NuGetCommand@2   
displayName: 'NuGet restore'   
inputs:   
 restoreSolution: '**\*.sln'   
 feedsToUse: config   
 nugetConfigPath: '.nuget/NuGet.config'

Теперь это правильно создает решение и может ссылаться на любую предыдущую версию пакета.

person ca8msm    schedule 23.12.2019