update scripts que example npm npm-install

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:

  1. Agregue una dependencia de desarrollo con npm install -D check-node-version@1 ,
  2. Cambie el nombre de la secuencia de comandos de prepublish existente para prepare ,
  3. 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 de prepare , incluso con npm@3 instalado. Esto probablemente debería funcionar correctamente si npm@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 en npm@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 del engine-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 .