2017-06-08 22 views
11

Mam repozytorium zawierające package.json, które zawiera zależności zakresowe. Mam również plik .npmignore przeznaczony do umieszczenia na białej liście wszystkich plików i podkatalogów w dist/. Problem polega na tym, że wszystkie zakresy zależności są uwzględniane podczas uruchamiania kolejnego repozytorium. Obejmuje to zarówno prywatne pakiety npm, jak i publiczne pakiety, takie jak @uirouter.Jak zignorować pakiety węzłów node_modules/katalog podczas instalacji npm?

package.json:

{ 
     "name": "@private/a", 
     "version": "1.0.0", 
     "description": "", 
     "main": "dist/index.js", 
     "scripts": { 
     "test": "echo \"Error: no test specified\" && exit 1" 
     }, 
     "repository": { 
     "type": "git", 
     "url": "git+ssh://[email protected]/private/a.git" 
     }, 
     "author": "", 
     "license": "ISC", 
     "homepage": "https://bitbucket.org/private/a#readme", 
     "devDependencies": { 
     "gulp": "^3.9.1", 
     "gulp-angular-embed-templates": "^2.3.0", 
     "gulp-concat": "^2.6.1", 
     "gulp-jshint": "^2.0.4", 
     "gulp-rename": "^1.2.2", 
     "gulp-sass": "^3.0.0", 
     "gulp-uglify": "^2.0.0", 
     "jshint": "^2.9.4" 
     }, 
     "dependencies": { 
     "@private/b": "^1.0.0", 
     "@private/c": "^1.0.0" 
     } 
    } 

.npmignore

** 
!dist/** 

Pomimo tych dwóch plików Kiedy uruchamiam npm install @private/a --save w innym repozytorium jest instalowany wraz z uzależnienia wszystko to lunetą zależności:

/node_modules/@private/a/dist/index.js 
/node_modules/dist/css/styles.css 
/node_modules/@private/a/node_modules/@private/b 
/node_modules/@private/a/node_modules/@private/c 
package.json 

To powinno być tylko to:

/node_modules/@private/a/dist/index.js 
/node_modules/dist/css/styles.css 
package.json 

Jak mogę to osiągnąć? Próbowałem różnych odmian .npmignore, ale nie miałem szczęścia.

+0

Czy '@ prywatny/b' i' @ prywatny/c' są wymagane do uruchomienia pakietu '@ private/a'? – vsenko

+0

Czy są one wymagane tylko podczas rozwoju i budowania '@ private/a'? – vsenko

Odpowiedz

4

.npmignore jest nieistotny dla tego, co próbujesz zrobić. Ten plik decyduje tylko, które części twojego kodu paczki npm znajdą się w rejestrze npm. Więc działa jak w reklamie.

Twój problem musi znajdować się w twoim npmconfig lub z powodu użycia starszej wersji npm. Najnowsza wersja instaluje rzeczy w następujący sposób:

/node_modules/@private/a/dist/index.js 
/node_modules/@private/b/... 
/node_modules/@private/c/... 
package.json 

Sprawdziłem, czy dzieje się tak z najnowszym NPM. Ale był czas, kiedy npm zainstalował zależności w strukturze zagnieżdżonej. Zobacz this for example. Sugeruję więc:

  1. Upewnij się, że masz najnowszy węzeł i npm.
  2. Upewnienie się, że konfiguracja npm nie wymusza łączenia w starsze wersje. Uruchom npm get legacy-bundling. Upewnij się, że jest to fałsz.

Istnieje kilka przypadków, w których zagnieżdżanie zależności odbywa się zgodnie z prawem nawet z najnowszym NPM. Zobacz this. Ale zgaduję, że twój problem nie wynika z tego. Możesz przetestować, wykonując npm install @private/a w pustym folderze.

+0

To był problem, dzięki! Używałem wersji 3 npm, aw wersji 5 to już nie problem. – jrquick

2

Węzeł zainstaluje pliki pakietów wraz ze wszystkimi zależnościami zadeklarowanymi pod polem dependencies.

Sposób budowania drzewa zależności zależy od używanej wersji npm.

Jeśli twój pakiet nie potrzebuje tych zależności do uruchomienia, oznacza to, że są to po prostu zależności od deweloperów i możesz je bezpiecznie wymienić pod polem devDependencies.

Zależności deweloperów są instalowane tylko po uruchomieniu npm install w katalogu wtyczek.