Загрузка данных
Выполнение практического занятия №25
Задание 1. Словарь терминов
Термин Определение
Зависимость (dependency) Внешняя библиотека, которую использует проект для работы (например, Newtonsoft.Json, Entity Framework).
NuGet Менеджер пакетов для .NET, позволяющий устанавливать, обновлять и удалять зависимости в проектах C#.
PackageReference Элемент в файле .csproj, указывающий на конкретный NuGet-пакет, который требуется проекту.
.csproj Файл проекта C#, содержащий настройки сборки, целевую платформу, список зависимостей и другие параметры.
packages.lock.json Lock-файл, фиксирующий точные версии всех прямых и транзитивных зависимостей проекта для воспроизводимой сборки.
Транзитивная зависимость Зависимость, которую ваш проект получает «по цепочке»: если проект использует библиотеку A, а A использует B, то B – транзитивная зависимость.
Vendoring (ручная поставка) Подход, при котором DLL-файлы зависимостей сохраняются прямо в репозитории проекта, а не скачиваются из NuGet при сборке.
nuget.org Официальный публичный репозиторий (хранилище) NuGet-пакетов, откуда dotnet restore скачивает зависимости.
dotnet restore Команда, скачивающая все необходимые зависимости проекта согласно описанию в .csproj и lock-файле.
Воспроизводимость сборки Способность проекта собираться одинаково на любых машинах и в любое время при условии фиксированных версий всех зависимостей.
---
Задание 2. Анализ файла .csproj
Дан фрагмент:
```xml
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Serilog" Version="3.1.1" />
</ItemGroup>
</Project>
```
1. Какая версия .NET используется в проекте?
.NET 6.0 (net6.0)
2. Какие зависимости (библиотеки) указаны в проекте?
· Newtonsoft.Json версии 13.0.3
· Serilog версии 3.1.1
3. Что означает строка <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>?
Она включает создание и использование lock-файла (packages.lock.json), который фиксирует точные версии всех (в том числе транзитивных) зависимостей.
4. Какой файл будет создан при первой сборке после включения этой настройки?
packages.lock.json (в корне проекта или рядом с .csproj).
5. Нужно ли хранить этот файл в Git? Почему?
Да, нужно. Lock-файл обеспечивает воспроизводимость сборки: все разработчики и CI/CD получат абсолютно одинаковые версии зависимостей, даже если в репозитории NuGet выйдут обновления.
---
Задание 3. Сравнение подходов
Критерий Автоматическая (NuGet) Ручная (vendoring)
Хранятся ли DLL в Git? Нет (игнорируются через .gitignore) Да (DLL сохраняются в репозитории)
Размер репозитория Маленький (только исходный код и .csproj) Огромный (бинарные файлы)
Нужен интернет для сборки? Да (для dotnet restore) Нет (все DLL уже есть локально)
Сложность обновления версий Низкая – достаточно изменить версию в .csproj Высокая – нужно вручную заменять DLL и коммитить изменения
Вывод:
· Автоматическая установка (NuGet) подходит для большинства проектов: веб-приложений, десктопных, микросервисов, библиотек.
· Ручная поставка (vendoring) оправдана только в особых случаях: проекты в закрытых сетях без доступа к интернету, авиация, оборона, критическая инфраструктура (где каждый бинарник должен проходить строгий контроль).
---
Задание 4. Анализ реальной ситуации
В .csproj указано:
<PackageReference Include="Newtonsoft.Json" Version="13.*" />
1. Почему разработчики получили разные версии одной и той же библиотеки?
Символ * означает «любая подходящая версия из диапазона 13.x.x». Через неделю могла выйти новая версия 13.0.4 (или 13.1.0), и тот разработчик, который выполнял dotnet restore после выхода обновления, получил новую версию. Тот, кто не обновлял зависимости, остался со старой (например, 13.0.3).
2. Почему использование символа * в версии – плохая практика?
Оно разрушает воспроизводимость сборки. Разные машины/разное время → разные версии библиотек, что может привести к неожиданным ошибкам, изменению поведения API, проблемам совместимости.
3. Как исправить запись в .csproj, чтобы версия стала фиксированной?
```xml
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
```
4. Что такое lock-файл и как он предотвращает подобные проблемы?
packages.lock.json фиксирует точные версии всех зависимостей (включая транзитивные). Даже если в .csproj указано 13.*, lock-файл запомнит конкретную версию, которая была восстановлена в момент создания lock-файла. При последующих сборках будет использоваться именно эта версия, а не «свежая» из диапазона.
5. Как создать lock-файл в проекте?
Добавить в .csproj строку:
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
Затем выполнить dotnet restore (или просто собрать проект). Будет создан packages.lock.json.
---
Задание 5. Инструкция для команды «Управление зависимостями в проектах C#»
1. Добавление новой библиотеки (последняя версия)
Откройте терминал в папке с .csproj и выполните:
dotnet add package НазваниеПакета
2. Добавление библиотеки с конкретной версией
dotnet add package НазваниеПакета --version 1.2.3
3. Удаление библиотеки
dotnet remove package НазваниеПакета
4. Создание lock-файла (фиксация версий)
В .csproj добавьте: <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>. Затем выполните dotnet restore – появится packages.lock.json.
5. Обновление зависимостей до новых версий
· Для одного пакета: dotnet add package НазваниеПакета --version НоваяВерсия
· Для всех пакетов можно использовать IDE (например, обновить через «Manage NuGet Packages»).
· После обновления пересоздайте lock-файл: удалите packages.lock.json и выполните dotnet restore.
6. Проверка уязвимостей в зависимостях
Выполните команду: dotnet list package --vulnerable. Она покажет пакеты с известными уязвимостями (CVE).
7. Какие файлы нужно хранить в Git
· .csproj (описание проекта)
· .sln (решение)
· packages.lock.json (если используется)
· Исходный код (.cs)
8. Какие файлы НЕ нужно хранить в Git
· bin/, obj/ (результаты компиляции)
· packages/ (старый формат, не используется в SDK‑стиле)
· .user, .suo (настройки пользователя)
· *.cache, *.tmp
9. Почему нельзя использовать звёздочку (*) или другие плавающие диапазоны (13.*, 1.x) в версиях
Они нарушают воспроизводимость сборки. Разные разработчики и CI-сервера могут получить разные версии, что приводит к трудно отлаживаемым ошибкам. Всегда указывайте точную версию (например, 13.0.3).
10. Что делать, если возник конфликт версий
· Сначала выполните dotnet list package --include-transitive, чтобы увидеть все транзитивные зависимости и их версии.
· NuGet по умолчанию выбирает старшую версию из запрашиваемых. Если это не подходит, явно добавьте ссылку на нужную версию конфликтующего пакета в .csproj (явная зависимость перекрывает транзитивную).
· Используйте lock-файл, чтобы зафиксировать согласованный набор версий.
· При необходимости обновите (или откатите) один из пакетов, чтобы их требования к общей зависимости сошлись.
11. (Дополнительно) Как посмотреть все зависимости проекта
dotnet list package (прямые)
dotnet list package --include-transitive (включая транзитивные)
12. (Дополнительно) Восстановление зависимостей в CI
Всегда выполняйте dotnet restore (или dotnet build, который автоматически вызывает restore). Lock-файл должен быть в репозитории. Для работы без интернета используйте dotnet restore --packages ./отдельная_папка и кешируйте её.