update - Práctica recomendada para actualizar el script npm `prepublish` para npm @>=4
package.json scripts (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 [email protected], `prepublish` scripts will run only for `npm publish`.
npm WARN prepublish-on-install (In [email protected] 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 [email protected]
, 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 [email protected]
, - 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 con[email protected]
instalado. Esto probablemente debería funcionar correctamente si[email protected]
está instalado (sin probar).En
[email protected]
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
[email protected]
, eliminando el|| npm run prepare
|| npm run prepare
parte de|| npm run prepare
haría que el script se detenga si se ejecuta en[email protected]
.
[email protected]
es lo que parece una construcción usando [email protected]
:
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 [email protected]>=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 [email protected]
disparando solo antes de publish
el [email protected]
.