Estoy tratando de obtener qué versión estoy creando en un script de preversión npm.

Como en:

{
    "scripts": {
        "preversion": "echo $version"
    }        
}

Pero no puedo encontrar qué escribir en lugar de $version.

Quiero obtener la versión que estoy creando cuando hago npm version <something>. Por ejemplo, si lo hago npm version 1.0.1, quiero obtener el 1.0.1. Pero si hago npm version minor cuando estoy en la versión 1.0.0, quiero obtener 1.1.0.

1
Magus 6 feb. 2020 a las 13:03

2 respuestas

La mejor respuesta

Redefina su script preversion de la siguiente manera:

"scripts": {
  "preversion": "echo $npm_package_version"
}

Explicación:

Esto accede al package.json vars. La variable npm_package_version es una de las muchas variables de entorno que crea npm.

En las plataformas * nix , npm ejecuta scripts package.json utilizando sh de forma predeterminada. Por lo tanto, hace referencia a las variables de entorno dentro de los scripts npm utilizando el prefijo $, es decir, $npm_package_version.

Sin embargo, en Windows, npm ejecuta scripts usando cmd por defecto. En ese caso, deberá hacer referencia a las variables de entorno dentro de los scripts npm utilizando la sintaxis %...%. Por ejemplo:

"preversion": "echo %npm_package_version%"

Si es necesario el soporte multiplataforma, puede evitar las diferencias en la sintaxis, es decir, el $ prefijo v's %...%, utilizando cross-var. En ese caso, deberá redefinir su script preversion de la siguiente manera:

"scripts": {
  "preversion": "cross-var echo $npm_package_version"
}

Sugerencia: si cd ingresa al directorio de su proyecto y ejecuta npm run env, enumerará todas las variables de entorno prefijadas npm_* que crea npm.

1
RobC 6 feb. 2020 a las 15:04

Del docs:

El orden exacto de ejecución es el siguiente:

[...]

  1. Ejecute el script preversion . Estas secuencias de comandos tienen acceso a la versión anterior en package.json.

Por lo tanto, no es posible obtener fácilmente la versión futura en el script preversion ya que se está ejecutando antes de que la versión realmente cambie. Podrías encontrar una solución hacky, por ejemplo así:

"preversion": "mkdir ../ver && node -e \"const p = require('./package.json'); delete p.scripts.preversion; require('fs').writeFileSync('../ver/package.json', JSON.stringify(p), 'utf8')\" && cd ../ver && npm version minor && node -e \"console.log('new version is gonna be',require('./package.json').version);\" && cd -"

Que básicamente copia el archivo package.json a otro directorio, ejecuta npm version minor e imprime la nueva versión. El problema está codificado npm version minor, que no le dará el resultado correcto cuando ejecuta, por ejemplo, npm version 1.0.1 y no hay forma de obtener el mismo comando que activó este script (al menos no sé de ninguna manera hacer eso) y ejecutarlo nuevamente antes de que termine.

No conozco tus requisitos, pero elegiría los scripts version o postversion para obtener fácilmente la nueva versión. O puede crear un script personalizado que haga lo mismo pero genere la nueva versión antes de que se inicien todos los scripts y se pueda acceder a la nueva versión.

0
Sebastian Kaczmarek 6 feb. 2020 a las 10:55