Neden küresel ve yerel olarak yudum takmamız gerekiyor?


292

Gulp ile ilgili 2 kılavuz , gulp'i önce küresel olarak (-g bayrağıyla) ve daha sonra yerel olarak bir kez daha yüklemem gerektiğini söylüyor. Neden buna ihtiyacım var?


12
Projenin kendi "Başlarken" sayfası da aynı şeyi söylüyor. (Ayrıca nedenini de söylemez.)
TJ Crowder

11
Keşke npm, yerel paketle aynı sürümde olan genel olarak yüklenmiş bir bağımlılık paketini kullanabilseydi. Her proje dizini için 5MB glup stuff: /
Ciantic

@Ciantic Garanti yok, ama ... ➪ stackoverflow.com/a/25879563/444255
Frank

Yanıtlar:


238

Bir aracı global olarak kurarken, kullanıcı tarafından düğüm projeleri dışında herhangi bir yerde komut satırı yardımcı programı olarak kullanılır. Bir düğüm projesi için genel yüklemeler kötü çünkü dağıtımı daha zor hale getiriyorlar.

npm 5.2+

Birlikte gelen npxyardımcı program npm 5.2bu sorunu çözer. Bununla beraber, küresel olarak kurulmuş yardımcı programlar gibi yerel olarak yüklenmiş yardımcı programları çağırabilirsiniz (ancak komutu ile başlamalısınız npx). Örneğin, yerel olarak yüklenen bir dosyayı çağırmak eslintistiyorsanız şunları yapabilirsiniz:

npx eslint .

npm <5.2

scriptPackage.json paketinizin bir alanında kullanıldığında , aracı ve genel olarak yüklenmiş modülleri npmarar node_modules, bu nedenle yerel kurulum yeterlidir.

Yani, eğer memnunsanız (paketinizde.json):

"devDependencies": {
    "gulp": "3.5.2"
}
"scripts": {
    "test": "gulp test"
}

vb. ile çalışarak npm run testglobal yüklemeye hiç ihtiyacınız olmamalıdır.

Her iki yöntem de insanlara projenizle başa çıkmak için yararlıdır çünkü sudogerekli değildir. Ayrıca gulp, sürüm paketin içine girdiğinde güncelleneceği anlamına gelir . Json, bu nedenle herkes projenizle geliştirirken aynı gulp sürümünü kullanacaktır.

Zeyilname:

Görünüşe göre yudum küresel olarak kullanıldığında alışılmadık bir davranış sergiliyor. Global kurulum olarak kullanıldığında gulp, kontrolü geçmek için yerel olarak kurulmuş bir gulp arar. Bu nedenle, küresel bir kurulumun çalışması için yerel bir kurulum gerektirir. Yukarıdaki cevap yine de duruyor. Yerel yüklemeler her zaman genel yüklemelere tercih edilir.


3
Evet ama internet erişiminiz olmadığında ne olacak? Global olarak kurulu değilse yutmayı nasıl kullanabilirsiniz?
IGRACH

3
@IGRACH Yukarıdaki komut dosyası internet bağlantısı kullanmıyor. Aynı şeyi package.json içinde bir komut dosyası alanı kullanmadan yapmak istiyorsanız, kullanın ./node_modules/.bin/gulp.
qubyte

1
Ben için diğer adları tanımladım gulpve coffeeböylece komutları düğüm proje kök (örn. alias gulp="node_modules/.bin/gulp") Çalışır . Bu şekilde gerektiğinde komutların kullanımı kolaydır ve genel / yerel sürüm çakışmaları meydana gelmez.
vesse

Teşekkürler @qubyte! Yerel olarak kurmak genel olarak iyi bir uygulamadır. Bir sorum daha var, umarım zihnimi temizlememe yardım edebilirsin. Gulp'in belgesi yerel olarak yüklenmeden önerildiği gibi global olarak yüklemeyi denedim. Bu yüzden çalıştırmayı denediğimde gulpbana aşağıdaki hata mesajını veriyor Local gulp not found in .... Anladığım kadarıyla, önce yerel node_modules'e bakmalı ve eğer bulunamazsa, küresel olarak kurulmuş modüllere bakmalı, değil mi? Teşekkürler!
yeelan

1
Zeyilname eklendi. Umarım bu yudumun tuhaflığını kapsar.
qubyte

82

TLDR; İşte nedeni :

