Ta dokumentacja bardzo słabo odpowiada na moje pytanie. Nie zrozumiałem tych wyjaśnień. Czy ktoś może powiedzieć prostszymi słowami? Może z przykładami, jeśli trudno jest wybrać proste słowa?
Dodano również EDITpeerDependencies
, który jest ściśle powiązany i może powodować zamieszanie.
optionalDependencies
teraz.Odpowiedzi:
Podsumowanie ważnych różnic w zachowaniu:
dependencies
są zainstalowane na obu:npm install
z katalogu zawierającegopackage.json
npm install $package
w dowolnym innym katalogudevDependencies
są:npm install
katalogu, który zawierapackage.json
, chyba że podasz--production
flagę (idź głosować odpowiedź Gayana Charitha ).npm install "$package"
żadnym innym katalogu, chyba że dasz mu taką--dev
opcję.peerDependencies
:npm install
masz, i musisz samodzielnie rozwiązać zależność. Podczas działania, jeśli brakuje zależności, pojawia się błąd (wspomniany przez @nextgentech )Przechodniość (wspomniany przez Ben Hutchison ):
dependencies
są instalowane przejściowo: jeśli A wymaga B, a B wymaga C, wówczas C instaluje się, w przeciwnym razie B nie mógłby działać, a także A.devDependencies
nie jest instalowany tranzytowo. Np. Nie musimy testować B, aby przetestować A, więc zależności testowe B można pominąć.Powiązane opcje nie omówione tutaj:
bundledDependencies
który jest omawiany na następujące pytanie: Zalety pakietowych zależności w porównaniu z normalnymi zależnościami w NPMoptionalDependencies
(wspomniany przez Aidana Feldmana )devDependencies
dependencies
są wymagane do uruchomienia,devDependencies
tylko w celu opracowania, np .: testów jednostkowych, transpozycji CoffeeScript na JavaScript, minimalizacji, ...Jeśli masz zamiar opracować pakiet, pobierz go (np. Przez
git clone
), przejdź do jego katalogu głównego zawierającegopackage.json
i uruchom:Ponieważ masz rzeczywiste źródło, jasne jest, że chcesz je opracować, więc domyślnie instalowane są zarówno
dependencies
(ponieważ oczywiście musisz uruchomić, aby się rozwijać), jak idevDependency
zależności.Jeśli jednak jesteś tylko użytkownikiem końcowym, który chce tylko zainstalować pakiet, aby z niego skorzystać, zrobisz to z dowolnego katalogu:
W takim przypadku zwykle nie chcą zależności rozwoju, więc po prostu to, co jest potrzebne do korzystania z pakietu:
dependencies
.Jeśli naprawdę chcesz w takim przypadku zainstalować pakiety programistyczne, możesz ustawić
dev
opcję konfiguracji natrue
, być może z wiersza poleceń, jako:Opcja jest
false
domyślnie, ponieważ jest to znacznie mniej powszechny przypadek.peerDependencies
(Testowany przed 3.0)
Źródło: https://nodejs.org/en/blog/npm/peer-dependencies/
Dzięki regularnym zależnościom możesz mieć wiele wersji zależności: jest ona po prostu instalowana wewnątrz
node_modules
zależności.Np. Jeśli
dependency1
idependency2
oba zależą oddependency3
różnych wersji, drzewo projektu będzie wyglądać następująco:Wtyczki to jednak pakiety, które zwykle nie wymagają drugiego pakietu, który w tym kontekście jest nazywany hostem . Zamiast:
Np. Jeśli
dependency1
idependency2
peer zależądependency3
, drzewo projektu będzie wyglądać następująco:Dzieje się tak, mimo że nigdy nie wspominasz
dependency3
wpackage.json
pliku.Myślę, że jest to przykład wzorca projektowego Inversion of Control .
Prototypowym przykładem zależności równorzędnych jest Grunt, host i jego wtyczki.
Na przykład we wtyczce Grunt, takiej jak https://github.com/gruntjs/grunt-contrib-uglify , zobaczysz, że:
grunt
jestpeer-dependency
require('grunt')
jest poniżejtests/
: nie jest faktycznie używane przez program.Następnie, gdy użytkownik użyje wtyczki, domyślnie będzie wymagał wtyczki od
Gruntfile
dodającgrunt.loadNpmTasks('grunt-contrib-uglify')
wiersz, alegrunt
użytkownik zadzwoni bezpośrednio.Nie działałoby to wtedy, gdyby każda wtyczka wymagała innej wersji Grunt.
podręcznik
Myślę, że dokumentacja dość dobrze odpowiada na pytanie, być może nie znasz wystarczająco menedżerów węzłów / innych pakietów. Prawdopodobnie to rozumiem tylko dlatego, że wiem trochę o pakiecie Ruby.
Kluczowa linia to:
A następnie w NPM-config (7) znajdź
dev
:źródło
npm install package
jakbyś był poleceniem, którego użyłbyś do zainstalowania wszystkich pakietów, które nie są zależnościami programistów, a nie tym, co myślę, że miałeś na myśli, czyli „zainstaluj pakiet o nazwie [pakiet]” - tak myślałem, że zadziałało przed przeczytaniem tego. Na twoim miejscu zredagowałbym [nazwa-pakietu], co wyraźnie pokazuje, że masz na myśli „wstaw-nazwa-tutaj”.peerDependencies
zachowanie w nadchodzącym npm @ 3. From blog.npmjs.org/post/110924823920/npm-weekly-5 : „Nie będziemy już automatycznie pobierać zależności równorzędnych. Zamiast tego ostrzegamy, jeśli zależność równorzędna nie jest jeszcze zainstalowana. To wymaga samodzielnie rozwiązać konflikty peerDependency, ale na dłuższą metę powinno to zmniejszyć prawdopodobieństwo, że znajdziesz się w trudnym miejscu z zależnościami pakietów. ”npm install
z pakietu A, dostaniesz B i C, ale nie D.devDependencies
nie są instalowane, gdyNODE_ENV
jest ustawiony naproduction
.Jeśli nie chcesz instalować devDependencies, możesz użyć
npm install --production
źródło
--save
opcja nie jest już potrzebna. Jeśli zrobisz „npm install my-package”, doda on mój pakiet jako zależność w twoimpackage.json
pliku.Na przykład mokka zwykle byłaby zależnością dev, ponieważ testowanie nie jest konieczne w produkcji, a ekspres byłaby zależnością.
źródło
zależności
Zależności, które musi uruchomić projekt, takie jak biblioteka udostępniająca funkcje wywoływane z kodu.
Są instalowane przejściowo (jeśli A zależy od B, zależy od C, npm zainstalowanie na A spowoduje zainstalowanie B i C).
Przykład: lodash: twój projekt wywołuje niektóre funkcje lodash.
devDependencies
Zależności, których potrzebujesz tylko podczas programowania lub wydawania, takie jak kompilatory, które pobierają Twój kod i kompilują go do javascript, środowisk testowych lub generatorów dokumentacji.
Nie są instalowane przejściowo (jeśli A zależy od B dev-zależy od C, npm instalacji na A zainstaluje tylko B).
Przykład: chrząknięcie: twój projekt używa chrząstki do zbudowania siebie.
peerDependencies
Zależności, do których projekt dołącza lub modyfikuje w projekcie nadrzędnym, zwykle wtyczka do innej biblioteki lub narzędzia. Jest to po prostu kontrola, upewniająca się, że projekt nadrzędny (projekt, który będzie zależał od twojego projektu) ma zależność od projektu, do którego się przyłączasz. Więc jeśli stworzysz wtyczkę C, która dodaje funkcjonalność do biblioteki B, to osoba tworząca projekt A będzie musiała mieć zależność od B, jeśli ma zależność od C.
Nie są instalowane (chyba że npm <3), są tylko sprawdzone pod kątem.
Przykład: chrząknięcie: Twój projekt dodaje funkcjonalność do chrząstki i może być używany tylko w projektach, które używają chrząknięcia.
Ta dokumentacja naprawdę dobrze wyjaśnia zależności rówieśników: https://nodejs.org/en/blog/npm/peer-dependencies/
Ponadto dokumentacja npm została z czasem ulepszona, a teraz ma lepsze wyjaśnienia różnych rodzajów zależności: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
źródło
Aby zapisać pakiet w pliku package.json jako zależności deweloperskie:
Po uruchomieniu
npm install
zainstaluje zarównodevDependencies
idependencies
. Aby uniknąć instalacji,devDependencies
uruchom:źródło
Istnieje kilka modułów i pakietów niezbędnych tylko do programowania, które nie są potrzebne w produkcji. Jak napisano w dokumentacji :
źródło
Proste wyjaśnienie, które wyjaśniło mi to:
Podczas wdrażania aplikacji należy zainstalować moduły zależne, inaczej aplikacja nie będzie działać. Moduły w devDependencies nie muszą być instalowane na serwerze produkcyjnym, ponieważ nie pracujesz na tym komputerze. połączyć
źródło
vendor.js
lib będą wbudowane w , wszystkie nasze deps powinny być dev deps, jeśli skompilowany kod zostanie wprowadzony do repo? I należy to zatwierdzić, ponieważ inaczej dziwne jest, że musisz skompilować moduł, a nie tylko go zainstalować (a testowanie jest również gdzieś tutaj, ponieważ każda zmiana w podmodułach może prowadzić do regresji) ...webpack -p
to znaczy. Proszę odpowiedzieć na moje pytanie.Chciałbym dodać do odpowiedzi mój pogląd na te wyjaśnienia zależności
dependencies
są używane do bezpośredniego użycia w twojej bazie kodu, rzeczy, które zwykle kończą się w kodzie produkcyjnym lub kawałkach kodudevDependencies
są używane w procesie kompilacji, narzędzia, które pomagają zarządzać końcowym kodem końcowym, moduły testowe innych firm (np. pakiety webpack)źródło
W skrócie
Zależności -
npm install <package> --save-prod
instaluje pakiety wymagane przez aplikację w środowisku produkcyjnym.DevDependencies -
npm install <package> --save-dev
instaluje pakiety wymagane tylko do lokalnego programowania i testowaniaSamo wpisanie
npm install
powoduje zainstalowanie wszystkich pakietów wymienionych w pliku package.jsonwięc jeśli pracujesz na komputerze lokalnym, po prostu wpisz
npm install
i kontynuuj :)źródło
peerDependencies
nie miało dla mnie sensu, dopóki nie przeczytałem tego fragmentu z postu na blogu na wspomniany wyżej Ciro :Wtyczka oczekuje określonej wersji hosta ...
peerDependencies
są przeznaczone dla wtyczek, bibliotek, które wymagają biblioteki „hosta” do wykonywania swojej funkcji, ale mogły zostać napisane w czasie przed wydaniem najnowszej wersji hosta.Oznacza to, że jeśli piszę
PluginX v1
doHostLibraryX v3
i odejść, nie ma gwarancji,PluginX v1
będzie działać, gdyHostLibraryX v4
(lub nawetHostLibraryX v3.0.1
) zostanie zwolniony.... ale wtyczka nie zależy od hosta ...
Z punktu widzenia wtyczki dodaje tylko funkcje do biblioteki hosta. Tak naprawdę nie „potrzebuję” hosta, aby dodać zależność od wtyczki, a wtyczki często nie zależą dosłownie od hosta. Jeśli nie masz hosta, wtyczka nieszkodliwie nic nie robi.
Oznacza to,
dependencies
że nie jest to właściwa koncepcja wtyczek.Co gorsza, jeśli mój host byłby traktowany jako zależność, znaleźlibyśmy się w takiej sytuacji, o której wspomina ten sam blog (nieco zmodyfikowany, aby użyć gotowego hosta i wtyczki z odpowiedzią):
... a host oczywiście nie zależy od wtyczki ...
... o to chodzi w wtyczkach. Teraz, jeśli host był na tyle miły, że zawierał informacje o zależnościach dla wszystkich swoich wtyczek, rozwiązałoby to problem, ale wprowadziłoby także ogromny nowy problem kulturowy : zarządzanie wtyczkami !
Chodzi o to, że wtyczki mogą łączyć się anonimowo. W idealnym świecie zarządzanie nimi przez gospodarza byłoby schludne i uporządkowane, ale nie będziemy wymagać od bibliotek stada kotów.
Jeśli nie jesteśmy hierarchicznie zależni, być może jesteśmy niezależni od siebie ...
Zamiast tego mamy pojęcie bycia rówieśnikami. Ani host, ani wtyczka nie znajdują się w segmencie zależności drugiego. Oba żyją na tym samym poziomie wykresu zależności.
... ale to nie jest związek automatyczny. <<< Moneyball !!!
Jeśli jestem
PluginX v1
i oczekuję rówieśnika (to znaczy, mam peerDependency of )HostLibraryX v3
, powiem tak. Jeśli automatycznie uaktualnione do najnowszejHostLibraryX v4
(uwaga to wersja 4 ) I jużPlugin v1
zainstalowany, trzeba wiedzieć, prawda?npm
nie mogę poradzić sobie z tą sytuacją -... lub ...
Co powiesz na nie, npm ?!
Więc npm nie. Ostrzega o sytuacji i pozwala dowiedzieć się, czy
HostLibraryX v4
jest odpowiedni dla siebiePlugin v1
.Coda
Dobre
peerDependency
zarządzanie wtyczkami sprawi, że ta koncepcja będzie działać bardziej intuicyjnie w praktyce. Z posta na blogu jeszcze raz ...źródło
Zależności a zależności deweloperskie
Zależności programistyczne to moduły, które są wymagane tylko podczas programowania, podczas gdy zależności są wymagane w czasie wykonywania. W przypadku wdrażania aplikacji należy zainstalować zależności, w przeciwnym razie aplikacja po prostu nie będzie działać. Biblioteki wywoływane z kodu, które umożliwiają uruchomienie programu, można uznać za zależności.
Np. React, React - dom
Moduły zależności deweloperów nie muszą być instalowane na serwerze produkcyjnym, ponieważ nie będziesz programować na tej maszynie. Kompilatory, które zakrywają twój kod do javascript, frameworków testowych i generatorów dokumentów, mogą być uważane za zależności deweloperów, ponieważ są one wymagane tylko podczas programowania.
Np. ESLint, Babel, webpack
@FYI,
Jeśli publikujesz w npm, ważne jest, aby użyć poprawnej flagi dla odpowiednich modułów. Jeśli jest to coś, co twój moduł npm musi funkcjonować, użyj flagi „--save”, aby zapisać moduł jako zależność. Jeśli jest to coś, czego moduł nie musi funkcjonować, ale jest potrzebny do testowania, użyj flagi „--save-dev”.
źródło
Podczas próby dystrybucji pakietu npm należy unikać używania
dependencies
. Zamiast tego należy rozważyć dodaniepeerDependencies
lub usunięcie godependencies
.źródło
Znalazłem proste wyjaśnienie.
Krótka odpowiedź:
zależności „… są tymi, których naprawdę potrzebuje Twój projekt, aby móc pracować w produkcji”.
devDependencies „... to te, których potrzebujesz podczas programowania”.
peerDependencies „jeśli chcesz utworzyć i opublikować własną bibliotekę, aby mogła być używana jako zależność”
Więcej szczegółów w tym poście: https://code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies
źródło