Npm cinsinden isteğe bağlı bağımlılıklar?


23

Ben benzer bir sorum var bu , ama oldukça aynı değildir.

Uygulamamın kullanıcısının, kullanmak istediği şekilde ihtiyaç duyduğu bağımlılıklar ile yüklemesini istiyorum. Bu nedenle, örneğin, MongoDB'ye devam etmek istiyorlarsa, yalnızca Mongo ile ilgili kütüphaneler kurulacaktır, ancak Redis'e devam etmek istiyorlarsa, yalnızca Redis ile ilgili kütüphaneler kurulacaktır. Kullanmayacakları kütüphaneleri indirip kurmalarını sağlamak istemiyorum.

Bunu geliştirme amacıyla yapabildiğimi biliyorum devDependencies, ama bu bundan daha da ileri gidiyor. Yukarıdaki sorunun cevabında yazdığı gibi, bu Python setuptools extras_requireve Clojure leiningenprofilleri ile daha yakından ilgilidir . Npm'de böyle bir şey var mı? Gerçekten hissediyorum devDependenciesbir olmalı devbağımlılıkları belirterek daha çok yönlü şekilde profili.


Sadece bir düşünce ama birden fazla paketle gidebilirsiniz. MyPackage-Core MyPackage-Db-Mongo MyPackage-Db-Redisvb ... çoğu insanın köşeleri genişletmek için modülleri güçlendirmesini sağlar .
Mike,

@Mike: Hmm teşekkürler, dikkate alacağım. Bunun package.json, diğer paket yöneticilerinde çözülmüş bir sınırlama olduğunu düşünüyorum .
imiric

1
Bu harika bir soru, ama bence konu dışı çünkü bazı araçların kullanılması ile ilgili. Bu tür sorular, yalnızca aracın bir geliştirme sürecine nasıl entegre edildiğini kapsarsa konuyla ilgilidir - sonuçta, bu site Yazılım Mühendisliği ile ilgilidir. Ayrıntılar için yardım merkezimize bakın. Lütfen okuyun: Alet sorumu nereye gider? NPM gibi geliştirme araçlarının kullanımı Yığın Taşması ile ilgili olacaktır.
amon

Yanıtlar:


9

Bağlaşıklık modülü aradığınız veya benzer bir şey yapar şey şeyin çekebilir:

  • isteğe bağlı bağımlılıkları beyan edilmez otomatik olarak yüklenir diyelim ki,package.jsonnpm installoptionalPeerDependencies
  • Gerekli bir modül sınıfını karşılayan hiçbir şey bulunmadığında fırlatma / uyarı da dahil olmak üzere doğru şeyi requirebilen optionalPeerDependenciesve yapan bir özel stil işlevi (örneğin redis, ne kurulur mongone de mysqlvb.).
  • Bu modülün tüketicilerinin isteğe bağlı eş modüllerden en az 1 tanesini kurma beklentisini belgeleyin

Bir varyasyon, modülün çekirdek işlevselliği herhangi bir isteğe bağlı bağımlılık olmadan (örn. Eklenti modeli) çalışırsa, eş bağımlılığı sağlayan hiçbir şey bulunmadığında hata / uyarı olmazsa olur.

Başka bir varyasyon geliştirme bağımlılıkları karşı üretimi için gerekli hesaplamaların yukarıdaki liste yapıyor, bir analog yani dependenciesve devDependencies.

Belki bir kombine on-demand gerektiren isteğe bağlı modüller örneğin lazily gereklidir, öyle ki:

exports = {
    Core : require('./core'),
    get redis(){ return require('./redis'); },
    get mongo(){ return require('./mongo'); }
}

Buna bir süredir ihtiyacım olmadı, ama sanırım sahip olduğum sorunu çözdü. Teşekkürler!
imiric

