İşlem hattınız için derleme bağımlılıkları planlama

Tamamlandı

Bu ünitede, paylaşmayı kolaylaştırmak için paketleme kodu hakkında bilgi edineceksiniz. Paketleri neden oluşturmanız gerektiğini, oluşturabileceğiniz paket türlerini, paketleri nerede barındırabileceğinizi ve barındırıldığında bunlara nasıl erişebileceğinizi keşfedeceksiniz. Ayrıca paket sürümü oluşturma hakkında da bilgi edineceksiniz.

Kod temelleri her zaman daha büyük ve daha karmaşık hale gelir. Bir ekibin, uygulamalarının kullandığı tüm kodları yazması olağan dışı bir durum. Bunun yerine ekip, diğer geliştiriciler tarafından yazılmış mevcut kodu içerir. Bir uygulamada bu paketlerden veya bağımlılıklardan birçoğu olabilir. Bu bağımlılıkları düzgün bir şekilde koruyabilmek ve güvenlik gereksinimlerini karşıladığından emin olmak için bu bağımlılıkları etkin bir şekilde yönetmek önemlidir.

Şimdi kontrol edelim ve ekibin nasıl olduğunu görelim. Andy, kodlarının başka bir takıma yardımcı olması için yapabilecekleri olası bir kod değişikliği hakkında konuşmak için takımı toplantıya çağırdı.

Ekip toplantısı

Herkese merhaba. Space Game için arka uç sistemi üzerinde çalışan ekiple sohbet ettim. Web sitesi için kullandığımız modelleri yazmayı planladıkları bir arka uç uygulamasında kullanabilirler.

Mankenler ne demek?

Andy: Bildiğiniz gibi, Space Game web sitesi bir ASP.NET Core uygulamasıdır. Verileri kullanıcı arabiriminde görüntülenen verilerden ayırmak için Model-View-Controller veya MVC desenini kullanır. Herhangi bir uygulamanın kullanabilmesi için model sınıflarımızı içeren bir paket oluşturabiliriz diye düşünüyordum.

Amita: Amaç tam olarak nedir?

Andy: Her iki ekibimiz de aynı veritabanını paylaşacak. Oyun, yüksek puanları veritabanına gönderecek, biz de bu puanları okuyup puan tablosunda görüntüleyeceğiz.

Bu mantıklı. Bu paketi nasıl oluşturacağız?

Bu yüzden seninle sohbet etmek istedim. Birkaç seçeneğimiz bulunuyor ve fikir arıyorum.

Yardım etmek isterdim ama önce bazı sorularım var. Bu konuda yeniyim ve bunların nasıl çalıştığını anlamak istiyorum.

Paket nedir?

Paket, diğer geliştiricilerin, kendileri yazmamış olsalar da kendi projelerinde kullanabileceği yeniden kullanılabilir kod içerir.

Derlenmiş diller için paket genellikle .NET'teki .dll dosyaları veya Java'daki .class dosyaları gibi derlenmiş ikili kodu içerir. JavaScript veya Python gibi derlenmeden ziyade yorumlanan diller için paket, kaynak kodunu içerebilir.

Her iki durumda da, paketler genellikle ZIP veya benzer bir biçimde sıkıştırılır. Paket sistemleri genellikle paketin kullanımını net hale getirmek için .nupkg veya .jar gibi benzersiz bir dosya uzantısı tanımlar. Sıkıştırma, indirme süresini azaltmaya ve ayrıca yönetimi basitleştirmek için tek bir dosya üretmeye yardımcı olabilir.

Paketler genellikle meta veriler veya paket hakkında bilgi sağlayan bir veya daha fazla dosya içerir. Bu meta veriler paketin ne yaptığını açıklayıp lisans koşullarını, yazarının iletişim bilgilerini ve paketin sürümünü belirtebilir.

Neden paket oluşturmalıyım?

Kodu çoğaltmak yerine paket oluşturmanın avantajları bulunur.

Kodu çoğaltmak yerine paket oluşturmanın nedenlerinden biri de kaymayı engellemektir. Kod çoğaltıldığında, her kopya belirli bir uygulamanın gereksinimlerini karşılamak için hızla ayrışabilir. Değişiklikleri bir kopyadan diğerlerine geçirmek zorlaşır. Diğer bir deyişle, kodu herkes için fayda sağlayacak şekillerde geliştirme özelliğini kaybedersiniz.

