Cómo configurar el shell para npm run-scripts en Windows

82

Estoy ejecutando npm en Windows y me gustaría usar y diseñar operaciones paralelas en los scripts de ejecución, pero ejecutar en paralelo en cmd es un poco complicado en mi archivo package.json que me gustaría escribir-

scripts: { "go": "cmd1 & cmd2"} 

pero npm ejecuta el script en cmd.exe que no sabe ; . Podría cambiar esto a scripts: { "go": "bats/bat1.bat")donde bat1.bat es un archivo cmd bat que usa la llamada al estilo de Windows o los comandos de inicio para ejecutar comandos en paralelo. que funciona pero me da un script que solo funciona en Windows.

Sería mucho más sencillo si pudiera hacer que npm ejecutara el script en un clon de bash o cygwin.

Lo intenté config: { "shell": "bash"} pero todavía funcionaba cmd.exe

¿Hay alguna forma de decirle a npm que ejecute scripts usando un shell específico (no cmd.exe)?

usuario2129444
fuente
¿No es [todavía] posible especificar un shell en package.json? Uso npm tanto para Windows como para scripting bash y no tengo forma de anular la configuración predeterminada de "shell" o "script-shell" para un package.json en particular
Corey Alix

Respuestas:

153

Desde npm 5.1

npm config set script-shell "C:\\Program Files (x86)\\git\\bin\\bash.exe"  

o (instalación de 64 bits)

npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"

Tenga en cuenta que debe tener instalado git para Windows .

Puede revertirlo ejecutando:

npm config delete script-shell
DuncanSungWKim
fuente
8
¡Esta debería ser la respuesta aceptada! Funciona en Windows 10 con Git Bash (código VS incluido).
Alex Vang
7
npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"es la respuesta a todos mis problemas al ejecutar scripts en paralelo en Windows 10 de 64 bits. @DuncanSungWKim 감사 합니다 para esto.
TaeKwonJoe
Gracias, tuve un problema con el inicio de npm que funcionaba en cmd pero no en bash y ejecuté el script que sugirió y funcionó. Después de dos días de buscar en Google para obtener una respuesta ... -_- Gracias por la ayuda
AlonSamuel
2
Si ya estoy en un shell de git bash y ejecuto npm run <scriptesta configuración, se genera una nueva ventana de git bash ejecutando el script. Esto no es lo que quiero. ¿Hay alguna forma de invocar simplemente el shell dentro del shell de llamada?
JHH
2
@JHH - También tuve shells abriéndose desde vscode porque estaba usando git-bash.exe en lugar de bash.exe. Cuando solucioné que vscode bash era el mismo que el script-shell bash, el problema se resolvió.
Corey Alix
28

He aquí una forma de hacerlo:

  1. Cree un script, como my_script.sh, en el directorio bin de su proyecto.
  2. En su archivo package.json, agregue una línea para ejecutar el script usando bash. Por ejemplo:

    "scripts": {
      "boogie": "bash bin/my_script.sh"
    }
    

Ahora puede ejecutar su script bash desde npm mediante:

    npm run-script boogie

No es muy elegante, pero funciona.

Si está desarrollando tanto en Windows como en Linux / Unix, al menos este enfoque es bastante portátil para ambos entornos.

Craig Johannsen
fuente
3
Otra opción: "scripts": { "start": "node ./bin/www", "bash": "bash -c", "ls": "npm run bash ls" }
cchamberlain
16

Idealmente, anular el parámetro de configuración de shell npm debería funcionar, pero npm (al menos la versión 1.4.14) parece en Windows ignorar la configuración y usar cmd.exe en su lugar.

Utilice el siguiente comando en su shell bash o Git Bash para averiguar la configuración del shell:

$ npm config ls -l | grep shell

Por defecto, la salida será:

shell = "C:\\WINDOWS\\system32\\cmd.exe"

Sin embargo, para anular el parámetro de shell predeterminado, puede agregar (o editar) un archivo npmrc al directorio \ Users \ yourusername \ AppData \ Roaming \ npm \ etc. Simplemente agregue la siguiente línea:

shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"

La ruta que utilice puede ser cualquier ruta válida a bash.exe. Ahora, si ejecuta el comando "npm config ls -l | grep shell" anterior, verá el siguiente resultado, que indica que el parámetro de shell ha sido anulado:

shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"
; shell = "C:\\WINDOWS\\system32\\cmd.exe" (overridden)

Quizás algún día, una nueva versión de npm prestará atención al parámetro de shell anulado.

Craig Johannsen
fuente
1
Ojalá esto funcionara. Cambié la variable de entorno COMSPEC y parece que se está extrayendo de eso, pero no pude hacer que funcione correctamente.
cchamberlain
4
Esto hace el mismo trabajo:$ npm config set shell "C:\\msys64\\usr\\bin\\bash"
kwarnke
Resolví mi problema siguiendo tu sugerencia. Ahora, puedo ejecutar scripts en npm que contienen más comandos separados por ;En Windows, en la carpeta C: \ Users \ username \ .npmrcshell = "C:\\Program Files\\Git\\bin\\bash.exe" script-shell = "C:\\Program Files\\Git\\bin\\bash.exe"
Agregué
2

simplemente usando la forma de ejecutar CMD .bat!

.json
"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "app": "cd build & browser-sync start --server --files 'index.html'",
    "bat": "start start-browser.bat",
    "starts": "start http://localhost:7777/datas/ && start http://localhost:7777/Info/"
},
.murciélago
start http://localhost:7777/datas/ && start http://localhost:7777/Info/
QWERTY
fuente
1

Utilice un módulo_nodo creado específicamente para este propósito. Sugiero con NPM-run-todo , pero los demás existe, como parallelshell .

A continuación, se muestra un ejemplo de Parallelshell para el reemplazo directo de su pregunta.

"scripts": {
    "parallelexample1": "parallelshell \"echo 1\" \"echo 2\" \"echo 3\""
},

siguiente comando:

npm run parallelexample1

funciona tanto en Windows como en Unix (Linux / MacOS).

Curiosamente, npm-run-all no admite comandos de shell; por lo tanto, debemos colocar todos los comandos de shell en secuencias de comandos separadas como se muestra a continuación.

"scripts": {
   "parallelexample2": "npm-run-all echo*",
    "echo1": "echo 1",
    "echo2": "echo 2",
    "echo3": "echo 3"
},

Siguiente comando:

npm run parallelexample2

funciona tanto en Windows como en Unix (Linux / MacOS).

Atilla Ozgur
fuente
gracias por el consejo para npm-run-all, también probé la --parallelopción
Brandon Søren Culley
1

En mi caso, solo necesitaba correr npm startdesde dentro de Bash. Corro y cmdluego abro bash corriendo "c:\Program Files\Git\bin\bash.exe". Bajo bash shell pude llamar npm buildy con npm startéxito.

Es posible que ya tenga bash si está utilizando Git. Si no es así, puede instalarlo .

Espero que esto pueda ahorrarle tiempo a alguien.

Mike Keskinov
fuente
No funciona con todos los scripts que funcionan en Linux, como por ejemplo tenerPORT=8000
shinzou
0

También puede usar powershell multiplataforma https://github.com/powershell/powershell#get-powershell para scripts npm.

Para configurar un solo proyecto, ejecute esto desde la carpeta raíz del proyecto:

npm config set script-shell pwsh --userconfig ./.npmrc

Para configurar globalmente para todos los proyectos de nodo:

npm config set script-shell pwsh [--global]
GorvGoyl
fuente