2014-04-15 10 views
21

Mam moduł npm z następujących package.jsonNPM postinstall tylko na rozwój

{ 
    "name": "my-app", 
    "version": "0.0.0", 
    "scripts": { 
    "prepublish": "bower install", 
    "build": "gulp" 
    }, 
    "dependencies": { 
    "express": "~4.0.0", 
    "body-parser": "~1.0.1" 
    }, 
    "devDependencies": { 
    "gulp": "~3.6.0", 
    "bower": "~1.3.2" 
    } 
} 

Kiedy wdrożyć mojej aplikacji do produkcji nie chcę zainstalować devDependecies tak, biegnę npm install --production. Ale w tym przypadku wywoływany jest skrypt prepublish, ale nie jest potrzebny, ponieważ korzystam z linków CDN podczas produkcji.

Jak wywołać skrypt po instalacji tylko po npm install, ale nie po npm install --production?

Odpowiedz

13

Myślę, że nie można wybrać, które skrypty są uruchamiane w oparciu o argument --production. Możesz jednak dostarczyć skrypt, który testuje zmienną NODE_ENV i uruchamia tylko bower install, jeśli nie jest "produkcją".

Jeśli jesteś zawsze w środowisku UNIX-y, można zrobić to tak:

{ 
    scripts: { 
    "prepublish": "[ \"$NODE_ENV\" != production ] && bower install" 
    } 
} 
+0

miłą odpowiedź! co, jeśli chcę dołączyć środowisko "beta"? jak mogę dodać warunek "produkcja OR beta"? – maephisto

+0

Potem zaczyna się komplikować - ale możesz zrobić '" [\ "$ NODE_ENV \" = produkcja] || [\ "$ NODE_ENV \" = beta] || instalacja bower "' –

+2

Mój NPM nie działa, jeśli Mam ten skrypt i uruchamiam go w trybie produkcyjnym, ponieważ zwraca niezerowy kod wyjścia. Działa z: '[\" $ npm_config_production \ "] && exit 0; bower install' lub '[\" $ NODE_ENV \ "== production] && exit 0; altana zainstalować ' – Tim

10

Działa to tylko jeśli jesteś na uniksopodobnego środowiska:

NPM ustawia zmienna środowiskowa na "true", gdy instalacja jest uruchamiana z --produkcja. Aby uruchomić skrypt poinstalacyjny tylko wtedy, gdy instalacja npm nie była uruchomiona z --production, użyj następującego kodu.

"postinstall": "if [ -z \"$npm_config_production\" ]; then node_modules/gulp/bin/gulp.js first-run; fi", 
+2

Dzięki! Użyłem rewersu do budowania zasobów tylko na Heroku wdraża: '" postinstall ":" if [-n \ "$ npm_config_production \"], następnie npm uruchom build-for-production; fi "' –

4

Rozwiązanie to jest mniej zależne na Unix natury swojej powłoce:

"scripts": { 
    "postinstall": "node -e \"process.env.NODE_ENV != 'production' && process.exit(1)\" || echo do dev stuff" 
    }, 
+1

Nie powiedzie się, kiedy dodaję ten moduł do innego modułu jako zależności i spróbuj 'npm install' obejmującego. Modyfikowanie zwracanej wartości łańcucha poleceń naprawia to dla mnie: '" (node ​​-e \ "process.env.NODE_ENV! == 'production' && process.exit() \" && grunt devTask) || węzeł -v " ' – mucaho

6

Pracuję z Windows, OSX i Linux więc używam rozwiązanie konkretnego poza środowiskiem, aby rozwiązać ten problem:

W postinstalatorze po instalacji wykonaj skrypt js, który sprawdza zmienną process.env.NODE_ENV i wykonuje pracę.

w moim konkretnym przypadku muszę wykonać zadanie haustem tylko w env rozwój:

część package.json

"scripts": { 
    "postinstall": "node postinstall" 
} 

wszystko postinstall.js skryptu

if (process.env.NODE_ENV === 'development') { 
    const gulp = require('./gulpfile'); 
    gulp.start('taskname'); 
} 

ostatni wiersz gulpfile.js

module.exports = gulp; 

ważne jest, aby eksportować łyk z pliku gulpfile.js, ponieważ wszystkie zadania są w tej konkretnej instancji dławiącej.

0

Używam modułu if-env. Jest mniej gadatliwy.

PS: Nie testowałem jeszcze na windowsach.

Instalacja z:

npm i if-env 

niż w package.json skryptów:

"postinstall-production": "echo \"production, skipping...\"", 
"postinstall-dev": "echo \"doing dev exclusive stuff\"", 
"postinstall": "if-env NODE_ENV=production && npm run postinstall-production || npm run postinstall-dev"