Paketler, ilişkili işlevleri yeniden kullanılabilir tek bir bileşende gruplandırır. Programlama diline bağlı olarak paket, uygulamalara belirli tür ve işlevlere erişim sağlarken uygulama ayrıntılarına erişimi kısıtlayabilir.

Paket oluşturmanın nedenlerinden biri de o paketin işlevselliğini oluşturup test etmek için tutarlı bir yol sağlamaktır. Kod çoğaltıldığında, her uygulama bu kodu farklı şekillerde derleyip test edebilir. Bir test kümesi, başka bir kümenin yararlı olabileceği denetimleri içerebilir.

Bir dezavantaj, bir paketle test edip bakımını yapmak için başka bir kod tabanınız olmasıdır. Özellik eklerken de dikkatli olmanız gerekir. Genel olarak konuşursak, bir paket birçok uygulama türüne fayda sağlayan özellikler içermelidir. Örneğin Json.NET, JSON dosyalarıyla çalışmanıza olanak tanıyan popüler bir .NET NuGet paketidir. Json.NET açık kaynak olduğu için topluluk tarafından geliştirmeler önerilip sorunlar bildirilebilir.

Aynı koddan birden çok uygulama yararlanabildiğinde, avantajlar dezavantajlardan çok daha fazladır. Yönetmeniz gereken sadece bir tane kod temeliniz, bir test kümeniz ve bir derleme işleminiz olur.

Bağımlılıkları nasıl tanımlayabilirim?

Amacınız kodunuzu ayrı bileşenler halinde yeniden düzenlemekse, uygulamanızın kaldırılabilen, yeniden kullanılabilir hale getirilecek şekilde paketlenebilen, merkezi bir konumda depolanabilen ve sürümlendirilebilen parçalarını tanımlamanız gerekir. Hatta kendi kodunuzu açık kaynak veya lisansladığınız üçüncü taraf bileşenlerle değiştirmek isteyebilirsiniz.

Kod tabanınızdaki olası bağımlılıkları tanımlamanın birçok yolu vardır. Bunlar, kodunuzu yeniden kullanım düzenleri için taramayı ve çözümünüzün mimarisini çözümlemeyi içerir. Bağımlılıkları tanımlamanın bazı yolları şunlardır:

  • Yinelenen kod.

    Bazı kod parçaları birkaç yerde görünüyorsa, kodu yeniden kullanabileceğiniz iyi bir göstergedir. Bu yinelenen kod parçalarını merkezileştirin ve uygun şekilde yeniden paketleyin.

  • Yüksek uyum ve düşük kavrama.

    İkinci bir yaklaşım da birbirine karşı yüksek bir uyum ve kodun diğer bölümleriyle düşük birleşime sahip kod öğelerini aramaktır. Özünde, yüksek uyum, bir kod tabanının birbiriyle ilişkili parçalarını tek bir yerde tutmak anlamına gelir. Aynı zamanda düşük kavrama, kod tabanının ilgisiz bölümlerini mümkün olduğunca ayırmaktır.

  • Bireysel yaşam döngüsü.

    Kodun tek tek dağıtabileceğiniz ve yayımlayabileceğiniz benzer bir yaşam döngüsüne sahip bölümlerini arayın. Bu kod ayrı bir ekip tarafından korunabiliyorsa, çözümün dışında bir bileşen olarak paketleyebileceğiniz iyi bir göstergedir.

  • Kararlı parçalar.

    Kod tabanınızın bazı bölümleri kararlı olabilir ve seyrek değişebilir. Düşük değişiklik sıklığına sahip kodu bulmak için kod deponuzu denetleyin.

  • Bağımsız kod ve bileşenler.

    Kod ve bileşenler bağımsız olduğunda ve sistemin diğer bölümleriyle ilgisiz olduğunda, bunları ayrı bağımlılıklar halinde yalıtabilirsiniz.

Kod tabanınızı taramanıza ve incelemenize yardımcı olması için çeşitli araçları kullanabilirsiniz. Bunlar, yinelenen kodu tarayan ve çözüm bağımlılığı grafları çizen araçlardan, bağlama ve birleşim ölçümlerini hesaplayan araçlara kadar uzanır.

