2013-02-02 23 views
64

Paketimden otomatik olarak yüklenip komut satırından çalıştırılabilmesini istediğim birkaç "global" bağımlılığım (jshint, csslint, buster vb.) Var. npm install aracılığıyla yüklenir. Mümkün mü?Package.json aracılığıyla "global" npm bağımlılıklarının yüklenmesi

Şu anda, aşağıdaki elle yapıyorum: Projemin içinden

  1. npm install -g <package_name>
  2. : npm link <package_name>

Güncelleme: Sadece NPM için this feature request rastladı. Package.json içinde scripts config gibi görünüyor mu?

Güncelleme: Veya npm docs'u okuduktan sonra belki de .gyp file kullanmam gerekiyor? Kafam karıştı.

cevap

42

Bağımlılıkları package.json numaralı telefondan "global" olarak belirtmek mümkün değil. Ve, bu, Isaac states in that feature request olarak adlandırılan tasarım gereğidir:

Evet, bunu asla yapmayacağız. Bir paket yerel olarak yüklendiğinde, yine de "ikili dosyalar" kullanılabilir. .../node_modules/.bin/'da olacaklar. Ve bunları bir preinstall script ile sıraya koyabilmelisiniz. komutların dizi oldukça uzun ise

rağmen, (aynı "vb jshint, csslint, buster, .." öneririm), çeşitli gerçekleştirmek için gibi grunt bir yapı aracını kullanarak içine bakmak isteyebilirsiniz görevleri:

{ 
    // ..., 

    "scripts": { 
     "preinstall": "grunt" 
    } 
} 
+0

Teşekkürler @Jonathan. Bence haklısın. Ben şu anda modernizr, jquery, vb .. yapıyorum ve rasgele dosyaları lib klasörüne kopyalayan 'install' adlı bir grunt görevim var. Bu, geliştiricilerin global paketleri kendileri yüklemeleri gerekeceği anlamına geliyor, ancak yine de benim uygulamamın kaygısı olmamalı. – uglymunky

+1

Uygulamanız bağımlılıklarını belgelemeli ve bence, bir şekilde var olduklarından emin olun. – EndangeredMassa

+3

https://www.npmjs.org/doc/misc/npm-scripts.html, yükleme komut dosyalarının kullanımının bir desen karşıtı olduğunu söylüyor. – Fdr

25

gerçekten ardından ./node_modules/.bin için PATH ayarlayan bir bash betiği kullanmak, yerel bağımlılıkları yüklemek desen gibi.

Dosya: env.sh

# Add your local node_modules bin to the path for this command 
export PATH="./node_modules/.bin:$PATH" 

# execute the rest of the command 
exec "[email protected]" 

Sonra, herhangi bir bash komutunu önce bu komut dosyasını kullanabilirsiniz. Eğer eşleştirirseniz bir Makefile veya npm komut dosyası ile:

Dosya: bu dosyalarda package.json

"scripts": { 
    "lint": "./env.sh csslint my_styles" 
} 

Bu görevler referans verdikleri gibi bakmak:

lint : 
    ./env.sh csslint my_styles 

Dosya Makefile Bazı global konumlarda csslint, ancak aslında node_modules kutunuzdaki sürümü kullanıyorlar.

Bunun gerçekten harika faydası, diğer bağımlılık modülleriniz gibi, bu bağımlılıkların kolayca sürümlendirilebilmesidir. Küresel bir yükleme çözümü ile uğraşırsanız, diğer sistemlerinden biri için gerekli olan, kullanıcının sisteminde bazı belirli sürümleri gizliyor olabilirsiniz.

+1

Bir../Node_modules/.bin/'komutunu her çağırmak istediğinizde yolu ayarlamak için neden bir komut dosyası kullandığınızı genişletebilir misiniz? Örneğinizde, "lint" komutunu her çalıştırdığınızda, zaten var olsa bile./Node_modules/.bin işlevini yolunuza ekleyeceksiniz. Neden yolunu profilinizde bir kez ayarlamıyorsunuz? Komut orada değilse, kabuk '$ PATH' kalanına bakmaya devam edecektir. – N13

+1

Bunun herkes tarafından kullanılabilir olmasını istiyorum. Bunu profilimde ayarlayabilirdim ve benim için işe yarayacaktı, ama sonra bu modül üzerinde çalışmak isteyen herkesin aynısını yapmak zorunda kalacak. './env.sh''in package.json' scripts''da artık gerekli olmadığını unutmayın. – EndangeredMassa

+2

Hala neden "PATH" ayarlandığını anlamıyorum. Eğer tüm './Node_modules/.bin /' komutları 'env.sh' üzerinden yönlendirilirse, neden PATH' ile bütünleşir? Exec/node_modules/.bin/$ @ 'yeterli değil mi? – N13

7

Bunu denemek gerekir: Ben düz package.json global npm paketlerini yüklemek için kullanıyorum https://github.com/lastboy/package-script

. Teknik olarak okur yazar olmayan müşteriler için iyi çalışır.

Paketler önceden kurulmuşsa, takılmamışsa bile kontrol eder!

İlgili konular