2
Evet, belki de onu anladığına ya da devam ettiğine göre, aylık olduğunu düşündüm. Sorunuzu kendi kendime cevap ararken buldum, bu yüzden bu daha çok kıtlık içindi. Bir kereden fazla araştırmaya gittim, sadece birkaç yıl önce yazmış olduğum bir cevabı bulmak için. Öyleyse bu aydınlanmış kişisel ilgiyi düşünün. Ayrıca, codependencymodülün NPM'den buharlaşması durumunda modülün ne sağladığını ve alıntılar içermeyen bağlantıların kötü SO formu olması nedeniyle genel olarak açıklamak için cevabı güncelledi .
toolbear

9

Eğer foo yüklemek eğer örneğin eklentileri, gibi basit opsiyonel bağımlılıkları istiyorsanız bunu renkli ama yüklü değilse, herhangi bir sorun var ve gri görmüyorum, o zaman kullanabilirsiniz çalışacak package.json içinde optionalDependecies :

{
  "name": "watchit",
  "version": "1.2.3",
  "optionalDependencies": {
    "foo": "^2.0.0"
  }
}

Ve kodda:

try {
  var foo = require('foo')
  var fooVersion = require('foo/package.json').version
} catch (er) {
  foo = null
}
if ( notGoodFooVersion(fooVersion) ) {
  foo = null
}

// .. then later in your program ..

if (foo) {
  foo.doFooThings()
}

Çıkarılan package.json belgelerinde .


1

Yaptığım şey, package.json içinde bir yükleme betiğini şöyle yapılandırmaktır scripts:

"install": "node ./my-tools/my-install.js",

Tamamlandıktan hemen sonra çalışacak npm install. .envVarsayılan olarak otomatik olarak bir dosya oluşturmak için kullanıyorum .

my-install.jsSenaryo çok orada söyleyebilirsiniz, kullanıcı girişi istemek, dosyaları oluşturmak, farklı komutlar çalıştırabilir "REDIS veya Mongo ister misiniz?":

const exec = require('child_process').exec;
const readline = require('readline');

// Insert "Ask question script" here
// using readline core module

if ( option == 'mongo' )
  exec('npm install mongoose');

if ( option == 'redis' )
  exec('npm install redis');

Bu çok hızlı bir cevaptır, kullanıcı girişini doğru okumak için okuma satırını kontrol edin ve komutları çalıştırmak ve çıktıyı işlemek için alt süreç vb.

Ayrıca kurulum betiğinin ne istersen de olabileceğine dikkat et (python, bash, etc)


2
Kullanıcı girişi yapmak, otomatik yapıları bozacaktır. npm installBir kurulum betiğinin içinde tekrar çalıştırmak da istenmeyen davranışları tetikleyebilir. Bu çözümü önermiyorum.
Lambda Perisi,

1

npm, bunun için tasarlanmamıştır, çünkü bağımlılık yönetiminin en zor kısımlarından biri, kolay ve nispeten güvenli olmayan hızlı, yeniden üretilebilir yapılar sağlamaktır. Ama bir kullanım davası olduğuna inanıyorum ve kesinlikle benim için de vardı. Bu yüzden tam olarak ne istediğinizi yapmak için bir paket yazdım.

Paketim install-subset, ve global olarak kurulabilirnpm install -g install-subset

https://www.npmjs.com/package/install-subset

Öncelikle, paketinizde adlandırılmış kurulum altkümeleri için beyaz listeler ve kara listeler oluşturursunuz.

"subsets": {
    "build": {
        "whitelist": [
            "babel-cli",
            "dotenv"
        ]
    },
    "test": {
        "blacklist": [
            "eslint",
            "lint-rules",
            "prettier"
        ]
    }
}

Öyleyse, örneğin install-subset test

Bu, kara listeye alınan paketleri yüklememek için paketinizi geçici olarak yeniden yazacaktır, daha sonra paketlere bağlı olarak çok fazla zaman ve bant genişliği tasarrufu sağlayabilecek şekilde geri yükleyiniz.

Ayrıca iplik ile çalışır, açık kaynaklıdır ve konular / PR'ler memnuniyetle karşılanmaktadır.

Çoğu durumda bunu, kurulum sürelerini kısaltmak için ci sunucumuzda kullanıyorum ve en son React Native projemizde tipik geliştirici kurulumumuzu 72 saniyeden 20 saniyeye çıkardı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.