Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
.NET SDK'da .NET 6'dan 11'e Değişenler: Varsayılan Release Publish, Terminal Logger, .slnx, dnx, File-Based App'ler ve .NET 11 CLI
SDK'yı yükseltirken kırılan şey genellikle kod değil, sürümü tekrar eden yerlerdir: global.json'un errorMessage'ı, container image etiketleri ve CI adımları. .NET 6'dan 11'e SDK değişikliklerini tabloya döküyor, eski bir projeyi okumak için kontrol listesi veriyor, Bookstore'u net10.0'da tutarak SDK 11'e taşıyor ve MSBuild server'ın CI'daki etkisini ölçümlerle gösteriyoruz.
MSBuild'i Anlamak: Property, Item, Target, Task, Custom Target ve Binlog ile Build Hatası Ayıklamak
MSBuild bir projeyi iki fazda işler: evaluation'da property ve item'ları okur, execution'da target'ları çalıştırır; target'larda oluşan değerler evaluation'da görünmez. Bookstore'a commit ve yerel değişiklik bilgisini assembly'ye yazan, Angular istemcisini Inputs/Outputs ile incremental olarak publish'e ekleyen target'lar yazıyor, binlog ile bir property'nin nerede değiştiğini gerçek çıktılarla buluyoruz.
dotnet tool ve dotnet new Template'leri: Local Tool Manifest, dnx, Kendi Aracını ve Template'ini Paketlemek
Bir .NET aracını repoya bağlamanın yolu local tool manifest'tir: sürüm dotnet-tools.json'da commit'lenir ve CI dotnet tool restore ile başlar. bookstore-admin'i PackAsTool ile paketleyip şirket feed'inden Reporting'e kuruyor, dnx'in source mapping'e takılmasını, SDK 11'in NETSDK1235 uyarısını, bookstore-module template paketini ve #:include kullanan bir file-based script'i gerçek çıktılarla gösteriyoruz.
Publish Seçenekleri: Framework-Dependent, Self-Contained, Single-File, Trimming, ReadyToRun ve Native AOT
Framework-dependent publish en küçük çıktıyı verir ve runtime yamalarını makineden alır; self-contained, single-file, trimming ve Native AOT dağıtımı kolaylaştırır ama yamayı yeniden publish'e bağlar. bookstore-admin'i yedi modda publish edip boyut, başlangıç süresi ve belleği ölçüyor; trimming'in R2R'sız başlangıcı neden yavaşlattığını, trim uyarılarını build'e taşımayı, AOT'nin cross-OS sınırını ve publish profile'ını gerçek çıktılarla gösteriyoruz.
Multi-Targeting ve Conditional Build: TargetFrameworks, #if, Platform API'leri ve Sürümler Arası Kütüphane
Bir library'yi birden fazla .NET sürümü için derlemek için TargetFrameworks yazılır, ama Directory.Build.props'ta tek bir TargetFramework varsa proje sessizce tek hedefle derlenir; onu projede boşaltmak gerekir. Bookstore.Contracts'ı net8.0 ve net10.0 için derleyip .NET 10'un NumericOrdering'ine .NET 8 yedeği yazıyor, testleri iki framework'te çalıştırıyor, netstandard2.0'ın bedelini, CA1416 platform kontrollerini ve .NET 8'de kalan bir tüketiciyi gerçek çıktılarla gösteriyoruz.
NuGet Restore'u Yönetmek: nuget.config, Package Source Mapping, Lock File'lar, Private Feed ve Minimum Publish Age
Birden fazla NuGet kaynağı tanımlıysa ve package source mapping yoksa, aynı adı taşıyan dış paket şirket içi paketin yerine seçilebilir; mapping her paketi yalnız izin verilen kaynaktan alır. Bookstore.Contracts'ı kimlik bilgisi ortam değişkeninden gelen bir private feed'e koyup nuget.config hiyerarşisini, lock file ve kilitli modu, .NET 11'in minimum publish age ayarını, NuGetAudit'in feed'e bağımlılığını ve CI'da restore cache'ini gerçek çıktılarla gösteriyoruz.
Çok Projeli Solution Düzeni: Directory.Build.props/targets, Central Package Management ve Ortak Ayarlar
Directory.Build.props, Sdk.props'un içinden csproj'dan önce okunduğu için OutputType ya da IsPackable gibi değerleri göremez; projeye bağlı kararlar Directory.Build.targets'a gider, ama SDK'nın daha önce türettiği değerler orada da değişmez. Bookstore'da iç içe props zincirini, artifacts output'u, Central Package Management'ı, transitive pinning'i, VersionOverride'ı ve GlobalPackageReference ile eklenen analyzer'ı gerçek build çıktılarıyla kuruyoruz.
csproj'un Anatomisi: SDK-Style Proje, Sık Kullanılan Property'ler, Item'lar ve Implicit Davranışlar
SDK-style bir csproj, Sdk attribute'unun eklediği import'lar, Directory.Build.props ve **/*.cs gibi varsayılan glob'lar sayesinde kısa kalır; property'nin gerçek değerini dotnet msbuild -getProperty, item'ları -getItem, dosyanın tamamını -preprocess gösterir. Bookstore'un proje dosyalarını okuyup template tekrarlarını temizliyor; console projede appsettings.json'un neden kopyalanmadığını, InvariantGlobalization, PrivateAssets ve InternalsVisibleTo'yu gerçek çıktılarla gösteriyoruz.
dotnet CLI Haritası: SDK ve Runtime Farkı, Komut Ailesi, global.json ve SDK Sürüm Seçimi
dotnet komutu hangi SDK'yı kullanacağını, çalıştırıldığı klasörden yukarı doğru bulduğu ilk global.json'a göre seçer; rollForward verilmezse yalnız aynı feature band içinde ilerler, uygulamanın hangi runtime'da çalışacağına ise runtimeconfig.json karar verir. Bookstore.slnx'e CLI ile proje ekliyor, rollForward politikalarını üç kurulu SDK ile karşılaştırıyor, 10.0.1xx ile 10.0.4xx band'lerinin farkını, workload'ları ve .NET 11 CLI değişikliklerini gerçek çıktılarla gösteriyoruz.
Go'da HTTP Client: http.Client, Timeout'lar, context ile İptal, Transport'u Yeniden Kullanmak ve Retry
Go'da http.DefaultClient'ın timeout'u yoktur; üretimde paylaşılan tek bir http.Client, her aşama için Transport timeout'ları, deneme başına Client.Timeout ve toplam bütçe için context kullanılır. Hangi timeout'un hangi aşamayı kapsadığı, Go 1.27'nin küçük body'leri Close'ta okuyup bağlantıyı geri kazanması, MaxIdleConnsPerHost, 4xx/5xx kontrolü, backoff, jitter ve Retry-After ile retry, idempotency ve httptest ile client testi.
Go'da io.Reader/io.Writer, os ve bufio: Dosya İşlemleri, Stream Kompozisyonu ve embed
Go'da dosya, gzip, HTTP body ve string aynı tek method'luk io.Reader'ı karşılar; fonksiyon dosya adı yerine io.Reader alırsa 1 GB'lık log sabit bellekle işlenir. bufio.Scanner'ın 64 KB satır sınırı ve sessiz durması, yazılan dosyada Close hatası, csv.Writer'ı flush etmek, LimitReader/MultiWriter/TeeReader ile kompozisyon ve e-posta şablonunu //go:embed ile binary'ye gömmek.
Go'da slices, maps, sort ve cmp Paketleri: Sıralama, Arama, Gruplama ve Iterator'larla Collection İşleri
Go'da çok alanlı sıralama slices.SortStableFunc ile cmp.Or ve cmp.Compare'ın birleşimidir; map iterasyon sırası her çalıştırmada değişir, sıralı key'ler için slices.Sorted(maps.Keys(m)) gerekir. Bookstore'a ?sort= ve kategori özeti, LINQ karşılıkları, append ve slices.Delete ile backing array tuzakları, json/v2'nin map sırası, sort ile slices ölçümü ve x/text/collate ile Türkçe sıralama.