2014-11-22 34 views
25

Zwykle uruchamiam haul przez npm, np. w moim package.jsonAutomatyczne uruchamianie zadań dławiących za pośrednictwem npm

"scripts": { 
    "test": "gulp test", 
    "minify": "gulp minify" 
} 

Wtedy mogę uruchomić komendę taką jak

npm run minify 

Który jest w porządku, ale za każdym razem mam nowe zadania w moim gulpfile, muszę dodać je do pakietu .json w sekcji skryptów, czy istnieje lepszy sposób na zrobienie tego?

Powód: ja tylko zainstalować KMP globalnie do moich path więc wszystkie inne moduły nie będą zanieczyszczać moich path, więc trzeba je uruchomić poprzez npm skryptów

+0

Więc dlaczego używasz 'npm run' zamiast normalny sposób ? Ta informacja może pomóc ci dowiedzieć się, co naprawdę próbujesz osiągnąć –

+0

Instaluję npm globalnie, więc npm jest na mojej ścieżce, nie chcę, żeby łyk zanieczyszczał moją ścieżkę, więc uruchamiam łyk przez npm. – Howard

Odpowiedz

28

Czy mam przyjemność dla Ciebie: I poszedł do przodu i stworzyłem prosty moduł npm do obsługi tego.

gulp-npm-script-sync

Oto sedno nim:

var file = fs.readFileSync(config.path || 'package.json', 'utf-8'); 
    var pkg = JSON.parse(file); 
    var tasks = gulp.tasks; 

    pkg.scripts = pkg.scripts || {}; 

    Object.keys(tasks).forEach(function (t) { 
    pkg.scripts[t] = 'gulp '+tasks[t].name; 
    }); 

full source robi rzeczy, jak napisać package.json powrotem z tego samego wcięcia i rzeczy.

Więc tak śmiało: npm install --save-dev gulp-npm-script-sync

stick to w gulpfile:

var gulp = require('gulp'); 
var sync = require('gulp-npm-script-sync'); 

// your gulpfile contents 

sync(gulp); 

każdym razem zaktualizować gulpfile z nowym zadaniem będzie aktualizacji package.json.

Można nawet rzucać go wewnątrz zadania haustem:

gulp.task('sync', function() { 
    sync(gulp); 
} 
+0

Dobrze, dziękuję, to jest przydatne. – Howard

+2

Myślę, że odpowiedź poniżej podana przez Romana jest bardziej elegancka, a ty dostaniesz mniej zależnej od dev. –

+0

Zgadzam się. Używam na przykład 'npm run webpack - --watch' lub' npm run webpack - -d'. –

20

Brian Brennan dał a fantastic suggestion: dodawanie ./node_modules/.bin do zmiennej $PATH. Następnie można uruchamiać zainstalowane lokalnie zainstalowane narzędzia, o ile znajdujesz się w głównym katalogu projektu .

Źródło: Keeping clean.

Nie trzeba instalować pakietu globalnie, aby móc go łatwo wywołać. Pamiętaj tylko, że powyższa ścieżka powinna być przedimowana.


Alternatywnie, od wersji 2.0.0, npm zapewnia zdolność do podejmowania dodatkowych parametrów do naszych wykonywania poleceń. Te argumenty zostaną po prostu dołączone do polecenia skryptu.

W twoim przypadku, następujący skrypt z package.json:

"scripts": { 
    "gulp": "gulp" 
}, 

mogą być powoływane jako npm run gulp -- test lub npm run gulp -- minify itp

+0

Wskazówka dla tych, którzy zmagają się z instalacją 'npm @ 2.0.0' w systemie Windows: uruchom' npm update npm' z folderu node.js (np. 'C: \ Program Files (x86) \ nodejs'). To prawdopodobnie wymaga uprawnień administratora. –

+1

Piękno definiowania skryptów w manifeście polega na tym, że tworzy się ogólne api. 'npm run build' może wyzwalać haust lub pomruk lub cokolwiek innego. Możesz zmienić implementację w miarę rozwoju projektu. Interfejs pozostaje ten sam i pozostanie działa. W tym przypadku nie musisz dodawać niczego do $ PATH, ponieważ możesz po prostu zrobić: '" skrypty ": {" build ":" ./node_modules/.bin/gulp build "}'. –

+0

@Jasper Tak, dodatkowe poziomy pośrednictwa mogą zapewnić korzyści. Zwykle jednak nie ma potrzeby zastępowania systemu kompilacji, a także wszelkie koszty pośrednie. Osobiście wolę wywoływać interfejs 'gulp' bezpośrednio, gdy jest on używany w projekcie, nie łącząc go z niczym innym ani nie wprowadzając interfejsu do ukrycia innego interfejsu. To samo dotyczy "gruntów" i "npm". Ponadto, nie podoba mi się druga opcja w mojej odpowiedzi, jest dołączona tylko do udostępniania informacji. Jeśli chodzi o pierwszą opcję, pozwala mi to uniknąć instalowania pakietów na całym świecie, w elegancki i bardzo solidny sposób. –

Powiązane problemy