npm — Gelişmiş Kullanım
Paket yönetimi, modern yazılım geliştirmenin vazgeçilmez bir parçasıdır. İlk yazımızda npm’in temel kavramlarını ele aldık ve şimdi bu temelleri daha da ileri taşıyarak gelişmiş paket yönetimi stratejilerine bakacağız.

Yazı dizisinin ikinci bölümüne hoş geldiniz. Serinin ilk yazısını okumadıysanız veya temel kavramları hızlıca gözden geçirmek isterseniz linkten ulaşabilirsiniz.
Gelişmiş Paket Yönetimi
Paket yönetimi, modern yazılım geliştirmenin vazgeçilmez bir parçasıdır. İlk yazımızda npm'in temel kavramlarını ele aldık ve şimdi bu temelleri daha da ileri taşıyarak gelişmiş paket yönetimi stratejilerine bakacağız.
1. Paket Versiyonlama Stratejileri
Paket versiyonlama stratejileri, yazılım projelerinizde kullanılan paketlerin versiyonlarını yönetmenin önemli bir yoludur. Projenizin gereksinimlerine göre doğru versiyonları seçmek, uyumluluk sorunlarını önlemek ve güvenliği sağlamak için kritik bir adımdır.
2. Beta ve Alfa Sürümlerini Kullanma
Beta ve alfa sürümleri, yazılım paketlerinin geliştirme sürecinin farklı aşamalarında kullanılan ön sürümlerdir. Beta sürümleri, genellikle test edilmek üzere yayınlanırken, alfa sürümleri daha erken aşamalarda geliştirici topluluğunun geri bildirimini almak için kullanılır. Bir paketin beta sürümünü nasıl kurup kullanacağınızı gösterelim:
npm install package-name@beta
Bu komut, package-name paketinin en son beta sürümünü yükler.
3. Bağımlılıklar (Dependencies)
Projelerinizi geliştirirken başka paketleri kullanmanız gerekebilir. Bu paketlere "bağımlılıklar" denir. Bağımlılıklar, projenizin diğer paketlerle iletişim kurabilmesi ve işlevselliği sağlayabilmesi için gereklidir. Örneğin, bir web uygulaması geliştiriyorsanız, CSS çerçeveleri veya veritabanı işlevselliği sağlamak için belirli paketlere bağımlı olabilirsiniz. Bu bağımlılıklar package.json
dosyasında belirtilir ve npm tarafından otomatik olarak yönetilir.
{ "dependencies": { "express": "^4.17.1", "express-async-handler": "^1.1.4" } }
Bu örnekte, express
ve express-async-handler
paketleri bağımlılıklar olarak belirtilmiştir.
4. Forklama ve Bağlı Projeler
Projelerinizin özelleştirilmiş bir sürümünü başka bir projede kullanmak isteyebilirsiniz. Bu durumda, projenizi forklayarak özelleştirmelerinizi yapabilirsiniz. Daha sonra, ana projeye geri dönüş yapabilir veya bağlı projeleri bu özelleştirilmiş sürümle senkronize edebilirsiniz.
5. Çalışma Ortamınızı Optimize Etme
Verimli bir geliştirme süreci için çalışma ortamınızı optimize etmek önemlidir. Örneğin, projenizin ihtiyaç duyduğu paketleri yerel olarak nasıl saklayabileceğinizi öğrenerek geliştirme hızınızı artırabilirsiniz. Ayrıca, npm scriptleri kullanarak projenizin gereksinimlerini otomatik olarak nasıl güncelleyebileceğinizi öğrenebilirsiniz.
{ "scripts": { "update": "npm update" } }
Bu örnekte, npm run update
komutuyla projenizin bağımlılıklarını güncelleyebilirsiniz.

