Podsumowanie ważnych różnic w zachowaniu:
Powiązane opcje nie omówione tutaj:
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ącego package.json
i uruchom:
npm install
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 i devDependency
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:
npm install "$package"
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 na true
, być może z wiersza poleceń, jako:
npm install "$package" --dev
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
i dependency2
oba zależą od dependency3
różnych wersji, drzewo projektu będzie wyglądać następująco:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Wtyczki to jednak pakiety, które zwykle nie wymagają drugiego pakietu, który w tym kontekście jest nazywany hostem . Zamiast:
- wtyczki są wymagane przez hosta
- wtyczki oferują standardowy interfejs, którego host oczekuje
- tylko host będzie wywoływany bezpośrednio przez użytkownika, więc musi istnieć jedna wersja.
Np. Jeśli dependency1
i dependency2
peer zależą dependency3
, drzewo projektu będzie wyglądać następująco:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Dzieje się tak, mimo że nigdy nie wspominasz dependency3
w package.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
jest peer-dependency
- jedyne
require('grunt')
jest poniżej tests/
: nie jest faktycznie używane przez program.
Następnie, gdy użytkownik użyje wtyczki, domyślnie będzie wymagał wtyczki od Gruntfile
dodając grunt.loadNpmTasks('grunt-contrib-uglify')
wiersz, ale grunt
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:
Te rzeczy zostaną zainstalowane podczas wykonywania npm link lub instalacji npm z katalogu głównego pakietu i mogą być zarządzane jak każdy inny parametr konfiguracyjny npm. Zobacz npm-config (7), aby uzyskać więcej informacji na ten temat.
A następnie w NPM-config (7) znajdź dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
optionalDependencies
teraz.