Bunun nedeni , yerel olarak kurulu sürümünüzü kullanarak gulpçalıştırmayı denemesidir , buraya bakın . Bu nedenle küresel ve yerel bir yudum yerleştirmenin nedeni.gulpfile.jsgulp

Temel olarak, gulpyerel olarak yüklediğinizde komut dosyası içinde değildir PATHve bu nedenle gulpkabuğun komutu bulmasını ve yazmasını bekleyemezsiniz. Global dizin yüklediğinizde, gulpkomut dosyası içine girer PATHçünkü global node/bin/dizin büyük olasılıkla yolunuzdadır.

Yerel bağımlılıklarınıza saygı göstermek için, yerel gulpolarak kurulu sürümünüzü kullanacak gulpfile.js.


1
~ / bin kullanıcı başına ikili dosyalar için bir Unix kuralıdır ve birçok işletim sisteminde varsayılan olarak PATH'dir. gulp ikili dosyasını oradan bağlayabilmelidir.
mikemaccana

2
Başka bir deyişle, global olarak kurulmuş gulppaketinizin node_modules/.bin/gulpyola koyulması için gerekli olduğunu söyledi . Depolama ucuz ama bir symlink simüle için MB atmak IMO saf özensizlik olduğunu.
ntd

79

Global gulpolarak yerel olarak kurulmuş olan

npm link gulp

1
Yerel yüklemeleri kullanmanın en iyisi olduğunu biliyorum, ancak yükleyemediğiniz veya sadece istemediğiniz durumlar olabilir (özel CI sunucunuzun global olarak yüklendiğini ve her taahhütte yeniden yüklediğinizi hayal edin) . Her neyse, bahsetmek için +1 npm link.
gion_13

1
Orada ne yaptığınızı görüyorum. Zekice.
deepelement

Bu soruya cevap vermeye çalışmaz
mikemaccana

1
Hayır, sadece geçersiz kılıyor.
Berislav Lopac

67

" Neden küresel ve yerel olarak yudum takmamız gerekiyor? " Sorusu aşağıdaki iki soruya ayrılabilir:

  1. Global olarak daha önce kurduysam neden gulp'i yerel olarak kurmam gerekiyor?

  2. Yerel olarak daha önce kurduysam neden gulp'i global olarak kurmam gerekiyor?

Bazıları bu sorulara ayrı olarak mükemmel cevaplar verdiler, ancak bilgileri birleşik bir cevapta birleştirmenin yararlı olacağını düşündüm.

Global olarak daha önce kurduysam neden gulp'i yerel olarak kurmam gerekiyor?

Yudumu yerel olarak kurmanın mantığı birkaç nedenden oluşur:

  1. Projenizin bağımlılıklarını yerel olarak dahil etmek, kullanılan yemin (veya diğer bağımlılıkların) orijinal olarak tasarlanan versiyonunu sağlar.
  2. Düğüm, requir () (betiğinize gulp eklemeniz gerekir) kullanılırken varsayılan olarak genel modülleri dikkate almaz. Sonuç olarak, bunun nedeni genel modüllerin yolunun varsayılan olarak NODE_PATH öğesine eklenmemesidir.
  3. Düğüm geliştirme ekibine göre, yerel modüller daha hızlı yüklenir. Bunun neden olduğunu söyleyemem, ancak bu, düğümün üretimdeki kullanımıyla (yani çalışma zamanı bağımlılıkları) geliştirmeden (yani dev bağımlılıklarından) daha alakalı görünecektir. Bazıları yerel modüller ile küresel modülleri yüklemek gibi küçük hız avantajı kazanılan şeyleri önemsediğinden, bunun meşru bir neden olduğunu düşünüyorum, ancak bu nedenle kaşınızı kaldırmaktan çekinmeyin.

Yerel olarak daha önce kurduysam neden gulp'i global olarak kurmam gerekiyor?

  1. Global gulp kurulumunun mantığı, gulp yürütülebilir dosyasının sistem yolunuzda otomatik olarak bulunmasının sadece kolaylığıdır.

Yerel olarak yüklemekten kaçınmak için kullanabilirsiniz npm link [package], ancak bağlantı komutunun yanı sıra install --globalkomut--save-dev seçeneği seçeneği bu da gulp'ı küresel olarak yüklemenin kolay bir yolu olmadığı ve ardından hangi sürümü kolayca ekleyeceği anlamına geliyor. yerel package.json dosyanız.