npm Scriptleri ve Otomasyon
Bu başlık altında, projenizin geliştirme sürecini otomatikleştirmek ve tekrarlayan görevleri kolayca yönetmek için npm scriptlerinin nasıl kullanılacağını anlatmaya çalıştım.
1. package.json Dosyasında Script Tanımlama
Projelerinizi geliştirirken sık sık kullanmanız gereken işlemleri, npm scriptleri ile otomatikleştirebilirsiniz. package.json
projenin yerel bağlamında yüklü olan komut satırı araçlarını çalıştırmak için tanımlanabilen bir scripts
özelliğini de destekler.
Örnek bir scripts
:
{ "scripts": { "build": "tsc", "format": "prettier --write **/*.ts", "format-check": "prettier --check **/*.ts", "lint": "eslint src/**/*.ts", "pack": "ncc build", "test": "jest", "all": "npm run build && npm run format && npm run lint && npm run pack && npm test" } }
eslint
, prettier
, ncc
, ve jest
'in global olarak değil, projenizin yerelinde node_modules/.bin/
dizini altına yüklenmesi gerekmektedir.
Bu node_modules
proje kapsamındaki komutları, npx …
önekini kullanarak yani npx prettier --write **/*.ts
global olarak yüklenmiş bir program gibi çalıştırmamıza olanak tanır.
2. package-lock.json nedir?
package-lock.json
, bir Node.js projesinde kullanılan ve projenin bağımlılıklarını ve bu bağımlılıkların belirli versiyonlarını içeren bir dosyadır. Bu dosya, proje bağımlılıklarının belirli versiyonlarının ve bağımlılık ağacının sabitlenmesini sağlayarak, projenin farklı ortamlarda (farklı geliştirici makineleri, sunucular vb.) tutarlı bir şekilde çalışmasına yardımcı olur.
package-lock.json
dosyası, projede kullanılan her bir paketin adını, versiyonunu ve bağımlı olduğu diğer paketleri içerir. Bu dosya aynı zamanda bağımlılıkların versiyonlarını "sabitleyen" bir yapıya sahiptir, böylece farklı yüklemelerde veya paket güncellemelerinde istenmeyen versiyon değişiklikleri oluşmaz.
Bu dosya ayrıca bağımlılıkların indirilip yüklendiği klasörü de belirtir. Bu sayede bir proje klonlandığında veya taşındığında, package-lock.json
dosyası kullanılarak projenin tam olarak aynı bağımlılıklara sahip olması sağlanır.
Sonuç olarak, package-lock.json
dosyası projenin tekrarlanabilirliğini ve güvenilirliğini artırmak amacıyla kullanılan önemli bir dosyadır ve genellikle projenin kök dizininde bulunur.
3. Pre- ve Post- Hooks Kullanımı
npm scriptlerinde pre-
ve post-
önekleri ile tanımladığınız işlemler, belirli bir script çalıştırılmadan önce veya sonra otomatik olarak gerçekleşir.
{ "scripts": { "prestart": "echo 'Hazırlık işlemleri yapılıyor...'", "poststart": "echo 'Proje başlatıldı.'" } }
Bu örnekte, npm start
komutu öncesinde ve sonrasında belirtilen işlemler gerçekleşir.
4. Paralel ve Sıralı Görevler Oluşturma
Birden fazla işlemi aynı anda (paralel) veya sırayla (sıralı) çalıştırmak için npm scriptlerini kullanabilirsiniz.
{ "scripts": { "build": "npm run lint && npm run compile", "lint": "eslint src", "compile": "babel src -d dist" } }
Bu örnekte, npm run build
komutu ile lint
ve compile
işlemleri sırayla çalıştırılır.
5. Scriptlerde Değişken Kullanımı
npm scriptlerinde değişkenleri kullanarak daha esnek ve dinamik işlemler oluşturabilirsiniz.
{ "scripts": { "start": "node server.js", "start:dev": "PORT=3000 npm start" } }
Bu örnekte, npm run start:dev
komutu ile farklı bir port üzerinden projeyi başlatabilirsiniz.
6. Örnek Otomasyon Senaryoları
Projenizin özel ihtiyaçlarına göre karmaşık otomasyon senaryoları oluşturabilirsiniz.
{ "scripts": { "deploy": "npm run build && scp -r dist/ user@server:path" } }
Bu örnekte, npm run deploy
komutu ile projeyi derleyip uzak sunucuya dağıtabilirsiniz.

Registry ve Yayınlama
Bu başlık altında, projelerinizi npm Registry'de nasıl yayınlayabileceğinizi ve yönetebileceğinizi inceleyeceğiz. Aynı zamanda, projelerinizi paketler haline getirirken dikkat etmeniz gereken önemli noktalara da değineceğiz.
1. Paket Oluşturma ve Yayınlama
İlk adım, projenizin ana dizininde package.json
dosyasını oluşturmak veya güncellemektir. Bu dosya, projenizin temel bilgilerini içerir.
{ "name": "my-awesome-package", "version": "1.0.0", "main": "index.js", "license": "MIT", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" } }
2. Gereksinimleri Ekleyin ve Kodu Düzenleyin
Projeyi pakete dönüştürmek için gereken dosyaları/kodları (örneğin, "index.js" gibi) ekleyin ve gerektiğinde kaynak kodunuzu düzenleyin.
3. npm'e Oturum Açın
Yeni bir paket oluşturmadan önce npm'e oturum açmanız gerekmekte. Terminalde aşağıdaki komutu kullanarak oturum açabilirsiniz.
npm login
Kullanıcı adı, parola ve e-posta adresi bilgilerini girin.
4. Projeyi npm'de Yayınlama
Artık projenizi npm Registry'ye yayınlamaya hazırsınız. Terminalde aşağıdaki komutu kullanarak projeyi yayınlayabilirsiniz.
npm publish
5. Projenin Yayınlandığını Kontrol Etme
Projeyi başarıyla yayınladıktan sonra, npm Registry'de projenizin sayfasını ziyaret ederek yayınlandığını kontrol edebilirsiniz.
Ardından paketinizi test etmek için npm install
'ı paket dizininizin yolu ile çalıştırın.
npm install my-awesome-package
--
Scoped Paketler ve Yayınlama
Scoped paketler, projenizin veya organizasyonunuzun adıyla başlayan paketlerdir. Bu paketleri oluşturmak ve yayınlamak için aşağıdaki adımları izleyebilirsiniz.
1. "package.json" Dosyasını Güncelleme
Scoped paketler oluştururken, name
alanına kapsamlı adı eklemeniz gerekmektedir. Aynı zamanda, paketin main
dosyasını ve diğer gereksinimlerini belirtmeyi unutmayın.
{ "name": "@myorg/my-awesome-package", "version": "1.0.0", "main": "index.js", "license": "MIT", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" } }
2. Projeyi npm'de Yayınlama
Scoped paketleri yayınlamak için npm publish
komutunu kullanabilirsiniz. Ancak, bu paketi genel olarak yayınlamak istiyorsanız --access public
seçeneğini eklemeniz gerekmektedir.
npm publish --access public
3. Projeyi Yayınlandığını Kontrol Etme
Scoped paketi başarıyla yayınladıktan sonra, npm Registry'de paketinizin sayfasını ziyaret ederek yayınlandığını kontrol edebilirsiniz. Örneğin; https://www.npmjs.com/package/@myorg/my-awesome-package

Semantik Sürümleme ve Değişiklik Günlükleri
Semantik Sürümleme (Semantic Versioning), projenizin yeni sürümlerini numaralandırma ve bu sürümlerin ne tür değişiklikler içerdiğini belirtme yöntemidir. Bu sürüm numaraları şunları ifade eder:
- Ana Versiyon Numarası (Major Version): Büyük değişiklikler olduğunda artırılır. Geriye dönük uyumsuz değişiklikler içerdiğinde kullanılır.
- Minör Versiyon Numarası (Minor Version): Yeni özellikler eklediğinizde veya mevcut özellikleri geliştirdiğinizde artırılır. Geriye dönük uyumlu değişiklikler içerir.
- Düzeltme Numarası (Patch Version): Geriye dönük uyumlu düzeltmeler ve hata düzeltmeleri yapıldığında artırılır.
{ "dependencies": { "foo": "1.0.0 - 2.9999.9999", "bar": ">=1.0.2 <2.1.2", "baz": ">1.0.2 <=2.3.4", "boo": "2.0.1", "qux": "<1.0.0 || >=2.3.1 <2.4.5 || >=2.5.2 <3.0.0", "asd": "http://asdf.com/asdf.tar.gz", "til": "~1.2", "elf": "~1.2.3", "two": "2.x", "thr": "3.3.x", "lat": "latest", "dyl": "file:../dyl" } }
Değişiklik Günlükleri (Change Logs), her sürümde yapılan değişiklikleri ve eklemeleri belgelemek için kullanılır. Bu, diğer geliştiricilerin projenizi nasıl ve neden kullanmaları gerektiğini anlamalarını sağlar.
Sürüm numaralarını ve değişiklikleri "CHANGELOG.md" dosyasında belgelemek iyi bir uygulamadır. Bu, projenizin sürdürülebilirliğini ve işbirliğini artırır.
Paket İndirme İstatistikleri ve Analizleri
Paket istatistiklerini görüntülemek için terminalde aşağıdaki komutu kullanabilirsiniz.
npm stats package-name
Paket analiz araçları, daha ayrıntılı bilgi almanıza yardımcı olabilir. Örneğin, npm trends
veya npm package analyzer
gibi araçları deneyebilirsiniz.
npm ve Güvenlik
Bu bölümde, projelerinizde paketlerin güvenliğini nasıl sağlayacağınızı ve güvenlik tehditlerini nasıl ele alabileceğinizi öğreneceksiniz.
1. Bağımlılık Kontrolleri ve Güncelleme Stratejileri
Projenizde kullandığınız paketlerin güvenliğini sağlamak için düzenli olarak bağımlılık kontrolleri yapmalısınız. Bu adımı nasıl atacağınızı ve güncelleme stratejilerinizi nasıl belirleyeceğinizi inceleyelim:
- Bağımlılıkları İncelenme ve Güncelleme: Projedeki paketleri düzenli olarak kontrol edin ve yeni sürümlerini inceleyin. Güvenlik güncellemeleri varsa, paketleri güncelleyerek riskleri azaltın.
- Sürüm Kısıtlamaları ve Uyum: Bağımlılıklarınızın sürüm kısıtlamalarını belirleyerek, uyumlu ve güvenilir paketleri seçin. Örneğin, caret(^) veya tilde(~) gibi sembollerle sürüm aralıkları belirtebilirsiniz.
2. Zafiyet Analiz Araçları ve Kullanımı
Paketlerdeki güvenlik zafiyetlerini tespit etmek için çeşitli analiz araçları bulunmaktadır. Bu araçları kullanarak projenizdeki potansiyel riskleri değerlendirebilirsiniz:
- npm Audit: npm tarafından sağlanan bu araç, projedeki bağımlılıkları tarar ve güvenlik zafiyetlerini raporlar. Terminalde
npm audit
komutunu kullanarak tarama yapabilirsiniz. - Snyk, WhiteSource, Sonatype Nexus: Üçüncü taraf araçlar, projenizdeki zafiyetleri analiz edebilir ve raporlayabilir. Projelerinizi bu araçlarla taramayı düşünebilirsiniz.
3. Güvenli npm Scriptleri Oluşturma
npm scriptleri, projenizi otomatikleştirmek için kullanılırken güvenliği de sağlamak önemlidir. İşte güvenli npm scriptleri oluştururken dikkat etmeniz gereken noktalar:
- Komut Kısıtlamaları: Scriptlerde kullanılan komutları kısıtlayarak, kötü niyetli kodların çalışmasını engelleyebilirsiniz.
- Çevresel Değişkenlerin Kontrolü: Scriptlerde kullanılan çevresel değişkenlerin güvenli olduğundan emin olun. Kullanıcı tarafından kontrol edilen değişkenlerin zararlı kullanımını önleyin.
4. Dependency Tree Kontrolü
Projenizin bağımlılık ağacını (dependency tree) incelemek, projenizdeki paketlerin nasıl birbirine bağımlı olduğunu anlamak için önemlidir:
- dependency-tree, npm ls Komutları: Bu komutlarla projenizin bağımlılık ağacını inceleyebilirsiniz. Bu şekilde paketler arasındaki ilişkileri anlayabilirsiniz.
- Fazla Derinlikten Kaçınma: Bağımlılık ağacınızı fazla derinleştirmemeye çalışın. Gereksiz ve karmaşık bağımlılıklar projenizin güvenliğini risk altına sokabilir.

Diğer Paket Yöneticileri
Bu bölümde, Yarn ve pnpm gibi popüler paket yöneticilerini npm ile karşılaştırarak avantajlarını ve dezavantajlarını inceleyeceğiz. Ayrıca, bu yöneticilerden hangisini seçmeniz gerektiğine dair öneriler sunacağız.
Yarn
Yarn, Facebook tarafından geliştirilen bir paket yöneticisidir. npm ile uyumlu bir şekilde çalışırken hızlı indirme ve güvenli yükleme mekanizması gibi özellikler sunar.
pnpm
pnpm, birden çok proje arasında bağımlılıkları paylaşma konusunda öne çıkan bir alternatif paket yöneticisidir. Disk alanı ve indirme süresi tasarrufu sağlayan tek bir depo kullanımıyla dikkat çeker.
npm, Yarn ve pnpm Karşılaştırması
Bu üç paket yöneticisi arasında seçim yaparken, farklı özellikleri ve avantajları göz önünde bulundurmalısınız.
npm:
- npm, Node.js ve JavaScript topluluğunda en yaygın kullanılan paket yöneticisidir.
- Büyük bir paket deposuna ve geniş bir ekosisteme sahiptir.
- Yenilikleri hızlı bir şekilde benimser.
- Topluluk desteği ve güncellemeler konusunda güçlüdür.
Yarn:
- Hızlı indirme ve yükleme performansı sunar.
- Yarn Workspaces özelliği ile birden fazla projeyi tek bir depo içinde yönetmeye imkan tanır.
- Yarn Berry sürümü ile Plug'n'Play özelliği, gereksinim dosyasına ihtiyaç duymadan paketleri kullanmanıza olanak sağlar.
pnpm:
- Tek bir depo kullanımı sayesinde disk alanı tasarrufu yapar.
- Hızlı indirme ve yükleme performansı sunar.
- Çoğaltma yerine sembolik bağlantılar kullanarak bağımlılıkları yönetir.
Hangisini Seçmeli, Neden?
Paket yöneticisi seçimi, projenizin ihtiyaçlarına ve gereksinimlerine göre yapılmalıdır. İşte npm, Yarn ve pnpm arasında seçim yaparken dikkate alabileceğiniz faktörler:
- Proje Karmaşıklığı: Projeniz ne kadar karmaşıksa, bağımlılıkları yönetmek ve projenin bütünlüğünü sağlamak o kadar önemlidir. Yarn ve pnpm, Workspaces veya tek bir depo kullanımı gibi özellikler sunarak projelerinizi daha iyi yönetmenize yardımcı olabilir.
- Performans: Projelerin performansı sizin için önemliyse, Yarn ve pnpm gibi paket yöneticileri daha hızlı indirme ve yükleme performansı sunabilir. Bu özellik, geliştirme süreçlerinizi hızlandırabilir.
- Disk Alanı: Disk alanı tasarrufu yapmak istiyorsanız, pnpm tek bir depo kullanımı ve sembolik bağlantılarla bağımlılıkları yöneterek disk alanını optimize edebilir.
- Topluluk Desteği ve Ekosistem: npm, geniş bir topluluk ve büyük bir paket deposuna sahiptir. Popüler ve geniş kapsamlı projeler için npm genellikle iyi bir seçenektir.
- Yenilikler ve Gelişmeler: Yarn ve pnpm gibi alternatif yöneticiler, özellikle yenilikçi ve gelişmeye açık projeler için daha cazip olabilir.
- Mevcut Projeler ve Geçiş: Mevcut projelerinizde hangi paket yöneticisini kullanıyorsanız, geçiş yaparken yaşanabilecek zorlukları ve avantajları değerlendirmelisiniz.
Sonuç olarak, projenizin ihtiyaçlarına, ekosisteminize ve tercihlerinize bağlı olarak npm, Yarn veya pnpm arasından seçim yapabilirsiniz. Her paket yöneticisinin kendine özgü avantajları ve dezavantajları olduğundan, projenizin gereksinimlerini dikkatlice değerlendirmeniz önemlidir. Ayrıca, projenizin büyüklüğü, ekibinizin deneyimi ve kullanım senaryolarınız da seçiminizi etkileyebilir.
npx nedir ve Gelişmiş Senaryolar
Bu bölümde, "npx" komutunu ve bu komutun kullanımını detaylı bir şekilde inceleyeceğiz. Ayrıca, npx kullanarak nasıl gelişmiş senaryolar oluşturabileceğinizi göstermeye çalışacağım.
npx nedir?
"npx", npm paketlerini çalıştırmak veya kullanmak için kullanılan bir komuttur. Özellikle, projelerinizde geçici olarak kullanmanız gereken paketleri kolayca çalıştırmanıza olanak tanır. npx, yerel veya global yüklü olmayan paketleri de kullanabilmenizi sağlar.
npx Kullanarak Geçici Paketler Çalıştırma
Bir paketi yerel olarak yüklemek yerine, npx aracılığıyla geçici olarak çalıştırmak, projenizi hızlı ve düzensiz bir şekilde geliştirmenizi sağlar.
npx create-react-app my-app
Bu komut, create-react-app paketini
indirmez, sadece geçici olarak çalıştırır.
Birden Fazla Komutu Zincirleme
npx, birden fazla komutu kolayca zincirlemek için de kullanılabilir. Bu sayede, projenizde karmaşık işlemleri basit ve okunabilir bir şekilde gerçekleştirebilirsiniz.
npx concurrently "npm run server" "npm run client"
Bu komut, aynı anda npm run server
ve npm run client
komutlarını çalıştırır.
Özel npx Scriptleri Oluşturma
Kendi özel npx scriptlerinizi oluşturarak, tekrar eden görevleri daha etkili bir şekilde yönetebilirsiniz. Bu, projenizin belirli senaryolarını hızlıca çalıştırmanıza olanak tanır.
Projenizde scripts
bölümünde özel bir komut tanımlayın;
"scripts": { "start-dev": "npm run server && npm run client" }
Bu komutu npx ile çalıştırın;
npx start-dev
Bu şekilde, projenizde belirli senaryoları basit ve kısa komutlarla çalıştırabilirsiniz.
--
Özetle
Mini serinin ikinci ve son yazısında, npm paket yöneticisinin gelişmiş kullanımını kapsamlı bir şekilde ele almaya çalıştım. Temel kavramlardan başlayarak, paket versiyonlama stratejilerine, güvenlik yönetimine ve npx gibi gelişmiş senaryolara kadar birçok konuya değindim. Bu bilgilerin, bir geliştirici olarak projelerinizde daha etkili ve verimli olmanıza yardımcı olacağını umuyorum.
Bir projeyi yönetirken doğru paket yönetimi, sürüm kontrolü ve güvenlik önlemleri almak, projenizin kalitesini ve sürdürülebilirliğini artırır. İyi bir paket yönetimi pratiği, projenizin başarısı için hayati öneme sahiptir.
Kaynaklar:
- npm Resmi Dokümantasyon
- Yarn Resmi Dokümantasyon
- pnpm Resmi Dokümantasyon
- npm Package.json Referansı
- Semantic Versioning
- freecodecamp.org Tutorial
İçeriklerimin, kişisel bakış açımı yansıttığını düşünürsek, her zaman gözden kaçırabileceğim, eksik veya hatalı yerler olabilir. Bu nedenle, görüşlerinizi, geri bildirimlerinizi ve sorularınızı yorumlarınızla veya doğrudan bana ulaşarak paylaşmaktan çekinmeyin.
Son olarak, yazılarıma kahve ısmarlayarak destek verebilirsiniz. ️🙌
Yeni bir yazıda görüşmek üzere✌️