emirhanHCL 1
emirhanHCL
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
farkmt2official 1
farkmt2official
mannaxxx 1
mannaxxx
Bvural41 1
Bvural41
Agora Metin2 1
Agora Metin2
Hikaye Ekle

[NODE JS] Global ve Local Paket Farkı

nodejs.png


[NODE JS] Global ve Local Paket Farkı​


Selam arkadaşlar. npm ile paket yüklerken global ve local (yerel) arasındaki fark çok önemli. Bu farkı bilmeden paket yönetimi yapmak kafa karışıklığına ve sorunlara yol açar. Ben kariyerimin başında her şeyi global yüklüyordum, sonra neden projeler farklı makinelerde çalışmıyor diye uğraşıyordum. Bugün bu iki yaklaşımın farkını ve doğru kullanım senaryolarını anlatacağım.

Local (Yerel) Paketler​


Yerel paketler projenizin node_modules klasörüne yüklenir ve sadece o proje tarafından erişilebilir. npm install komutu varsayılan olarak yerel yükleme yapar. Bu yaklaşım her projenin kendi bağımlılıklarını yönetmesini sağlar ve farklı projeler farklı versiyon kullanabilir.

Tecrübeme göre paketlerin yüzde doksanı yerel yüklenmelidir. Express, mongoose, jest, eslint gibi paketlerin hepsi yerel olmalı. Çünkü farklı projeler farklı versiyonlara ihtiyaç duyabilir ve yerel yükleme bunu mümkün kılar. Ayrıca başka birisi projenizi klonladığında npm install ile tüm bağımlılıkları alabilir.

JavaScript:
// === LOCAL (YEREL) PAKETLER ===

// Yerel yükleme komutları
// npm install express           -> dependencies'e ekler
// npm install -D jest           -> devDependencies'e ekler
// npm install                   -> package.json'daki tüm bağımlılıkları yükler

// Yerel paketler nereye yüklenir?
// proje/
// ├── node_modules/
// │   ├── express/
// │   ├── jest/
// │   └── ... (tüm bağımlılıklar ve alt bağımlılıklar)
// ├── package.json
// └── package-lock.json

const path = require('path');

// Yerel paket yolu
const yerelPaketYolu = path.join(process.cwd(), 'node_modules', 'express');
console.log('Yerel paket yolu:', yerelPaketYolu);

// Yerel paketleri çalıştırma yolları:

// 1. require/import ile (kod içinde)
// const express = require('express');
// Node.js node_modules'da arar

// 2. npm scripts ile (package.json'da)
// "scripts": { "test": "jest", "lint": "eslint src/" }
// npm run test
// npm scripts PATH'e node_modules/.bin ekler

// 3. npx ile (terminal'den)
// npx jest --watch
// npx eslint src/

// 4. Doğrudan .bin ile (nadiren kullanılır)
// ./node_modules/.bin/jest
// .
ode_modules\.bin\jest.cmd (Windows)

// Avantajlar
const yerelAvantajlar = [
    'Her proje kendi versiyonunu kullanır - versiyon çakışması olmaz',
    'package.json ile bağımlılıklar belgelenir',
    'npm install ile tüm ekip aynı ortamı kurar',
    'CI/CD pipeline'ları düzgün çalışır',
    'Proje taşınabilir ve tekrarlanabilir',
    'node_modules silip yeniden yüklemek kolay'
];

