npm - scripts - package.json que es
Práctica recomendada para actualizar el script npm `prepublish` para npm @>=4 (2)
npm install
desde la carpeta raíz de mi proyecto de muestra para compilarlo usando scripts en package.json
.
La compilación requiere unos pocos pasos de transpilación actualmente en el script de prepublish
, pero npm versión 4 muestra una advertencia de que se avecina un cambio importante, lo que me lleva a creer que el nuevo script de prepare
eventos de compilación es una prueba más a futuro.
C:/code/antlr4ts-json>npm install
npm WARN prepublish-on-install As of npm@5, `prepublish` scripts will run only for `npm publish`.
npm WARN prepublish-on-install (In npm@4 and previous versions, it also runs for `npm install`.)
npm WARN prepublish-on-install See the deprecation note in `npm help scripts` for more information.
...
Desafortunadamente, simplemente moviendo el script de prepublish
para prepare
saltos de compatibilidad con versiones anteriores: si alguien ejecuta npm install
usando npm@3
, los pasos de compilación en prepare
se ignoran silenciosamente.
¿Cuál es la mejor práctica para actualizar mi script de compilación? Idealmente, me gustaría actualizar mi package.json
para que la npm install
funcione para cualquier npm @> = 3 , pero alternativamente, genere un mensaje de error claro que indique que npm @> = 4 se requiere cuando la npm install
se ejecuta usando npm @ 3 sería perfectamente aceptable.
Bakground: traté de incluir
"engines": { "npm": ">=4.0.0" },
Gracias a @toomuchdesign (y otros), entiendo por qué esto no hace lo que quiero; engines
solo comprueban cuando mi paquete se instala como una dependencia , no alguien lo construye a partir de fuentes . Eso tiene sentido.
Realicé un seguimiento de los antecedentes de este cambio planificado hasta el problema npm # 10074 , lo que explica por qué se necesita un cambio importante. Sin embargo, todavía no tengo claro cómo manejar mejor la transición.
Encontré una mejor solución usando check-node-version
; ese paquete tiene una interfaz de línea de comandos, lo que facilita su uso para este propósito. Estos son los pasos que propondría como una mejor práctica:
- Agregue una dependencia de desarrollo con
npm install -D check-node-version@1
, - Cambie el nombre de la secuencia de comandos de
prepublish
existente paraprepare
, - Agregue un script de
prepublish
reemplazo para manejar la compatibilidad con versiones anteriores, y sugiera actualizar npm (vea a continuación)
Mi package.json ahora se ve algo como esto:
"scripts": {
"prepare": "npm run antlr4 && tsc",
"prepublish": "check-node-version --npm /">=4/" || npm run prepare",
"antlr4": "rimraf gen && antlr4ts Json.g4 -o gen -visitor",
...
},
"devDependencies": {
"check-node-version": "^1.1.2",
...
Con este enfoque:
npm install
siempre ejecuta el script deprepare
, incluso connpm@3
instalado. Esto probablemente debería funcionar correctamente sinpm@5
está instalado (sin probar).En
npm@3
incluso hay un mensaje útil sobre la actualización de npm, pero debido a que el script usa|| npm run prepare
|| npm run prepare
para simular el comportamiento de versiones posteriores, el script continúa después del error.Si luego quiero tomar una fuerte dependencia en
npm@4
, eliminando el|| npm run prepare
|| npm run prepare
parte de|| npm run prepare
haría que el script se detenga si se ejecuta ennpm@3
.
npm@3
es lo que parece una construcción usando npm@3
:
C:/code/antlr4ts-json>npm i
> [email protected] prepublish C:/code/antlr4ts-json
> check-node-version --npm ">=4" || npm run prepare
node: v6.9.1
npm: v3.10.10
Error: Wanted npm version ">=4" (>=4.0.0)
To install npm, run `npm install -g npm@>=4`
> [email protected] prepare C:/code/antlr4ts-json
> npm run antlr4 && tsc
Los documentos de NPM indican que el campo de los engines
emite un error solo cuando su paquete se instala como una dependencia:
A menos que el usuario haya establecido el indicador de configuración
engine-strict
delengine-strict
, el campo [motores] solo es aconsejable producirá advertencias cuando su paquete se instale como una dependencia.
Como desarrollador / mantenedor del proyecto, no debería ver ninguna alerta proveniente de su campo de engines
.
Ya que necesita compilar sus archivos cuando solo ejecuta la npm install
, simplemente puede usar el postinstall
.
También tenga en cuenta que la prepublish
está para quedarse, solo cambiará su comportamiento en npm@5
disparando solo antes de publish
el npm@5
.