Пакет NuGet не показывает зависимостей?

Я пытаюсь создать пакет NuGet из библиотеки классов .NET 4.7.2 (VS2017), но полученный пакет NuGet на удивление не показывает зависимостей (что является ошибкой).

Моя установка такая:

  • Моя библиотека классов - .NET Framework 4.7.2
  • Моя библиотека классов использует другой пакет NuGet (который имеет зависимости).
  • Моя библиотека классов использует packageReferences в .csproj
  • Моя библиотека классов содержит правильный файл .nuspec
  • Я использую nuget.exe pack для создания пакета

Команда nuget.exe pack должна автоматически заполнить необходимые зависимости - так было и раньше (в другом проекте). Однако в то время я использовал packages.config вместо packageReferences с моей библиотекой классов. Это что-нибудь меняет?

Что здесь происходит?

Как я могу заставить систему снова включить необходимые зависимости в мой пакет?

Примечания:

  • Пакет создается с помощью сценария MSBuild на нашем сервере сборки TeamCity (без VS2017). Это сценарий сборки, который вызывает как «nuget.exe restore», так и более позднюю версию «nuget.exe pack» как часть своей логики сборки.

  • MSBuild - это версия 15.7

  • nuget.exe - это версия 4.6.2


person Martin Christiansen    schedule 13.08.2018    source источник


Ответы (2)


Как я могу заставить систему снова включить необходимые зависимости в мой пакет?

Это известная проблема, связанная с nuget pack игнорирует зависимости при использовании PackageReference вместо packages.config .

Чтобы решить эту проблему, вы можете использовать следующий обходной путь, и группа NuGet все еще активно работает над улучшением этого сценария:

Чтобы упаковать вашу библиотеку классов C #, которая управляет вашими зависимостями через PackageReference в самом csproj,

