Ausführen von Bash-Skripten mit npm

76

Ich möchte versuchen, mit npm meine verschiedenen Build-Aufgaben für eine Webanwendung auszuführen. Ich weiß, dass ich dies tun kann, indem ich scriptsmeinem package.jsonLike ein Feld hinzufüge :

"scripts": {
   "build": "some build command"
},

Dies wird unhandlich, wenn Sie komplexere Befehle mit einer Reihe von Optionen haben. Ist es möglich, diese Befehle in ein Bash-Skript oder etwas in diese Richtung zu verschieben? Etwas wie:

"scripts": {
   "build": "build.sh"
},

Wo npm run buildwürden die Befehle in der build.shDatei ausgeführt?

Beim Lesen dieses Beitrags scheint es so zu sein, aber ich weiß nicht genau, wo ich meine build.shDatei ablegen soll oder ob mir etwas fehlt.

Mark McKelvy
quelle
17
Tu das nicht. Knoten läuft überall. Bash nicht. Was auch immer Sie in Bash tun , Sie können es in Node tun , und sogar der CLI-Aufruf kann mithilfe von Paketabhängigkeiten erfolgen. Benötigen rm? installiere rimraf und verwende es dann in einem npm-Skript . mkdir -p? installiere mkdirpund verwende das dann in einem npm-Skript. Sie haben eine plattformunabhängige universelle Skriptsprache , genau dort. Tun Sie dann nicht so, als wäre es nur Nix. Wird die Kommandozeile zu kompliziert? Verwenden Sie einen Task Runner wie gruntoder gulp. Halte es universell.
Mike 'Pomax' Kamermans
1
Wenn Sie sagen , „auch CLI - Aufruf kann mit Paketabhängigkeiten durchgeführt werden“ reden Sie so etwas wie dies ?
Mark McKelvy
Schließen, aber nein, lesen Sie die Folien, mit denen ich verlinkt habe. Sie können Knotenmodule installieren, die mit CLI-Tools wie gruntoder gulpoder mkdirpusw. geliefert werden, ohne dass Benutzer sie global installieren müssen, und sie dann so aufrufen, als wären sie global in einem npm-Skript installiert , wie z "build": "mkdirp build && less style/index.less > static/css/style.css && webpack". Solange die von Ihnen aufgerufenen Befehle von npm verwaltet werden (dh in den Abhängigkeitslisten package.json), funktioniert dies nur. Verwenden Sie für jeden Befehl "Dies funktioniert nur für ein Betriebssystem" ein Knotenmodul, das universell dasselbe tut.
Mike 'Pomax' Kamermans
9
Die obigen Kommentare sagen aus gutem Grund Nein, Portabilität. Aber es hängt von Ihrem Publikum ab. Wenn es sich um ein internes Projekt handelt und Ihre Entwickler UNIX-ähnliche Varianten (Linux / Macs usw.) verwenden, ist dies vollkommen in Ordnung. Wenn Sie eine Allzweckbibliothek erstellen, ist dies wahrscheinlich nicht der Fall. Die Verwendung von BASH / SH bietet verschiedene Vorteile. Sie können einige Dinge in einer Zeile erreichen, für die Seiten von Grunt / Gulp erforderlich sind, aber dann Sie Wahrscheinlich werden Windows-Benutzer ausgeschlossen, was möglicherweise ein Problem darstellt oder nicht.
Forbesmyester
2
Warum ist rimraf für eine Webanwendung besser als rm -rf? rimraf muss eine Datei nach der anderen erledigen und nur mehr Pakete, die Sie nicht benötigen. Wenn ein Webserver kein Bash hat, können Sie del verwenden, aber es hat wahrscheinlich Bash, wenn der Benutzer sowieso mit Node entwickelt und nicht .net oder so. Selbst wenn es .net ist, hat es wahrscheinlich immer noch irgendeine Form von Gitbash oder so.
Chris Wood

Antworten:

122

Es ist absolut möglich ...

"scripts": {
   "build": "./build.sh"
},

Stellen Sie außerdem sicher, dass Sie einen Hash-Knall oben in Ihre Bash-Datei einfügen #!/usr/bin/env bash

Stellen Sie außerdem sicher, dass Sie über Berechtigungen zum Ausführen der Datei verfügen

chmod +x ./build.sh

Schließlich wäre der Befehl zum Ausführen von build in npm

npm run build
eblahm
quelle
2
Sie können es platzieren, wo immer Sie wollen, stellen Sie einfach sicher, dass Sie den relativen Pfad in package.json setzen, zB"build": ". ./path/to/my/awesome/build/file/build.sh"
eblahm
1
es wird das Skript in dem aktuell Shell superuser.com/questions/46139/what-does-source-do
eblahm
9
Was ist mit Windows?
Lajos Meszaros
9
Unter Windows gitbash: '.' is not recognized as an internal or external command, operable program or batch file.Siehe hier für weitere Details zu erklären , warum. Wenn Sie außerdem festlegen, dass sh-Dateien standardmäßig mit gitbash oder einer anderen Umgebung geöffnet werden, in der Bash-Skripte ausgeführt werden können, funktioniert dies.
Cjsimon
13
In Windows Bash funktionierte folgendes npm Skript für mich:"name": "bash ./name.sh"
Rashomon
3

Noch einfacher:

Ich mache dies routinemäßig für einmalige und PoCs ohne VCS

package.json
{
    "scripts": {
        "ship": "rsync -avz deployable/* <some-server>:/var/www/some-site/sub-dir/"
    },
}
...
CNSKnight
quelle