1
votes

I've set up an artifact feed in Azure Devops and pushed some of our private packages to it using "nuget.exe push".

The problem I have is some packages have multiple versions (e.g. 1.1, 1.2, 1.3 etc) and we have a number of projects where some will use 1.1, some will use 1.2 etc.

After uploading versions 1.1, 1.2 and 1.3 to the artifact feed, only 1.3 is available to my projects as it is the latest version. If I click into the uploaded package in the Devops interface I can see the previous versions, but none of the devops projects that use 1.1 or 1.2 will build as they can't find the older versions.

I've read in a few places that a way around it would be to have one artifact feed per project, with the required versions pushed to that feed. The issue I have with that is that I've simplified the scale of my problem as in reality we have around 20 packages, each one could have up to 30 different versions, and I have around 50 projects. To create a feed for each one would be massively time consuming and would involve duplicating a lot of packages when I push them.

If I add any package to a project from nuget, I get to choose which version I want to add but it seems like I can't replicate this when using an artifact feed. Am I doing this incorrectly or is there a better way to achieve what I need?

EDIT:

I'm not using a project-scoped feed, it is listed in Devops as a organisation-scoped feed.

The packages.config file specifically targets a certain version e.g.

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

and the error log shows that is can't find this version:

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

The feed itself shows that version 2.17.61 is the current one, but 2.17.60 is what is needed for this particular project and does appear in the version history: Current Feed

Version History

2

2 Answers

1
votes

Am I doing this incorrectly or is there a better way to achieve what I need?

I am afraid you may have made some incorrect settings. That because the Azure Artifact supports multiple versions of a packages. That also is reason why you can see the previous versions in the Devops interface.

When we use the nuget restore in the Azure devops pipeline, nuget restore task will restore the package according to the version of the package specified in the packages.config/PackageReference, like:

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>

So, please check the following possibilities that may cause this issue:

  • Check if your Azure Artifact is project scoped feeds(If your Azure Artifact feeds are created before 11/4/2019, please go to second point):

    enter image description here

  • Check if you use wildcards in the packages.config/PackageReference:

    <PackageReference Include="Packagename" Version="1.*" />
    
  • Check if there is a nuget.config in your solution with following settings:

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

If above not help you, please share us more info about this issue, the info/image about the packages.config/PackageReference for the build failed project, info/image about the Azure Artifact including the package version 1.1, 1.2, the latest but not important, the error log.

Hope this helps.

0
votes

Thanks to the help from @Leo Liu-MSFT I worked out what needed to be modified:

1 Delete the nuget.exe and nuget.targets files from the .nuget folder

2 Delete the references in all .csproj files that pointed to the nuget.targets file:

  <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 Add a step in the pipeline YAML before the build that looks at the nuget.config file to restore the packages:

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

This now builds the solution correctly and can reference any previous version of a package