добавьте ссылку на NuGet.Build.Tasks.Pack (https://www.nuget.org/packages/NuGet.Build.Tasks.Pack/) и запустите msbuild /t:pack из командной строки.

Я протестировал этот обходной путь, он работает нормально. Чтобы убедиться, что этот обходной путь работает нормально, нам необходимо обратить внимание на следующие моменты:

  • Необходимо добавить в проект пакет nuget NuGet.Build.Tasks.Pack.
  • Необходимо добавить свойства /p:PackageOutputPath="D:\TesterFolder" -p:Authors=tester
  • Используйте команду msbuild.exe /t:pack, например: msbuild.exe /t:pack "MyTestLibrary.csproj" /p:PackageOutputPath="D:\TestFolder" -p:Authors=tester

Кроме того, если вы хотите использовать .nuspec файл для создания пакета nuget, вам следует использовать следующий .nuspec файл:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyTestLibrary</id>
    <version>1.0.0</version>
    <authors>Tester</authors>
    <owners>Tester</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>Tag1 Tag2</tags>
    <dependencies>
      <group targetFramework=".NETFramework4.7.2">
        <dependency id="Microsoft.Owin" version="4.0.0" exclude="Build,Analyzers" />
      </group>
    </dependencies>
  </metadata>

    <files>
        <file src="bin\Debug\MyTestLibrary.dll" target="lib\net472\MyTestLibrary.dll" />
    </files>
</package>

Затем мы могли бы использовать nuget.exe pack для создания пакета nuget. Но, используя этот метод, мы должны вручную заполнить необходимые зависимости в файле .nuspec.

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

person Leo Liu-MSFT    schedule 14.08.2018
comment
Это очень помогло - я решил использовать MSBuild для сборки пакета вместо nuget.exe, и теперь все работает! Большое спасибо! - person Martin Christiansen; 14.08.2018

У меня такая же проблема, и я использую второй способ упоминания Лео Лю с Скриптом Патрика и небольшая модификация для решения этой проблемы. Ниже приведены шаги:

  1. Copy or download powershell script below, name it NuGetPackDependencies.ps1 and add it to your solution (Because I want to reuse the same script for many projects in this solution) enter image description here
    function Format-XML {Param ([string]$xmlfile) 
      
      $Doc=New-Object system.xml.xmlDataDocument 
      $doc.Load((Resolve-Path $xmlfile)) 
      $sw=New-Object system.io.stringwriter 
      $writer=New-Object system.xml.xmltextwriter($sw) 
      $writer.Formatting = [System.xml.formatting]::Indented 
      $doc.WriteContentTo($writer) 
      $sw.ToString() 
    }
    
    '*****'
    '***** PowerShell script NugetPackDependencies 1.0.'
    '***** Insert project package references as dependencies into package manifest (nuspec file)'
    '*****'
    '***** Start script'
    '*****'
    
    Set-Location -Path $args[0]
    
    # Get VB.NET or C# project file.
    $projFile = (ls -Path "*.vbproj", "*.csproj" | Select-Object -First 1).Name
    
    # If project file cannot be found exit script.
    if ($projFile -eq $null) {'***** Project file not found. Exit script'
                                exit}
    else {"***** Get package references from project file: '" + $projFile + "'"} 
    
    
                      
    # Get content from project file.
    $projFileContent = ls -Filter $projFile | Get-Content
    
    # Convert content from project file to XML.
    $projFileXml  = [xml]$projFileContent
    
    
    # Namespace 
    $nm = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $projFileXml.NameTable
    $nm.AddNamespace('x', 'http://schemas.microsoft.com/developer/msbuild/2003')
    
    
    # Get package references from project file xml and put them in an list of new objects containg id and version.
    $packRefs=$projFileXml.SelectNodes('/x:Project/x:ItemGroup/x:PackageReference', $nm) | 
    ForEach-Object {New-Object -TypeName PSObject -Property @{
                        id = New-Object -TypeName Reflection.AssemblyName -ArgumentList $_.Include
                        version = New-Object -TypeName Reflection.AssemblyName -ArgumentList $_.Version}               
                    } 
    
    Write-Output $packRefs
    
    # Create new XML tags for the nuspec file containing the id and version.
    $packRefsXml= $packRefs | Select-Object @{L='deps'; E ={ "<dependency id=""" + $_.id + """ version=""" + $_.version + """ />"}}
    
    
    # concatenate the tags.
    $packRefsXmlConcat = ""
    $packRefsXml | ForEach-Object { 
    $packRefsXmlConcat = $packRefsXmlConcat +  $_.deps
    }
    
    # Get the nuspec file.
    $nuspec = (ls -Path "*.nuspec" | Select-Object -First 1)
    $nuspecFile = $nuspec.FullName
    
    # If nuspec file cannot be found exit script.
    "*****"
    if (!$nuspecFile) {Write-Output '***** Nuspec file not found. Exit script'
                        exit}
    else{"***** Insert dependencies into nuspec file: '" + $nuspec.NAme + "'"} 
    
    # Put the nuspec XML in a var using .NET XmlDocument
    $xmlNuspec = New-Object System.Xml.XmlDocument
    $xmlNuspec.PreserveWhitespace = $true
    $xmlNuspec.Load($nuspecFile)
    
    # Remove all dependencies elements if present.
    $tags =$xmlNuspec.package.metadata.SelectNodes("dependencies")
    
    ForEach($tag in $tags) {
    $xmlNuspec.package.metadata.RemoveChild($tag) | Out-Null # Suppress unwanted Output
    }
    
    # Namespace.
    $nm = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $xmlNuspec.NameTable
    $nm.AddNamespace('x', '')
    
    # Get the metadata tag from the xml
    $metaDataElement = $xmlNuspec.SelectNodes('/x:package/x:metadata', $nm)  
    
    # Create new dependecies element
    $newDependenciesChild = $xmlNuspec.CreateElement("dependencies") 
    
    # Add dependency elements to dependencies element
    $newDependenciesChild.set_innerXML($packRefsXmlConcat) | Out-Null # Suppress unwanted Output
    
    # Append dependencies child to metdata child
    $metaDataElement.AppendChild($newDependenciesChild) | Out-Null # Suppress unwanted Output
    
    # Write output to temporary nuspec file
    $xmlNuspec.OuterXml | Out-File -filepath temp.nuspec 
    
    # Pretty the nuspec file and overwrite original nupec file using the format-XML function.
    Format-XML -xmlfile temp.nuspec | Out-File -filepath $nuspecFile
    
    # delete temp nuspec.
    del temp.nuspec
    
    "*****"
    "***** Finished script"
    "*****"

2. Настроить событие после сборки

[Событие после сборки]

  cd $(SolutionDir)
powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File NuGetPackDependencies.ps1 $(ProjectDir)
  1. Создайте и опубликуйте свой проект, как вы это делали раньше.
person Chris Phan    schedule 09.01.2020