Ne türden paketler bulunur?

Her programlama dili veya çerçeve, paket oluşturmak için kendi yöntemini sunar. Popüler paket sistemleri, işlemin nasıl çalıştığı hakkında belgeler sağlar.

Bu popüler paket sistemleri hakkında zaten bilgi sahibi olabilirsiniz:

  • NuGet: .NET kitaplıklarını paketler
  • NPM: JavaScript kitaplıklarını paketler
  • Maven: Java kitaplıklarını paketler
  • Docker: yazılımı kapsayıcılar olarak adlandırılan yalıtılmış birimlerde paketler

Paketler nerede barındırılır?

Paketleri kendi ağınızda barındırabilir veya bir barındırma hizmeti kullanabilirsiniz. Barındırma hizmetine genellikle paket deposu veya paket kayıt defteri adı verilir. Bu hizmetlerin çoğu açık kaynak projeler için ücretsiz barındırma sağlar.

İşte az önce açıkladığımız paket türleri için bazı popüler barındırma hizmetleri:

  • NuGet Galerisi

    NuGet paketleri .NET kod yapıtları için kullanılır. Bu yapıtlar .NET derlemelerini ve ilgili dosyaları, araçları ve bazen meta verileri içerir. NuGet paketlerin oluşturulma, depolanma ve kullanma şeklini tanımlar. NuGet paketi temelde ZIP biçiminde dosyaları olan sıkıştırılmış bir klasör yapısıdır ve .nupkg uzantısına sahiptir.

  • NPM

    JavaScript için bir NPM paketi kullanılır. NPM paketi, JavaScript dosyalarını içeren bir dosya veya klasör ve paketin meta verilerini açıklayan bir package.json dosyasıdır. node.js için paket genellikle paket tüketildikten sonra yüklenebilen bir veya daha fazla modül içerir.

  • Maven Merkezi Deposu

    Maven, Java tabanlı projeler için kullanılır. Her paketin, projenin meta verilerini açıklayan bir Proje Nesne Modeli dosyası vardır ve bir paket tanımlayıp onunla çalışmaya yönelik temel birimdir.

  • Docker Hub

    Docker paketleri görüntü olarak adlandırılır ve tam, bağımsız dağıtımlar içerir. En yaygın olarak Docker görüntüsü, diğer görüntülere bağımlılık olmadan tek başına barındırılıp yürütülebilen bir yazılım bileşenini temsil eder. Docker görüntüleri katmanlıdır ve diğer görüntülere bağımlı olabilir.

Paket akışı paket deposu sunucunuza başvurur. Bu sunucu İnternet'te veya ağınızdaki güvenlik duvarınızın arkasında olabilir. Örneğin, Azure Artifacts ve MyGet gibi barındırma ürünlerini kullanarak kendi NuGet akışlarınızı barındırabilirsiniz. Paketleri bir dosya paylaşımında da barındırabilirsiniz.

Paketleri güvenlik duvarınızın arkasında barındırdığınızda, akışları kendi paketlerinize ekleyebilirsiniz. Sistemleriniz İnternet'e bağlanamayınca ağınızda güvendiğiniz paketleri de önbelleğe alabilirsiniz.

Hangi öğeler iyi bir bağımlılık yönetimi stratejisi oluşturur?

İyi bir bağımlılık yönetimi stratejisi şu üç öğeye bağlıdır:

  • Standartlaştırma.

    Bağımlılıkları bildirme ve çözme yönteminizi standartlaştırmak, otomatik sürüm sürecinizin yinelenebilir ve tahmin edilebilir kalmasına yardımcı olur.

  • Paketleme biçimleri ve kaynakları.

    Her bağımlılık geçerli biçim kullanılarak paketlenmeli ve merkezi bir konumda depolanmalıdır.

  • Sürüm oluşturma.

    Bağımlılıklarda zaman içinde gerçekleşen değişiklikleri kendi kodunuzla yaptığınız gibi izlemeniz gerekir. Bu, bağımlılıkların sürümüne sahip olması gerektiği anlamına gelir.

Paketlere kimler erişebilir?

Çoğu paket akışı paketlere sınırsız erişim sunar. Örneğin, oturum açmanıza veya kimlik doğrulaması yapmanıza gerek kalmadan Json.NET nuget.org'dan indirebilirsiniz.

