Перейти к содержанию
Educora
Продвинутый20 мин11 / 16

.NET CLI, проекты и NuGet

Создавай, собирай, запускай и тестируй проекты командой `dotnet`, объединяй их в решение (solution) и подключай пакеты NuGet.

Проверь себя
В этом уроке ты узнаешь
  • Пользоваться командами dotnet new, build, run и test
  • Читать .csproj в стиле SDK и настраивать ссылки на проекты в решении
  • Добавлять пакет NuGet и объяснять, где он хранится

В курсе C# каждая программа была одним файлом app.cs, который благодаря возможности .NET 10 запускался командой dotnet run app.cs. Настоящее приложение состоит из нескольких проектов: библиотеки с бизнес-логикой, консольного или веб-приложения, которое её использует, и тестов. Чтобы создавать их, связывать, собирать и подключать внешние пакеты, существует .NET CLI — команда dotnet. Она одинаково работает в Windows, macOS и Linux.

Основные команды .NET CLI

КомандаЧто делает
dotnet new listпоказывает доступные шаблоны
dotnet new console -n Helloсоздаёт консольный проект Hello
dotnet buildкомпилирует проект (в папки bin/ и obj/)
dotnet runсобирает и сразу запускает
dotnet testзапускает тестовые проекты
dotnet add package Xдобавляет пакет NuGet
dotnet publish -c Releaseсобирает готовую версию для сервера или пользователей
dotnet --infoпоказывает установленные SDK и среды выполнения
Terminal
dotnet new console -n Hello
cd Hello
dotnet run
Ожидаемый результат
The template "Console App" was created successfully.
...
Restore succeeded.
Hello, World!
Реальный вывод (сокращён): шаблон создан, пакеты восстановлены, программа запущена

Сердце проекта — файл **.csproj, XML в формате MSBuild. В современном файле в стиле SDK** записано только важное: TargetFramework (net10.0), ImplicitUsings (автоматически добавляет часто нужные директивы using) и Nullable (предупреждения об ошибках с null). Все файлы .cs из папки включаются автоматически. В старых проектах .NET Framework каждый файл приходилось перечислять отдельно:

.NET Framework (старый стиль)
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Program.cs" />
    <Compile Include="Student.cs" />
    <Compile Include="GradeCalculator.cs" />
    <!-- every new file had to be listed here -->
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
Стиль SDK (.NET 10)
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <ProjectReference Include="..\Gradebook.Core\Gradebook.Core.csproj" />
    <PackageReference Include="Humanizer" Version="2.14.1" />
  </ItemGroup>

</Project>
В новом файле есть ещё ссылка на проект и пакет NuGet — оба объяснены ниже

Решение: несколько проектов вместе

Решение (solution) — файл, который объединяет связанные проекты; в .NET 10 он по умолчанию создаётся в новом компактном формате .slnx (старый .sln тоже работает). Типичная структура: Gradebook.Core — библиотека, ни от чего не зависящая, Gradebook.App — консольная программа, которая её вызывает, Gradebook.Tests — тесты на xUnit. Ссылка на проект (ProjectReference) позволяет одному проекту видеть классы другого.

  1. 1
    Создай решение и проекты

    dotnet new sln -n Gradebook, затем три проекта из шаблонов classlib, console и xunit.

  2. 2
    Добавь проекты в решение

    dotnet sln add ... — теперь IDE и dotnet build видят все три проекта вместе.

  3. 3
    Настрой ссылки

    dotnet add Gradebook.App reference Gradebook.Core и та же команда для тестов. Ссылка односторонняя: Core не видит App.

  4. 4
    Собери, запусти, протестируй

    В папке решения dotnet build собирает всё, dotnet run --project Gradebook.App запускает консольное приложение, а dotnet test — тесты.

Terminal
dotnet new sln -n Gradebook
dotnet new classlib -n Gradebook.Core
dotnet new console -n Gradebook.App
dotnet new xunit -n Gradebook.Tests
dotnet sln add Gradebook.Core Gradebook.App Gradebook.Tests
dotnet add Gradebook.App reference Gradebook.Core
dotnet add Gradebook.Tests reference Gradebook.Core
Все шаги командами — в итоге появляются Gradebook.slnx и три папки проектов
C#
namespace Gradebook.Core;

public static class GradeCalculator
{
    public static double Average(IEnumerable<int> scores)
    {
        var list = scores.ToList();
        if (list.Count == 0) throw new ArgumentException("No scores");
        return list.Average();
    }

    public static string Letter(int score) => score switch
    {
        < 0 or > 100 => throw new ArgumentOutOfRangeException(nameof(score)),
        >= 90 => "A",
        >= 80 => "B",
        >= 70 => "C",
        >= 50 => "D",
        _ => "F"
    };
}
Gradebook.Core/GradeCalculator.cs — класс в библиотеке (он должен быть public, чтобы другой проект его видел)
C#
using System.Globalization;
using Gradebook.Core;

CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;

int[] scores = [92, 78, 85];
double average = GradeCalculator.Average(scores);
Console.WriteLine($"Average: {average:F1}");
Console.WriteLine($"Letter: {GradeCalculator.Letter((int)average)}");
Ожидаемый результат
Average: 85.0
Letter: B
Gradebook.App/Program.cs, запуск командой dotnet run --project Gradebook.App

Пакеты NuGet

NuGet — менеджер пакетов .NET, а nuget.org — хранилище сотен тысяч готовых библиотек (как Maven Central в Java). dotnet add package Humanizer записывает последнюю версию в .csproj как PackageReference; в .NET 10 то же самое делает и команда в новом стиле dotnet package add Humanizer. dotnet build или dotnet restore скачивает пакеты и хранит их в общем кэше в папке пользователя (~/.nuget/packages), а dotnet list package --outdated показывает устаревшие пакеты.

C#
using Humanizer;

Console.WriteLine("score".ToQuantity(1));
Console.WriteLine("score".ToQuantity(3));
Console.WriteLine("student".ToQuantity(12));
Ожидаемый результат
1 score
3 scores
12 students
Пример вывода: пакет Humanizer ставит слова во множественное число по правилам английского языка (без пакета не работает)

Чтобы поделиться готовой программой, используй dotnet publish: начиная с .NET 8 он по умолчанию собирает в конфигурации Release, которая оптимизирует код (dotnet build работает в режиме Debug, предназначенном для отладки). Если добавить -r win-x64 --self-contained, получится самостоятельная папка, которая запускается даже на компьютере без установленного .NET. Чтобы вся команда работала с одной версией SDK, в корень репозитория кладут файл global.json — его создаёт dotnet new globaljson.

Главное

  • dotnet new, build, run, test, publish — один CLI на всю жизнь проекта.
  • .csproj в стиле SDK: TargetFramework, ImplicitUsings, Nullable; файлы .cs включаются автоматически.
  • Решение (.slnx) объединяет проекты, а ProjectReference связывает их в одном направлении.
  • NuGet: dotnet add package → PackageReference; пакеты хранятся в кэше ~/.nuget/packages.
  • Когда проектов несколько, пиши dotnet run --project ...; bin/ и obj/ в Git не попадают.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Какая команда создаёт библиотеку классов?