Sonuçta, tüm projelerinizde ortak araçların kurulumunu çoğaltmaktan kaçınmak için küresel modülleri kullanma seçeneğine sahip olmanın daha mantıklı olduğuna inanıyorum, özellikle de grunt, gulp, jshint, vb. Tahıllara karşı gittiğinizde aletlerle savaştığınız anlaşılıyor.


7
Sorunun iki noktası olduğunu belirten tüm internette ilk kişi olduğu için +1. Her yerdeki herkesin çoğu, "Yerel olarak zaten yüklediysem neden gulp'ı küresel olarak kurmam gerekiyor?" Bilmek istediğim şey "Küresel olarak daha önce kurduysam neden yutmayı yerel olarak kurmam gerekiyor?"
Nathan JB

10
Bu sorunun bu kadar ayrıntılı bir açıklamaya ihtiyacı olması, bunun çok mantıklı bir çalışma yöntemi olmadığı anlamına gelir. Her bir proje için aynı aracın tekrar tekrar kurulması gerekli değildir.
Kokodoko

4
Cevabınız çok güzel, duygusuz. Benimki% 80 küfür olurdu, çünkü bu çok aptalca görünüyor. Takım perspektifinden yerel kurulum teorisi muhtemelen doğrudur, ancak işletim sistemi perspektifinden ve paket yöneticileri perspektifinden bakıldığında bu çok çılgındır, bunun için kelimeler bulamıyorum. NPM / yutkun çocuklar hangi ilaçları alır?!? Eğer kimse aynı fikirde değilse, lütfen sistem paket yöneticisinin dpkg, yum, pacman ve co. iş.
JepZ

2
@JepZ sadece yudum süper garip olsa da, düğümde veya npm'de bunu zorlayan hiçbir şey yok. Projede belirli yiğitlik versiyonlarının tutulması, yiğit adamların yama versiyonlarını düzenli olarak veya başka bir şekilde kırması durumunda mantıklıdır, diğer oluşturma araçları genellikle küresel bir kurulumdur. Ama ah iyi. Sadece küfür için burada.
Stoffe

2
Topluluk sadece ipliği kullanmaya
Derek Greer

8

Teknik node_modulesolarak, yerel kurulumunuzdaki klasör sizin içindeyse global olarak kurmanıza gerek yoktur PATH. Genellikle bu iyi bir fikir değildir.

Alternatif olarak npm testreferanslar gulpvarsa,npm test ve yerel yudumu çalıştıracaktır.

Dünyada hiç yudum takmadım - bence bu kötü bir form.


3
Yolunuza koymaktan daha iyi bir yaklaşım NPM betiklerini kullanmaktır
Jay

2

Sorunumuzun sadece yerel olarak gulp kurulumu ile ilgili olup olmadığından emin değilim. Ancak kendimize bir grup bağımlılık kurmamız gerekiyordu. Bu bir "büyük" package.json yol açar ve gulp sadece yerel olarak yüklemek için gerçekten harika bir fikir olup olmadığından emin değiliz. Yapım ortamımız nedeniyle bunu yapmak zorundaydık. Ama kesinlikle gerekli değilse, yutmayı küresel olarak yüklememenizi tavsiye etmem. Aşağıdaki blog yazısında açıklanan benzer sorunlarla karşılaştık

Bu sorunların hiçbiri, geliştiricilerimizden herhangi biri için yerel makinelerinde ortaya çıkmaz, çünkü hepsi küresel olarak yıpranır. Yapım sisteminde tarif edilen problemler vardı. Birisi ilgilenirse bu konuya daha derinlemesine dalabilirdim. Ama şu anda sadece yerel olarak yudum takmanın kolay bir yolu olmadığını belirtmek istedim.


Evet, lütfen bu konunun derinliklerine dalın.
kenorb

1

Sadece burada görmediğim için, MacOS veya Linux'taysanız, bunu PATH'nize (bashrc'nizde vb.) Eklemenizi öneririm:

node_modules/.bin

Bu göreli yol girdisiyle, herhangi bir düğüm projesinin kök klasöründe oturuyorsanız, "genel yüklemeler" vb. Konusunda endişelenmeden herhangi bir komut satırı aracını (eslint, gulp vb.) Çalıştırabilirsiniz npm run.

Bunu yaptığımda, hiçbir zaman global olarak bir modül kurmadım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.