İçeriğe geç
Educora
İleri20 dk11 / 16

.NET CLI, projeler ve NuGet

`dotnet` komutuyla projeler oluştur, derle, çalıştır ve test et; onları bir solution'da birleştir ve NuGet paketleri ekle.

Kendini test et
Bu derste öğreneceklerin
  • dotnet new, build, run ve test komutlarını kullanmak
  • SDK tarzı bir .csproj dosyasını okumak ve bir solution içinde proje başvuruları kurmak
  • Bir NuGet paketi eklemek ve nerede saklandığını açıklamak

C# kursunda her program, .NET 10'un bir özelliği sayesinde dotnet run app.cs ile çalışan tek bir app.cs dosyasıydı. Gerçek bir uygulama ise birkaç projeden oluşur: iş mantığını içeren bir kütüphane, onu kullanan bir konsol ya da web uygulaması ve testler. Bunları oluşturmak, birbirine bağlamak, derlemek ve dış paketler eklemek için .NET CLI, yani dotnet komutu vardır. Windows, macOS ve Linux'ta aynı şekilde çalışır.

.NET CLI'ın temel komutları

KomutNe yapar
dotnet new listmevcut şablonları listeler
dotnet new console -n HelloHello adlı bir konsol projesi oluşturur
dotnet buildprojeyi derler (bin/ ve obj/ klasörlerine)
dotnet runderler ve hemen çalıştırır
dotnet testtest projelerini çalıştırır
dotnet add package Xbir NuGet paketi ekler
dotnet publish -c Releasesunucu ya da kullanıcılar için dağıtıma hazır bir sürüm derler
dotnet --infokurulu SDK'ları ve çalışma zamanlarını gösterir
Terminal
dotnet new console -n Hello
cd Hello
dotnet run
Beklenen çıktı
The template "Console App" was created successfully.
...
Restore succeeded.
Hello, World!
Gerçek çıktı (kısaltılmış): şablon oluşturuldu, paketler geri yüklendi, program çalıştı

Bir projenin kalbi **.csproj dosyasıdır: MSBuild biçiminde bir XML. Modern SDK tarzı** dosyada yalnızca önemli olanlar yazılır: TargetFramework (net10.0), ImplicitUsings (sık gereken using yönergelerini otomatik ekler) ve Nullable (null hatalarıyla ilgili uyarılar). Klasördeki tüm .cs dosyaları otomatik olarak dahil edilir. Eski .NET Framework projelerinde ise her dosyanın ayrı ayrı yazılması gerekirdi:

.NET Framework (eski tarz)
<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 tarzı (.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>
Yeni dosyada bir proje başvurusu ve bir NuGet paketi de var; ikisi de aşağıda açıklanıyor

Solution: birden çok proje bir arada

Bir solution (çözüm), birbiriyle ilişkili projeleri gruplayan bir dosyadır; .NET 10'da varsayılan olarak yeni ve derli toplu .slnx biçiminde oluşturulur (eski .sln de çalışır). Tipik yapı: Gradebook.Core — hiçbir şeye bağlı olmayan bir kütüphane, Gradebook.App — onu çağıran bir konsol programı, Gradebook.Tests — xUnit testleri. Proje başvurusu (ProjectReference), bir projenin diğerinin sınıflarını görmesini sağlar.

  1. 1
    Solution'ı ve projeleri oluştur

    dotnet new sln -n Gradebook, ardından classlib, console ve xunit şablonlarından üç proje.

  2. 2
    Projeleri solution'a ekle

    dotnet sln add ...: artık IDE ve dotnet build üç projeyi birlikte görür.

  3. 3
    Başvuruları kur

    dotnet add Gradebook.App reference Gradebook.Core ve testler için aynı komut. Başvuru tek yönlüdür: Core, App'i görmez.

  4. 4
    Derle, çalıştır, test et

    Solution klasöründe dotnet build her şeyi derler, dotnet run --project Gradebook.App konsol uygulamasını başlatır, dotnet test ise testleri çalıştırır.

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
Tüm adımlar komut olarak; sonuçta Gradebook.slnx ve üç proje klasörü oluşur
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 — kütüphanedeki bir sınıf (başka bir projenin görebilmesi için public olmalı)
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)}");
Beklenen çıktı
Average: 85.0
Letter: B
Gradebook.App/Program.cs, dotnet run --project Gradebook.App ile çalıştırıldı

NuGet paketleri

NuGet, .NET'in paket yöneticisidir; nuget.org ise yüz binlerce hazır kütüphanenin deposudur (Java'daki Maven Central gibi). dotnet add package Humanizer en son sürümü .csproj dosyasına bir PackageReference olarak yazar; .NET 10'da aynı işi yeni tarzdaki dotnet package add Humanizer de yapar. dotnet build ya da dotnet restore paketleri indirir ve kullanıcı klasöründeki ortak önbellekte (~/.nuget/packages) saklar; dotnet list package --outdated ise eskimiş paketleri gösterir.

C#
using Humanizer;

Console.WriteLine("score".ToQuantity(1));
Console.WriteLine("score".ToQuantity(3));
Console.WriteLine("student".ToQuantity(12));
Beklenen çıktı
1 score
3 scores
12 students
Örnek çıktı: Humanizer paketi kelimeleri İngilizce kurallarına göre çoğul yapar (paket olmadan çalışmaz)

Bitmiş bir programı paylaşmak için dotnet publish kullan: .NET 8'den beri varsayılan olarak kodu iyileştiren Release yapılandırmasında derler (dotnet build ise hata ayıklama için tasarlanmış Debug kipindedir). -r win-x64 --self-contained eklersen sonuç, .NET kurulu olmayan bir bilgisayarda bile çalışan bağımsız bir klasör olur. Ekipteki herkesin aynı SDK sürümüyle çalışması için deponun köküne bir global.json dosyası konur; onu dotnet new globaljson oluşturur.

Önemli noktalar

  • dotnet new, build, run, test, publish: bir projenin tüm yaşamı için tek bir CLI.
  • SDK tarzı .csproj: TargetFramework, ImplicitUsings, Nullable; .cs dosyaları otomatik olarak dahil edilir.
  • Solution (.slnx) projeleri gruplar, ProjectReference ise onları tek yönde bağlar.
  • NuGet: dotnet add package → PackageReference; paketler ~/.nuget/packages önbelleğinde tutulur.
  • Birden çok proje varsa dotnet run --project ... yaz; bin/ ve obj/ Git'e gitmez.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
Bir sınıf kütüphanesi hangi komutla oluşturulur?