Загрузка данных


Выполнение практического занятия №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 ./отдельная_папка и кешируйте её.