Как упаковать проект .NET Standard в nuget, а затем автоматически разрешить его зависимости при установке?
У меня есть проект библиотеки классов.NET Standard, который упаковывается в пакет nuget. Он зависит от Newtonsoft.Json.
Я создал пакет nuget, установив флажок "Создавать пакет nuget при сборке" в свойствах проекта на вкладке пакета.
Я тоже пробовал делать nuget pack. Вот мой нуспек:
<?xml version="1.0" encoding="utf-8"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<license type="expression">MIT</license>
<projectUrl>http://project_url_here_or_delete_this_line/</projectUrl>
<iconUrl>http://icon_url_here_or_delete_this_line/</iconUrl>
<description>$description$</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2020</copyright>
<tags>Tag1 Tag2</tags>
<dependencies>
<dependency id="Newtonsoft.Json" version="12.0.3" />
</dependencies>
</metadata>
</package>
Затем я запустил это:
nuget pack -Prop Configuration=Release -IncludeReferencedProjects
Затем у меня есть проект.NET Framework 4.8, и мы добавили к нему пакет nuget.NET Standard. Проблема в том, что я получаю следующую ошибку:
FileNotFoundException: не удалось загрузить файл или сборку Newtonsoft.Json, Version=12.0.0.0, Culture= нейтральный, PublicKeyToken=30ad4fe6b2a6aeed или одну из их зависимостей. Система не может найти указанный файл.
Мне нужно было вручную добавить Newtonsoft.Json в диспетчере пакетов nuget в проект.NET Framework. Он не устанавливается, когда я устанавливаю пакет nuget.NET Standard.
Как я могу создать пакет nuget для.NET Standard, который автоматически разрешит свои зависимости?
1 ответ
nuget restore
автоматически разрешает зависимости пакетов nuget.
Я предполагаю, что вы ссылаетесь на другую версию Newtonsoft.Json в своем проекте.NET Framework 4.8.
Newtonsoft.Json- это сборка со строгим именем.
Когда дело доходит до сборок со строгими именами, среда выполнения придирчива к версиям.
https://docs.microsoft.com/en-us/dotnet/standard/library-guidance/strong-naming
Обратной стороной строгого именования является то, что.NET Framework в Windows позволяет строго загружать сборки после того, как сборка имеет строгое имя. Ссылка на сборку со строгим именем должна точно соответствовать версии, на которую ссылается сборка, заставляя разработчиков настраивать перенаправления привязки при использовании сборки.
В вашем проекте.NET Framework 4.8 требуется использовать две разные версии, что невозможно для сборок со строгими именами.
Это сработало бы, если бы Newtonsoft.Json не был строго назван.
Добавление перенаправления привязки, как указано в комментариях @Perry Qian-MSFT, должно решить вашу проблему.
Это можно сделать, выполнив следующую команду в консоли диспетчера пакетов VS
Get-Project -Name <ProjectName> | Add-BindingRedirect
Вы также можете включить автоматическое создание переадресации привязки в свойствах проекта: