windows - meaning - package.json que es
npm package.json bin no funcionará en Windows (3)
Cada vez que intentaba hacer que mi aplicación se vincule, seguí encontrando problemas en Windows donde las secuencias de comandos generadas que se ejecutarían en la ruta intentarían ejecutar el archivo *.js
usando el ejecutable predeterminado de Windows (no sé qué haría eso ser). No estoy seguro de por qué. Creo que podría ser porque es un archivo JavaScript. Sin embargo, comparé las secuencias de comandos generadas con algunos de los otros módulos que tenía instalados, y descubrí que si hacía que el archivo bin
que hace referencia el package.json
actuara como si se ejecutara en una máquina *nix
, npm
automáticamente intente y agregue la llamada al nodo.
Por ejemplo:
Si mi package.json
ve así:
myapp / package.json
"name": "myapp",
"bin": {
"myapp": "./bin/myapp"
}
Mi archivo de bin referenciado se ve así:
myapp / bin / myapp
#!/usr/bin/env node
require("../server.js");
Los 2 archivos ejecutables generados que aparecen en %APPDATA%/npm
muestran de la siguiente manera ejecutando el comando npm link
desde dentro del directorio myapp
(que tendría package.json
en la raíz):
myapp
#!/bin/sh
basedir=`dirname "$0"`
case `uname` in
*CYGWIN*) basedir=`cygpath -w "$basedir"`;;
esac
if [ -x "$basedir/node" ]; then
"$basedir/node" "$basedir/node_modules/myapp/bin/myapp" "$@"
ret=$?
else
node "$basedir/node_modules/myapp/bin/myapp" "$@"
ret=$?
fi
exit $ret
myapp.cmd
@IF EXIST "%~dp0/node.exe" (
"%~dp0/node.exe" "%~dp0/node_modules/myapp/bin/myapp" %*
) ELSE (
node "%~dp0/node_modules/myapp/bin/myapp" %*
)
Tenga en cuenta que no necesité hacer explícitamente los 2 archivos anteriores, solo necesitaba que el archivo se ejecutara como el archivo bin
en el package.json
. npm
hizo la creación del archivo.
Finales de línea
Otra cosa para señalar que me encontré al usar este método, asegúrese de que las terminaciones de línea sean correctas. Noté que mi contenedor estaba cometiendo un error con: ": No existe ese archivo o directorio" cada vez que instalé en * máquinas nix porque había una línea incorrecta que terminaba. Gracias a View line-endings en un archivo de texto, por ejemplo, sobre cómo imprimir terminaciones de líneas visibles.
Por ejemplo, si ejecuta cat -e PATH_TO_BIN
y obtiene algo como esto:
#!/usr/bin/env node^M$
^M$
require("../index.js");^M$
Estás usando las terminaciones de línea incorrectas. Si obtienes algo como esto:
#!/usr/bin/env node$
$
require("../index.js");$
Esas deberían ser las terminaciones de línea correctas.
Estoy intentando iniciar mi herramienta cli a través de la propiedad package.json bin
.
Tengo lo siguiente:
...
"name": "mycli",
"bin": "./bin/mycli",
...
Cuando abro el cmd en la ruta del paquete y escribo: "mycli" dice que el comando no es reconocido.
¿Debo ejecutar un comando npm? o usar la propiedad scripts? ¿Estoy tratando de acceder a la propiedad bin incorrectamente?
Intente especificar el nombre de su herramienta cli
en la propiedad bin
, como:
"bin": {
"mycli": "./bin/mycli" // or "/bin/mycli.js" if it''s a .js file
}
A continuación, ejecute el npm link
, desde el interior de la carpeta del proyecto, para crear un enlace simbólico global a la carpeta actual.
No olvide agregar la "preferGlobal": "true"
justo antes de la propiedad bin
en su archivo package.json
, para advertir a los usuarios que instalen su módulo globalmente.
La respuesta de Rodrigo Medeiros funciona para mí, pero solo si también tengo la línea shebang en el archivo .js.
Ahí tuve otro problema. Tengo node.js instalado en c: / Archivos de programa / nodejs, y esta era mi línea shebang:
#!c:/program files/nodejs/node
Esto no funcionó, porque el espacio en blanco. Esta fue la correcta:
#!c:/progra~1/nodejs/node