← Назад ко всем статьям

Как привести package dependencies в проектах в порядок?

Опубликовано

Legacy projects часто страдают от беспорядка в package dependencies: unused libraries, packages, подключенные не к тем projects, или code, который полагается на transitive dependencies вместо direct ones.

Visual Studio дает простой способ удалить unused packages:

  1. Right-click на project.

  2. Выберите Remove Unused References…

  3. Примените предложенные изменения.

image

Но это действие может привести к build errors. Почему так происходит?

Первая причина: package referenced не тем project

Package может быть referenced в одном project, но использоваться в другом dependent project. Например:

  • У вас есть projects API и Core, где API зависит от Core.

  • Package prometheus-net.AspNetCore ошибочно добавлен в Core, но реально используется только в API.

  • После Remove Unused References prometheus-net.AspNetCore удаляется из Core, из-за чего в API появляются build errors.

image

Решение простое: установите нужный package напрямую в API project. В Visual Studio можно поставить cursor на unresolved reference и использовать Alt+Enter -> Install package.

Project, который использует package, должен ссылаться на этот package напрямую.

Вторая причина: code полагается на transitive dependency

Project также может использовать types из package, на который он никогда не ссылался напрямую. Вместо этого package приходит как dependency другого NuGet package.

image

Например:

  • Ваш project напрямую references Package A.

  • Package A зависит от Package B.

  • Ваш code использует types из Package B, хотя project file содержит только Package A.

  • Если Package A определяется как unused и удаляется, Package B исчезает вместе с ним, и build fails.

Исправление - добавить Package B как direct dependency project, который его использует. Это делает реальную dependency explicit и защищает build от unrelated package cleanup или upgrades.

Заключение

Структурированный подход к dependency management делает больше, чем просто убирает лишний мусор. Он проясняет ownership, снижает accidental coupling между projects и упрощает поддержку codebase.

После удаления references всегда rebuild всей solution и добавляйте direct package references везде, где compiler показывает hidden dependency.