.NET не может разрешить конфликт версий зависимостей («X определен в сборке, на которую нет ссылки»)… но только иногда

#.net

#.net

Вопрос:

  1. Project BaseApp — это библиотека .NET Standard 2.0.
  2. Его ссылки на пакеты включают LaunchDarkly .ServerSdk версии 5.13.1 и LaunchDarkly.ServerSdk.Redis версии 1.1.1.
  3. Есть ссылка на транзитивный пакет из LaunchDarkly.ServerSdk.Redis запускается быстро.ServerSdk версии 5.6.4 — это минимальная версия, которая запускается быстро.Требуется ServerSdk.Redis.

Вышеуказанное работает просто отлично. У нас никогда не было проблем, когда мы обновляли зависимость BaseApp от LaunchDarkly.ServerSdk для любой версии в диапазоне 5.6.5 … 5.13.1; он правильно разрешает переходную зависимость для использования более высокой версии.

Однако сейчас я тестирую предварительную версию: я обновил зависимость BaseApp от LaunchDarkly.ServerSdk до версии 5.14.0-альфа.1. Это вызвало ошибки сборки, подобные этой:

error CS0012: The type 'IFeatureStoreFactory' is defined in an assembly that is not referenced. You must add a reference to assembly 'LaunchDarkly.ServerSdk, Version=5.6.4.0, Culture=neutral, PublicKeyToken=f86add69004e6885'. [/app/src/BaseApp/BaseApp.csproj]

Тип IFeatureStoreFactory — это интерфейс, который определен в LaunchDarkly .ServerSdk и реализован в LaunchDarkly.ServerSdk.Redis (вот почему последний в первую очередь зависит от первого, поэтому он знает, какой интерфейс он реализует). И интерфейс определенно присутствует в более новой версии — нет изменений, несовместимых с обратной связью. Но он ведет себя так, как будто ничего, кроме типа интерфейса из версии 5.6.4, не приемлемо.

Это библиотека, а не приложение (несмотря на «Приложение» в названии), поэтому привязка перенаправлений не задействована. Опять же, до сих пор это работало как шарм, поэтому я уверен, что есть какая-то разница, которую я просто не заметил. Новая версия является предварительной версией, но я не могу понять, почему это имеет значение — 5.14.0-alpha.1 будет ниже, чем 5.14.0, но все равно выше, чем 5.6.4.

Я надеюсь, что это не дубликат — есть много вопросов «определено в сборке, на которую нет ссылок», но ни один из тех, которые я видел, не соответствует этой ситуации.

Комментарии:

1. Я подумал, что могу получить некоторые подсказки, просмотрев package.assets.json до и после моего изменения (поскольку восстановление пакета выполняется успешно — ошибка во время компиляции). Но я не вижу здесь разницы; как в более ранней версии, которая работает, так и в текущей, которая выходит из строя, она показывает новейшую версию LaunchDarkly.ServerSdk на верхнем уровне (например, это то, что она на самом деле загружает), а переходная зависимость от LaunchDarkly.ServerSdk.Redis to LaunchDarkly.ServerSdk — это именно то, что было первоначально объявлено как(5.6.4).

Ответ №1:

Ага! Ответ заключается в том, что одна из этих версий имеет строгое имя, а другая — нет, поэтому .NET не считает, что у них одинаковое имя сборки.