Mam pytanie podobne do tego , ale nie całkiem to samo.
Chciałbym, aby użytkownik mojej aplikacji zainstalował ją bez względu na zależności potrzebne do sposobu, w jaki chciałby z niej korzystać. Na przykład, jeśli chcą pozostać w MongoDB, wówczas zostaną zainstalowane tylko biblioteki związane z Mongo, ale jeśli chcą pozostać w Redis, zostaną zainstalowane tylko biblioteki związane z Redis. Nie chcę, aby pobierały i instalowały biblioteki, których nie będą używać.
Wiem, że mogę to zrobić w celach programistycznych devDependencies
, ale to idzie dalej. Jak mówi odpowiedź na powyższe pytanie, jest to ściślej powiązane setuptools
extras_require
z leiningen
profilami Pythona i Clojure . Coś takiego w npm? Naprawdę uważam, że devDependencies
powinienem być dev
profilem bardziej uniwersalnego sposobu określania zależności.
źródło
MyPackage-Core
MyPackage-Db-Mongo
MyPackage-Db-Redis
itd.… w podobny sposób ludzie robią moduły altanowe, które mają na celu rozszerzenie angularjs .package.json
które zostało rozwiązane w innych menedżerach pakietów.Odpowiedzi:
Moduł współuzależnienie może być to, czego szukasz, lub cokolwiek, co robi coś podobnego do:
package.json
, które nie zostaną automatycznie zainstalowanenpm install
, powiedzmyoptionalPeerDependencies
require
funkcja stylu niestandardowego, która wieoptionalPeerDependencies
i robi właściwe rzeczy, w tym rzucanie / ostrzeganie, gdy nie zostanie znalezione nic, co spełnia wymaganą klasę modułów (np. nie są zainstalowane aniredis
, animongo
, animysql
itd.).Jedna z odmian byłaby taka, gdyby podstawowa funkcjonalność modułu działała bez żadnych opcjonalnych zależności (np. Wzorca wtyczki), bez błędu / ostrzeżenia, gdy nie znaleziono niczego, co spełniałoby zależność równorzędną.
Inną odmianą jest wykonanie powyższej listy przy jednoczesnym uwzględnieniu zależności produkcji od rozwoju, tj. Analog dla
dependencies
idevDependencies
.Być może w połączeniu z wymaganiem na żądanie , że opcjonalne moduły są wymagane leniwie, np .:
źródło
codependency
moduł zapewnia w przypadku, gdy moduł wyparuje z NPM i ponieważ linki bez fragmentów są złym formularzem SO.Jeśli chcesz prostych opcjonalnych zależności, takich jak wtyczki, np. Jeśli zainstalujesz foo, uruchomisz go kolorowo, ale jeśli nie zostanie zainstalowany, nie będziesz mieć problemu i zobaczysz go w kolorze szarym, możesz użyć opcjonalnegoDependecies w pliku package.json :
I w kodzie:
Wyodrębniono z dokumentacji package.json .
źródło
To, co robię, to skonfigurowanie skryptu instalacyjnego w mojej paczce.json, wewnątrz
scripts
, w następujący sposób:Będzie działać zaraz po
npm install
zakończeniu. Używam go głównie do automatycznego generowania.env
pliku z ustawieniami domyślnymi.my-install.js
Skrypt może uruchomić różne polecenia, tworzyć pliki, poprosić o dane wprowadzone przez użytkownika, więc nie można powiedzieć „Chcę Redis lub Mongo?”:To jest bardzo szybka odpowiedź, sprawdź readout do poprawnego odczytu danych wejściowych użytkownika i proces potomny do uruchamiania poleceń i przetwarzania danych wyjściowych itp.
Zauważ też, że skrypt instalacyjny może być dowolny (python, bash itp.)
źródło
npm install
ponownie wewnątrz skryptu instalacyjnego może również wywołać niezamierzone działanie. Nie polecam tego rozwiązania.npm naprawdę nie został zaprojektowany do tego, ponieważ jedną z najtrudniejszych części zarządzania zależnościami jest zapewnienie szybkich, powtarzalnych kompilacji, które są łatwe i względnie bezpieczne. Ale wierzę, że istnieje przypadek użycia i na pewno był dla mnie. Więc napisałem pakiet, aby zrobić dokładnie to, o co prosisz.
Mój pakiet jest
install-subset
i można go instalować globalnienpm install -g install-subset
https://www.npmjs.com/package/install-subset
Najpierw budujesz białe i czarne listy dla nazwanych podzbiorów instalacji w pliku package.json w następujący sposób:
Następnie nazwij to na przykład
install-subset test
Spowoduje to tymczasowe przepisanie pliku package.json, aby nie instalować tych pakietów na czarnej liście, a następnie przywrócić go, co w zależności od pakietów może zaoszczędzić dużo czasu i przepustowości.
Współpracuje również z przędzą, jest oprogramowaniem typu open source i problemy / PR są mile widziane.
W wielu przypadkach używam tego na naszym serwerze ci, aby skrócić czas kompilacji, a w naszym najnowszym projekcie React Native wziąłem typową świeżą instalację programisty z 72 sekund do około 20 sekund.
źródło