Yazılım geliştirme süreçlerinde versiyonlama, projelerin sürdürülebilirliği ve güncellemelerin izlenebilirliği açısından hayati bir öneme sahiptir. Bu makalede, Node.js projelerinde kullanılan versiyonlama yöntemleri ve özellikle Semantic Versioning (Anlamsal Versiyonlama) hakkında detaylı bilgiler sunacağız.
Versiyonlama, bir yazılımın farklı sürümlerini takip etmek ve bu sürümler arasında yapılan değişiklikleri izlemek için kullanılan bir sistemdir. Versiyonlama sayesinde geliştiriciler, hangi sürümde ne tür değişiklikler yapıldığını ve bu değişikliklerin projenin genel işleyişini nasıl etkilediğini kolayca takip edebilir.
Node.js projelerinde kullanılan npm install
komutu, paketlerin kurulumu sırasında en sık başvurulan yöntemlerden biridir. Bu komut, bağımlılıkların (dependencies) projemize eklenmesini sağlar.
Varsayılan Kurulum: npm install
komutu çalıştırıldığında, ilgili paketin en son kararlı sürümü kurulur. Örneğin, "moment" paketi için bu sürüm 2.29.1 olabilir.
Belirli Bir Versiyonun Kurulumu: Ancak, bazen belirli bir sürümü kurmak gerekebilir. Bu durumda, npm install package_name@version_number
komutu kullanılır. Örneğin, npm install [email protected]
komutu ile "moment" paketinin 2.24.0 sürümü kurulabilir.
Bazen en son sürümde bir hata olabilir veya yeni sürümde bazı uyumsuzluklar yaşanabilir. Bu gibi durumlarda, daha stabil veya bilinen bir sürümü kullanmak mantıklıdır.
Eski Sürüme Geçiş: Yeni sürümde bir hata bulunduğunda, eski bir sürümün kurulması gerekebilir. Bu durumda, belirtilen versiyon numarası ile kurulum yapılır ve sorun çözülene kadar bu sürüm kullanılabilir.
Güncelleme Yapmak: Sorun düzeltildiğinde veya yeni bir güncelleme yapıldığında, npm install package_name
komutu ile paketin en son sürümü tekrar kurulabilir.
Anlamsal Versiyonlama, yazılım dünyasında en yaygın olarak kullanılan versiyonlama sistemlerinden biridir. Bu sistem, versiyon numaralarının belirli kurallar çerçevesinde atanmasını ve artırılmasını sağlar. Versiyon numaraları, yazılımın geçirdiği değişiklikleri ve bu değişikliklerin doğasını anlamayı kolaylaştırır.
Semantic Versioning (SemVer) sistemi, versiyon numaralarını üç ana bileşen üzerinden tanımlar: major.minor.patch.
Major (Ana) Versiyon: Geriye dönük uyumsuz değişiklikler yapıldığında artırılır. Örneğin, 1.x.x'den 2.0.0'a.
Minor (Alt) Versiyon: Geriye dönük uyumlu yeni özellikler eklendiğinde artırılır. Örneğin, 1.1.x'den 1.2.0'a.
Patch (Yama) Versiyon: Geriye dönük uyumlu hata düzeltmeleri yapıldığında artırılır. Örneğin, 1.1.1'den 1.1.2'ye.
Versiyon numaraları, yapılan değişikliklerin doğasına göre artırılır:
Patch Artırma: Hata düzeltmeleri yapıldığında ve kod geriye dönük uyumlu kaldığında artırılır. Örneğin, 1.1.1'den 1.1.2'ye.
Minor Artırma: Yeni işlevler eklendiğinde ve kod geriye dönük uyumlu kaldığında artırılır. Bu durumda, patch versiyonu sıfırlanır. Örneğin, 1.1.1'den 1.2.0'a.
Major Artırma: Kod geriye dönük uyumsuz değişiklikler içerdiğinde artırılır. Bu durumda, minor ve patch versiyonları sıfırlanır. Örneğin, 1.1.1'den 2.0.0'a.
Semantic Versioning, her zaman 0.1.0 ile başlar. Yeni bir pakette, yama numarası ile başlanmaz. Major versiyon 0, başlangıç geliştirme aşamasını temsil eder ve kod üretim için hazır hale geldiğinde, versiyon 1.0.0'a yükseltilir. En küçük değişiklik bile versiyon numarasında bir artış ile yapılmalıdır.
Bu örnekte, yeni bir Node.js paketi oluşturduğumuzu ve bu paketin versiyon numaralarını nasıl artıracağımızı adım adım inceleyeceğiz. Paketimiz, basit bir matematik kütüphanesi olsun ve adını simple-math
olarak belirleyelim.
0.1.0 Başlangıcı
simple-math
Bu versiyonda, sadece toplama ve çıkarma fonksiyonları mevcut ve paket hala geliştirme aşamasında.
Kod:
// index.js
module.exports.add = (a, b) => a + b;
module.exports.subtract = (a, b) => a - b;
package.json:
{
"name": "simple-math",
"version": "0.1.0",
"description": "A simple math library",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Durum:
Toplama fonksiyonunda bir hata bulundu. Hata düzeltildi ve kod geriye dönük uyumlu kaldı.
Kod:
// index.js
module.exports.add = (a, b) => {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Arguments must be numbers');
}
return a + b;
};
module.exports.subtract = (a, b) => a - b;
Eski versiyon: 0.1.0
Yeni versiyon: 0.1.1
{
"name": "simple-math",
"version": "0.1.1",
"description": "A simple math library",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Durum:
Paketimize çarpma ve bölme fonksiyonları eklendi. Bu yeni işlevler, mevcut kodu değiştirmedi ve geriye dönük uyumlu.
Kod:
// index.js
module.exports.add = (a, b) => {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Arguments must be numbers');
}
return a + b;
};
module.exports.subtract = (a, b) => a - b;
module.exports.multiply = (a, b) => a * b;
module.exports.divide = (a, b) => {
if (b === 0) {
throw new Error('Division by zero');
}
return a / b;
};
Eski versiyon: 0.1.1
Yeni versiyon: 0.2.0
{
"name": "simple-math",
"version": "0.2.0",
"description": "A simple math library",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Durum:
Toplama ve çıkarma fonksiyonlarının isimlerini değiştirdik (add -> sum, subtract -> difference). Bu değişiklik, mevcut kullanıcı kodunu bozacak (geriye dönük uyumsuz). Paket artık kararlı ve üretime hazır. Fonksiyon isimleri değiştirildi ve ek özellikler eklendi.
Kod:
// index.js
module.exports.sum = (a, b) => {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Arguments must be numbers');
}
return a + b;
};
module.exports.difference = (a, b) => a - b;
module.exports.multiply = (a, b) => a * b;
module.exports.divide = (a, b) => {
if (b === 0) {
throw new Error('Division by zero');
}
return a / b;
};
Eski versiyon: 0.2.0
Yeni versiyon: 1.0.0
{
"name": "simple-math",
"version": "1.0.0",
"description": "A simple math library",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Özet
Başlangıç (0.1.0): Temel toplama ve çıkarma fonksiyonları ile paket oluşturuldu.
Patch Artırma (0.1.1): Hata düzeltildi ve kod geriye dönük uyumlu kaldı.
Minor Artırma (0.2.0): Çarpma ve bölme fonksiyonları eklendi ve kod geriye dönük uyumlu kaldı.
Major Artırma (1.0.0): Paket üretime hazır hale geldi, fonksiyon isimleri değiştirildi ve ek özellikler eklendi.
Bu süreç, semantik versiyonlamanın kurallarını ve paketinizin gelişimine göre versiyon numaralarının nasıl değiştiğini gösterir. Versiyon numaralarının bu şekilde yönetilmesi, kullanıcıların paketinizdeki değişiklikleri ve güncellemeleri daha iyi anlamalarını sağlar.
Semantic Versioning sistemi, hem geliştiricilere hem de kullanıcılara belirli sorumluluklar yükler:
Geliştiriciler: Yaptıkları değişikliklere uygun versiyon numaralarını güncellemelidir.
Kullanıcılar: Güncellemeleri takip etmeli ve projelerinde gerekli düzeltmeleri yapmalıdır.
Versiyonlama, yazılım projelerinde kritik bir rol oynar. Semantic Versioning sayesinde, yazılım paketlerinin versiyon numaraları belirli kurallar çerçevesinde atanır ve bu, yazılımın hangi değişikliklerden geçtiğini ve bu değişikliklerin etkilerini anlamayı kolaylaştırır. Geliştiricilerin ve kullanıcıların bu sisteme uygun hareket etmeleri, projelerin sürdürülebilirliği açısından büyük önem taşır.
Bu makale, versiyonlama sistemlerinin ne anlama geldiğini, nasıl doğru bir şekilde uygulanması gerektiğini ve projelere olan etkilerini anlamanıza yardımcı olmayı amaçlamaktadır.