Nuestro equipo ha construido una pequeña CLI utilizada para el mantenimiento. El paquete.json especifica una ruta con la propiedad bin , y todo funciona muy bien; "bin": { "eddy": "./dist/src/cli/entry.js"}
El autocompletado se logra usando yargs@17.0.1 . Sin embargo , recientemente convertimos el proyecto para usar módulos es6, debido a una migración a Sveltekit, es decir, el paquete.json ahora contiene el type: module . Debido a esto, la CLI ahora solo funciona si ejecutamos con:
que funciona
node --experimental-specifier-resolution=node ./dist/src/cli/entry.js helpSin embargo, si ejecutamos esto sin la bandera, obtenemos un error "módulo no encontrado":
Error [ERR_MODULE_NOT_FOUND]: Cannot find module...entonces la pregunta es
¿Podemos de alguna manera agregar "siempre" el experimental-specifier-resolution=node a la CLI, para que podamos continuar usando la abreviatura eddy y utilizar la finalización automática?
Hay dos soluciones probables aquí.
Su archivo entry.js debe comenzar con un shebang como #!/usr/bin/env node . No puede especificar la bandera directamente aquí, sin embargo, si pudiera proporcionar la ruta absoluta al nodo directamente en el shebang, puede especificar la bandera.
Suponiendo que tiene un nodo instalado en /usr/bin/node , puede escribir el shebang en entry.js como:
#!/usr/bin/node --experimental-specifier-resolution=node (Use which node para encontrar la ruta absoluta)
Sin embargo, esta no es una solución muy portátil. No siempre puede asumir que todos tienen un nodo instalado en la misma ruta. Además, algunos pueden usar nvm para administrar versiones y pueden tener varias versiones en diferentes rutas. Esta es la razón por la que usamos /usr/bin/env para encontrar la instalación del nodo requerido en primer lugar. Esto lleva a la segunda solución.
Puede crear un script de shell que llamaría internamente al punto de entrada de cli con las banderas requeridas. Este script de shell se puede especificar en la sección bin de package.json .
El script de shell ( entry.sh ) debería verse así:
#!/usr/bin/env bash /usr/bin/env node --experimental-specifier-resolution=node ./entry.js "$@" Luego, en su package.json , reemplace bin con:
"bin": { "eddy": "./dist/src/cli/entry.sh"} Entonces, cuando ejecute eddy , ejecutará entry.js usando el node con el indicador requerido. El "$@" en el comando será reemplazado por cualquier argumento que le pases a eddy .
Así que eddy help de Eddy se traducirá a /usr/bin/env node --experimental-specifier-resolution=node ./entry.js help
Simplemente agregue un script a su paquete.json:
Suponiendo que index.js es su punto de entrada y package.json está en el mismo directorio
{ "scripts": { "start": "node --experimental-specifier-resolution=node index.js" } }Entonces puedes ejecutar en tu consola:
npm start