Diğer paket akışları kimlik doğrulaması gerektirir. Birkaç yöntemle akışlar için erişim kimlik doğrulaması yapabilirsiniz. Örneğin, bazı türden akışlar bir kullanıcı adı ve parola gerektirir. Diğer akışlar, genellikle kim olduğunuzu ve hangi kaynaklara erişiminiz olduğunu tanımlayan uzun bir karakter dizisi olan bir erişim belirteci gerektirir. Erişim belirteçlerini belirli bir süre sonra süresi dolacak şekilde ayarlayabilirsiniz.

Paketler için sürüm oluşturma nasıl yapılır?

Sürüm oluşturma şeması kullandığınız paketleme sistemine bağlıdır.

Örneğin, NuGet paketleri Anlamsal Sürüm Oluşturma kullanır.

Anlamsal Sürüm Oluşturma popüler bir sürüm oluşturma şemasıdır. Biçim şu şekildedir:

Anasürüm.İkincilsürüm.Yama[-sonek]

Bu parametrelerin her biri şu anlama gelir:

  • Yeni bir Ana sürüm ile yeni değişiklikler sunulur. Uygulamaların genellikle yeni bir ana sürümle çalışmak için paketi nasıl kullandıklarını güncelleştirmeleri gerekir.
  • Yeni bir İkincil sürüm yeni özellikler sunar, ancak önceki sürümlerle geriye dönük olarak uyumludur.
  • Yeni bir Yama geriye dönük uyumlu hata düzeltmeleri sunar ancak yeni özellikler sunmaz.
  • -Sonek kısmı isteğe bağlıdır ve paketi yayın öncesi sürüm olarak tanımlar. Örneğin, 1.0.0-beta1 paketi 1.0.0 sürümü için ilk beta ön sürümü olarak tanımlayabilir.

Pakete başvururken bunu sürüm numarasıyla yapın.

PowerShell ve belirli bir sürüm numarası kullanarak paket yükleme örneği aşağıda verilmiştir:

Install-Package Newtonsoft.Json -Version 13.0.1

Paket değiştiğinde ne olur?

Uygulamanızdan bir pakete başvurduğunuz zaman, genellikle kullanmak istediğiniz paketin sürümünü sabitler veya belirtirsiniz.

Birçok çerçeve, yüklenecek paket sürümlerinin izin verilebilen aralıklarını belirtmenize olanak sağlar. Bazıları, kayan sürüm olarak adlandırdığımız joker karakterler belirtmenize de olanak sağlar.

Örneğin, NuGet’te “1.0” sürümü, ilk sürümün 1.0’a eşit veya bundan daha büyük olduğunu belirtir. “[1.0]” daha yeni bir sürümün değil, sürüm 1.0’ın yükleneceğini belirtir.

Aşağıda birkaç örnek daha verilmiştir:

Bu gösterim: Şunu seçer:
(1.0,) 1'den büyük olan ilk sürüm.
[1.0,2.0] 1.0'dan büyük veya buna eşit ve 2.0'dan küçük veya 2.0'a eşit ilk sürüm
(1.0,2.0) 1.0’dan daha büyük olan ilk sürüm ve 2.0’dan daha küçük olan ilk sürüm
[1.0,2.0) 1.0'dan büyük veya buna eşit ve 2.0'dan küçük ilk sürüm

Her bakımcı yeni bir paket sürümü yayımladıkça, nelerin değiştiğini değerlendirebilir ve uygulamanızı buna karşı test edebilirsiniz. Hazır olduğunuzda, uygulamanızın sürüm numarasını yapılandırmanızda güncelleştirip değişiklikleri derleme işlem hattınıza gönderebilirsiniz.

Burada, C# uygulamanızın proje (.csproj) dosyasına Newtonsoft.Json paketini nasıl dahil edebileceğinize ilişkin bir örnek verilmiştir. Bu örnek, bu paketin 13.0.1 sürümünü belirtir:

<ItemGroup>
  <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

Bilgilerinizi kontrol edin

1.

Paket nedir?

2.

Ortak kullanım için paylaşmak istediğiniz bir paket derlediğinizi varsayalım. Bunu yapmanın en kolay yolu nedir?