Я разделяю многие из моих моделей приложений и интерфейсов на собственный пакет nuGet.
Вопрос в том, существует ли рекомендуемая стратегия при создании пакетов nuGet, касающихся определения зависимостей?
Иногда package A
зависит от package B
.Если я не объявляю конкретную версию package B
в nuspec моего package A
, то при последующем импорте пакета package A
nuGet в любое решение может произойти сбой во время выполнения, так как эта зависимость не была доступна.
Иногда дерево зависимостей идет еще глубже.Но если я явно добавлю зависимости в каждый файл nuspec, то позже я смогу обнаружить конфликты версий.
Вопрос: какова рекомендуемая стратегия для решения этих проблем, если все находится под моим контролем?Должен ли я указывать зависимости только тогда, когда зависимость является чем-то «неочевидным» для проекта (например, сторонней библиотеки, которая нужна проекту, импортирующему оболочку nuGet, во время выполнения, но не использует напрямую)?Должен ли я делать это всегда, а потом решать конфликты версий по-другому?Любой хороший источник информации об этом был бы очень признателен, так как я нашел несколько примеров, но не рекомендовал определенный способ сделать что-то.
ПРИЛОЖЕННЫЙ : Я создаю пакеты nuGet с помощьювключая файл nuspec, который я редактирую вручную.Например, если у меня следующая структура решения:
ToolBelt.CityContracts.sln
-ToolBelt.CityContracts.NuGet
--ToolBelt.CityContracts.NuGet.nuspec
-ToolBelt.CityContractsOne
-ToolBelt.CityContractsTwo
В ToolBelt.CityContractsOne
и ToolBelt.CityContractsTwo
у меня есть исходные файлы c #.А из проекта ToolBelt.CityContracts.NuGet
я добавляю ссылку на ToolBelt.CityContractsOne
и ToolBelt.CityContractsTwo
, чтобы убедиться, что nuspec «знает», где находятся исходные файлы.
Тогда nuspec выглядит примерно так:
<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>ToolBelt.CityContracts</id>
<version>1.0.0</version>
<authors>iberodev</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Shared Contracts</description>
<dependencies>
<!--here sub-dependencies that I want to drag across-->
</dependencies>
</metadata>
<files>
<file src="bin/*/netstandard2.0/ToolBelt.CityContractsOne.dll" target="lib/netstandard2.0" />
<file src="bin/*/netstandard2.0/ToolBelt.CityContractsOne.pdb" target="lib/netstandard2.0" />
<file src="bin/*/netstandard2.0/ToolBelt.CityContractsTwo.dll" target="lib/netstandard2.0" />
<file src="bin/*/netstandard2.0/ToolBelt.CityContractsTwo.pdb" target="lib/netstandard2.0" />
</files>
</package>
Пока все здесь довольно стандартно.
Затем я использую инструмент команды nuget для создания пакета nuget внутри папки с именем nupkgs
с помощью команды:
nuget pack ToolBelt.CityContracts.NuGet.nuspec -Version $VERSION -OutputDirectory nupkgs -Prop Configuration=Release -NoDefaultExcludes -Verbosity detailed
ОБНОВЛЕНИЕ 1: На данный момент моя стратегия заключается в следующем.
- Если
package A
предоставляет классы / интерфейсы в своем публичном API, которые являются частью package B
, то package A
не добавляет зависимость к package B
в своем nuspec.Поэтому проект, который добавляет package A
, должен также явно добавить package B
- Если
package A
не предоставляет классы / интерфейсы в своем публичном API, которые являются частью package B
, но использует их внутренне,тогда package A
должен добавить зависимость к package B
в своем nuspec, чтобы в проекте, который добавляет package A
, также автоматически устанавливался package B
, чтобы избежать риска исключительной ситуации во время выполнения.
Идея такова: если код компилируется, он должен работать без исключений времени выполнения из-за несуществующих зависимостей.
Это имеет смысл для меня, но я не могу найти надежного источника, чтобы подтвердить, что это путь.