windows - que - package.json scripts




npm package.json bin no funcionará en Windows (2)

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?


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" "[email protected]"
  ret=$?
else 
  node  "$basedir/node_modules/myapp/bin/myapp" "[email protected]"
  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.


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.







bin