Package.json jest plikiem w formacie JSON, który istnieje w każdym projekcie opartym na Node.js. Jest to plik zawierający informacje o projekcie, takie jak wersja, opis, autorzy i wiele innych ważnych informacji.
Drugą jego bardzo ważną rolą, jest przechowywanie informacji o dodatkowych zależnościach jakie zostały wykorzystane do stworzenia projektu. Zależności te najczęściej pochodzą z repozytorium NPM-a. Zależności zapisane są za pomocą nazwy i wersji.
Gdy inicjalizujemy nowy projekt na przykład w Angularze inicjalizuje się gotowy package.json
który zawiera wszystkie niezbędne zależności. Gdy zaczynam pracę w projekcie który już trwa i pobieramy go z repozytorium kodu, tam również istnieje package.json
. Zazwyczaj wystarczy uruchomić komendę:
npm install
i wszystkie niezbędne zależności zostaną dociągnięte do naszego projektu. Wtedy dopiero możemy zacząć proces developmentu.
Zależności podzielone są przeważnie na dwie grupy. Pierwsza z nich kryje się pod właściwością dependecies
i te zależności są niezbędne do działania Twojej aplikacji. Przykładem może być paczka UUID, która służy do generowania unikalnych id.
"dependencies": {
"@angular/animations": "~10.0.14",
"@angular/common": "~10.0.14",
"@angular/compiler": "~10.0.14",
"@angular/core": "~10.0.14",
"@angular/forms": "~10.0.14",
"@angular/platform-browser": "~10.0.14",
"@angular/platform-browser-dynamic": "~10.0.14",
"@angular/router": "~10.0.14",
},
Druga grupa kryje się pod nazwą devDependecies
i w tej grupie znajdziemy zależności, które wspomagają proces tworzenia aplikacji jak wszelkiego rodzaju narzędzia do sprawdzania kodu, budowania kodu, zarządzania projektem, pisaniem testów.
"devDependencies": {
"@angular-devkit/build-angular": "~0.1000.8",
"@angular/cli": "~10.0.8",
"@angular/compiler-cli": "~10.0.14",
"@types/node": "^12.11.1",
"@types/jasmine": "~3.5.0",
"@types/jasminewd2": "~2.0.3",
"codelyzer": "^6.0.0",
"jasmine-core": "~3.5.0",
"jasmine-spec-reporter": "~5.0.0",
"karma": "~5.0.0",
"karma-chrome-launcher": "~3.1.0",
"karma-coverage-istanbul-reporter": "~3.0.2",
"karma-jasmine": "~3.3.0",
"karma-jasmine-html-reporter": "^1.5.0",
}
Pod właściwością scripts
znajdują się komendy, które uruchamiane są przez narzędzie linii komend NPM. Komendy te mogą dotyczy wywołania innych skryptów jak formatowanie kodu, uruchomienie projektu w wersji developerskiej, zbudowanie projektu w wersji produkcyjnej itd.
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
Sam plik package.json
posiada o wiele więcej właściwości, jeśli chcemy się z nimi dokładnie zapoznać warto sprawdzić dokumentację.
Uruchomienie komendy npm install
powoduje pobranie wszystkich zależności do katalogu node_modules
. W ten sposób nasz kod korzysta z tych zależności lokalnie. Wykonanie komendy npm install
powoduje także powstanie pliku package-lock.json
, jeżeli nie istniał. Jest to plik, który opisuje dokładnie jakie paczki i w jakiej wersji zostały pobrane.
Plik ten jest ważny dla innych developerów i powinien być dostarczony do nich wraz z package.json
. Gwarantuje on bowiem, że inni developerzy pobiorą te same wersje zależności. Sam plik package.json
nie gwarantuje tego, ponieważ często pobierane zewnętrzne paczki kodu to zależności, które wciąż są rozwijane i mogą być pobrane w innej wersji iż są opisane w package.json
. Pozwala na to dodatkowa adnotacja przy wersji np. "~10.0.14"
lub "^12.11.1"
.