Uwielbiam Bundler , jest świetny w zarządzaniu zależnościami. Uwielbiam npm , instalowanie pakietów węzłów jest łatwe! Mam aplikację nodejs i chciałbym móc określić zależności moich aplikacji i łatwo je zainstalować / zaktualizować wszędzie tam, gdzie wdrażam moją aplikację. To nie jest biblioteka, którą udostępniam, to pełnoprawna aplikacja internetowa.
Znam npm bundle
polecenie, ale wydaje mi się , że po prostu zastępuje katalog, w którym są zainstalowane pakiety.
Jestem przyzwyczajony do korzystania z pakietu w ten sposób:
# Gemfile
gem "rails", "3.0.3"
Instaluje rails v3.0.3 i wszystkie inne wymagane klejnoty na maszynie hosta tylko wtedy, gdy jeszcze nie istnieją
> bundle install
Jak mogę osiągnąć coś podobnego z npm?
javascript
dependencies
node.js
bundler
npm
Daniel Beardsley
źródło
źródło
Odpowiedzi:
Od npm 1.0 (który jest teraz tym, co otrzymujesz domyślnie, wykonując kroki w pliku README), „pakiet” nie jest już oddzielną rzeczą - po prostu „jak to działa”.
Więc:
package.json
plik w katalogu głównym projektuWypisz swoje deps w tym pliku
{ "name" : "my-project" , "version" : "1.0.0" , "dependencies" : { "express" : "1.0.0" } }
npm install
Ponieważ wywołujesz to bez argumentów i nie w trybie globalnym, po prostu zainstaluje lokalnie wszystkie twoje dep.require("express")
i bądź szczęśliwy.źródło
your_app/node_modules
katalogu lokalnego na łącze symboliczne poza katalogiem aplikacji. Nie chcesz pobierać, kompilować i instalować każdej zależności za każdym razem, gdy wdrażasz.my-project
w./node_modules/my-project/node_modules
. Nie jestem pewien, czy istnieje wygodny sposób zainstalowania wszystkich zależności w./node_modules
Anyone?Edycja: dotyczy to tylko wersji npm <1.0
Trudno było to rozgryźć, ale NPM to umożliwia .
Potrzebujesz trzech komponentów
deps/
)package.json
Plik w powyższym katalogu, który wymienia Zależnościindex.js
Plik w powyższym katalogu, który wymaga od swoich zależnościamiPrzykład
Wyobraź sobie, że ekspres jest Twoją jedyną zależnością
deps / package.json
Uwaga: Zwiększ numer wersji za każdym razem, gdy modyfikujesz zależności
{ "name": "myapp_dependencies", "version": "0.0.1", "engines": { "node": "0.4.1" }, "dependencies":{ "express": "2.0.0beta2" } }
deps / index.js
export.modules = { express: require('express') //add more }
Teraz powinieneś być w stanie zainstalować swoje zależności za pomocą npm. Możesz nawet uczynić tę część procesu wdrażania
Następnie w kodzie aplikacji możesz uzyskać dostęp do swojej konkretnej wersji ekspresu w następujący sposób:
var express = require('myapp_dependencies').express;
źródło
require('express')
w deps / index.js nie zaimportujemy po prostu najnowszej wersji ekspresowej, a niekoniecznie tej, którą zainstalowaliśmy? Jestem noobem nodeJS, więc proszę o wyrozumiałość.npm install
, dodaje dowiązania symboliczne w katalogu zainstalowanego pakietu do poprawnych wersji pakietów zależnych. Gdy wymagany jest pakiet zależności,require('express')
najpierw sprawdza katalog lokalny i znajduje dowiązanie symboliczne do poprawnej wersji programu express.Powinieneś przeczytać te dwa artykuły z bloga Isaacs (autor npm). Myślę, że są naprawdę dobre i wierzę, że mówią ci, jak osiągnąć swój cel:
Myślę, że link 1 (punkt 11) wyjaśnia to:
źródło
npm bundle
jest używany do gromadzenia wszystkich zależności w określonym katalogu innym niż domyślny. Prawdopodobnie wymyślę własne rozwiązanie, które działa podobnie dobundle install
(bundler
dla rubinu)npm
wersji 1.0+npm bundle
została usunięta. Zamiast tego po prostu użyjnpm install
polecenia bez nazwy pakietu, odczyta plik package.json i ściągnie wymagane pakiety.Od wersji Npm 1.1.2 jest nowe polecenie,
npm shrinkwrap
które tworzynpm-shrinkwrapped.json
plik, analogicznie doGemfile.lock
. Ważne jest, aby go utworzyć, aby zapobiec gniciu oprogramowania (patrz uzasadnienie Bundlera ). Zwłaszcza, że Nodejs ma tak szybko rozwijającą się społeczność.Chociaż
bundle install
tworzyGemfile.lock
automatycznie,npm install
nie utworzynpm-shrinkwrapped.json
(ale użyje go, gdy istnieje). Dlatego musisz pamiętać o użyciunpm shrinkwrap
.Przeczytaj pełny przewodnik pod adresem http://blog.nodejs.org/2012/02/27/managing-node-js-dependencies-with-shrinkwrap/
źródło
Wydaje mi się, że najprostszym rozwiązaniem jest użycie
package.json
pliku zprivate
flagą (dodaną do npm dopiero w zeszłym miesiącu) ustawioną natrue
. W ten sposób możesz uruchomićnpm install
lubnpm bundle
pobrać zależności swojego projektu, ale zapobiegniesz przypadkowemu opublikowaniu projektu niepublicznego.Oto przykład
package.json
:{ "name": "yourProject" ,"version": "1.0.0" ,"dependencies": { "express" : ">=2.1.0" } ,"private": true }
Uruchomienie
npm install
zainstalujeexpress
się w systemie lokalnym, jeśli jeszcze nie istnieje; działanienpm publish
powoduje błąd z powodu rozszerzenia"private": true
.Ty i Twój zespół możecie wewnętrznie używać tagu wersji, aby śledzić zmiany zależności w czasie - za każdym razem, gdy zmieniacie zależność, zwiększajcie wersję. Aby zobaczyć, którą wersję zainstalowałeś, użyj
npm ls installed
.źródło
true
i że to działa tylko dlatego, że łańcuchy są prawdziwymi wartościami (to znaczy!!"false" === true
).Opublikuj również swoją aplikację
npm
w programie i wypisz jej zależności w pliku package.json.Gdy ktoś użyje
npm
do zainstalowania twojego pakietu,npm
zajmie się rozwiązaniem jego zależności.Specyfikacja pakietów: http://wiki.commonjs.org/wiki/Packages/1.0
źródło
npm
do zainstalowania przed zainstalowaniem aplikacji. Myślę, że nie ma innegogem
odpowiednika dla node.js.