console.log('
=== Yerel Paket Avantajları ===');
yerelAvantajlar.forEach((a, i) => console.log(`  ${i + 1}. ${a}`));

// node_modules çözümleme algoritması
console.log('
=== require() Çözümleme ===');
console.log('require("express") çağrıldığında Node.js şu sırayla arar:');
console.log('  1. ./node_modules/express');
console.log('  2. ../node_modules/express');
console.log('  3. ../../node_modules/express');
console.log('  ... (kök dizine kadar yukarı çıkar)');
console.log('  Son: Global node_modules');

Global Paketler​


Global paketler sistem genelinde yüklenir ve her yerden erişilebilir. Terminal'den doğrudan komut olarak çalıştırılabilirler. Ama global paketler projenizin package.json'ında görünmez, yani başka birisi projenizi klonladığında bu paketlerin yüklü olduğunu bilemez. Bu yüzden global yüklemeyi çok sınırlı tutmanız lazım.

Ben sadece CLI araçları ve sistem genelinde kullanacağım utility'leri global yüklüyorum. Mesela nodemon, pm2, typescript gibi araçlar. Ama artık npx varken global yükleme ihtiyacı çok azaldı. Geçen sene global paketlerimi temizledim, yarısından fazlasının gereksiz olduğunu gördüm.

JavaScript:
// === GLOBAL PAKETLER ===

// Global yükleme komutları
// npm install -g nodemon
// npm install -g pm2
// npm install -g typescript
// npm install -g npm-check-updates

// Global paketler nereye yüklenir?
// Windows: %APPDATA%
pm
ode_modules// macOS/Linux: /usr/local/lib/node_modules/ (veya ~/.npm-global/)

// Global paket yolunu öğrenme
// npm root -g
// npm prefix -g

// Global yüklü paketleri listeleme
// npm list -g --depth=0

// Globalden kaldırma
// npm uninstall -g nodemon

// Global paket olarak yüklenmesi uygun olanlar
const globalUygun = [
    { paket: 'pm2', sebep: 'Process manager - sunucu yönetimi' },
    { paket: 'nodemon', sebep: 'Geliştirme sırasında auto-restart (ama npx de olur)' },
    { paket: 'typescript', sebep: 'tsc CLI aracı (ama yerel de olabilir)' },
    { paket: 'npm-check-updates', sebep: 'Tüm projeler için paket güncelleme' },
    { paket: 'vercel', sebep: 'Deploy CLI aracı' },
    { paket: 'netlify-cli', sebep: 'Deploy CLI aracı' }
];

// Global olarak yüklenmemesi gerekenler
const globalUygunDegil = [
    { paket: 'express', sebep: 'Proje bağımlılığı, yerel olmalı' },
    { paket: 'jest', sebep: 'Test aracı, proje bazlı versiyon önemli' },
    { paket: 'eslint', sebep: 'Linter, proje konfigürasyonuna bağlı' },
    { paket: 'webpack', sebep: 'Build aracı, proje bazlı' },
    { paket: 'react', sebep: 'Kütüphane, kesinlikle yerel' },
    { paket: 'mongoose', sebep: 'DB driver, kesinlikle yerel' }
];

console.log('
=== Global Olarak Uygular ===');
console.table(globalUygun);

console.log('
=== Global Olarak UYGUN DEĞİL ===');
console.table(globalUygunDegil);

// Karar ağacı
function globalMiYerelMi(paket) {
    const sorular = [
        'Bu paket bir CLI aracı mı? (komut satırından çalıştırılıyor mu)',
        'Birden fazla projede aynı şekilde mi kullanılacak?',
        'Proje bağımlılığı olarak gerekli mi?',
        'npx ile geçici olarak çalıştırılabilir mi?'
    ];

    console.log(`
${paket} için karar:`);
    console.log('  CLI aracı + birden fazla proje = GLOBAL olabilir');
    console.log('  Proje bağımlılığı = kesinlikle YEREL');
    console.log('  Tek seferlik kullanım = npx ile çalıştır');
}

globalMiYerelMi('express');
globalMiYerelMi('pm2');

// PATH sorunu çözümü
console.log('
=== Global Paket PATH Sorunu ===');
console.log('Global paket yüklediniz ama komut bulunamıyor mu?');
console.log('1. npm prefix -g ile global dizini öğrenin');
console.log('2. Bu dizini sistem PATH'ine ekleyin');
console.log('3. Terminal'i yeniden açın');
console.log('4. Veya npx ile çalıştırın :)');

Kural basit: paketlerin büyük çoğunluğunu yerel yükleyin, sadece gerçekten sistem genelinde ihtiyaç duyduğunuz CLI araçlarını global yükleyin, ve npx'i alternatif olarak değerlendirin. Bu kuralı takip ederseniz paket yönetiminde sorun yaşamazsınız. Kolay gelsin.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst