Пакет NuGet не показывает никаких зависимостей?
Я пытаюсь сделать пакет NuGet из библиотеки классов.NET 4.7.2 (VS2017), но в результате пакет NuGet неожиданно не показывает никаких зависимостей (что является ошибкой).
Моя установка такова:
- Моя библиотека классов.NET Framework 4.7.2
- Моя библиотека классов использует другой пакет NuGet (который имеет зависимости).
- Моя библиотека классов использует packageReferences в.csproj
- Моя библиотека классов содержит правильный файл.nuspec
- Я использую пакет nuget.exe для создания пакета
Команда пакета nuget.exe должна автоматически заполнять необходимые зависимости - это также имело место ранее (в другом проекте). Тем не менее, в то время я использовал package.config вместо packageReferences с моей библиотекой классов. Это что-то меняет?
Что здесь происходит?
Как я могу заставить систему снова включить необходимые зависимости в мой пакет?
Заметки:
Пакет создается с помощью сценария MSBuild на нашем сервере сборки TeamCity (без VS2017). Это сценарий сборки, который вызывает как "nuget.exe restore", так и позже "nuget.exe pack" как часть своей логики сборки.
MSBuild - версия 15.7
nuget.exe является версией 4.6.2
1 ответ
Как я могу заставить систему снова включить необходимые зависимости в мой пакет?
Это известная проблема, связанная с тем, что пакет nuget игнорирует зависимости при использовании 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
файл.
Надеюсь это поможет.
У меня такая же проблема, и я использую второй способ, упомянутый Лео Лю, с Pattrick'script и некоторыми небольшими модификациями для решения этой проблемы. Ниже приведены шаги:
- Скопируйте или загрузите скрипт PowerShell ниже, назовите егоNuGetPackDependencies.ps1 и добавьте его в свое решение (потому что я хочу повторно использовать тот же скрипт для многих проектов в этом решении)
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.Config после сборки
cd $(SolutionDir)
powershell.exe -ExecutionPolicy Bypass -NoProfile -NonInteractive -File NuGetPackDependencies.ps1 $(ProjectDir)
- Создайте и опубликуйте свой проект так же, как и раньше