node.js - scripts - ¿Hay alguna manera de obtener la versión de package.json en el código de nodejs?
package.json scripts (15)
Las respuestas correctas estarán aquí en el ejemplo:
Respuesta (este código incluye el archivo
package.json
y obtiene la versión)const { version } = require(''./package.json'');
Responder
const version = process.env.npm_package_version
No use JSON.parse
, fs.readFile
, fs.readFileSync
y no use otros npm modules
No es necesario para esta pregunta.
¿Hay alguna manera de obtener la versión establecida en package.json
en una aplicación de nodejs? Me gustaría algo como esto
var port = process.env.PORT || 3000
app.listen port
console.log "Express server listening on port %d in %s mode %s", app.address().port, app.settings.env, app.VERSION
¿Por qué no usar la forma nativa? Los otros métodos han fallado para mí.
// Load native UI library
var gui = require(''nw.gui'');
// Get the name field in manifest
gui.App.manifest.version
Aquí es cómo leer la versión de package.json:
fs = require(''fs'')
json = JSON.parse(fs.readFileSync(''package.json'', ''utf8''))
version = json.version
Encontré que el siguiente fragmento de código funcionó mejor para mí. Ya que usa ''require'' para cargar el package.json, funciona independientemente del directorio de trabajo actual.
var pjson = require(''./package.json'');
console.log(pjson.version);
Una advertencia, cortesía de @Pathogen:
Hacer esto con browserify tiene implicaciones de seguridad.
Tenga cuidado de no exponer su package.json al cliente, ya que significa que todos sus números de versión de dependencia, comandos de compilación y prueba y más se envían al cliente.
Si está creando un servidor y un cliente en el mismo proyecto, también expone sus números de versión del lado del servidor.
Un atacante puede utilizar dichos datos específicos para adaptarse mejor al ataque de su servidor.
Hago esto con findup-sync
:
var findup = require(''findup-sync'');
var packagejson = require(findup(''package.json''));
console.log(packagejson.version); // => ''0.0.1''
Hay otra forma de obtener cierta información de su archivo package.json
, a saber, utilizando el módulo pkginfo .
El uso de este módulo es muy simple. Puedes obtener todas las variables del paquete usando:
require(''pkginfo'')(module);
O solo ciertos detalles ( version
en este caso)
require(''pkginfo'')(module, ''version'');
Y las variables de su paquete se establecerán en module.exports
(de modo que se podrá acceder al número de versión a través de module.exports.version
).
Podría usar el siguiente fragmento de código:
require(''pkginfo'')(module, ''version'');
console.log "Express server listening on port %d in %s mode %s", app.address().port, app.settings.env, module.exports.version
Este módulo tiene una muy buena característica: se puede usar en cualquier archivo de su proyecto (por ejemplo, en subcarpetas) y automáticamente obtendrá información de su package.json
. Por lo que no tiene que preocuparse de dónde está package.json
.
Espero que le ayudará.
Hice un código útil para obtener el package.json del módulo padre.
function loadParentPackageJson() {
if (!module.parent || !module.parent.filename) return null
let dir = path.dirname(module.parent.filename)
let maxDepth = 5
let packageJson = null
while (maxDepth > 0) {
const packageJsonPath = `${dir}/package.json`
const exists = existsSync(packageJsonPath)
if (exists) {
packageJson = require(packageJsonPath)
break
}
dir = path.resolve(dir, ''../'')
maxDepth--
}
return packageJson
}
Importe su archivo package.json
en su server.js
o app.js
y luego acceda a las propiedades de package.json en el archivo del servidor.
var package = require(''./package.json'');
La variable de paquete contiene todos los datos en package.json.
O en la cáscara vieja:
node -e "console.log(require(''./package.json'').version);"
Esto se puede reducir a
node -p "require(''./package.json'').version"
Aunque esto no es exactamente lo que se hizo la pregunta, es útil si desea usar la versión dentro de package.json
, por ejemplo, para iniciar sesión en un archivo versionado en un script
:
{
"name": "myapp",
"version": "0.1.2",
"scripts": {
"run": "node index.js 2>&1 | tee -a myapp_v$(node -p /"require(''./package.json'').version/").log",
...
}
Para aquellos que buscan una solución segura del lado del cliente que también funcione en el lado del servidor, existe la genversion . Es una herramienta de línea de comandos que lee la versión del package.json más cercano y genera un archivo de módulo CommonJS importable que exporta la versión. Descargo de responsabilidad: soy un mantenedor.
$ genversion lib/version.js
Reconozco que la seguridad del lado del cliente no fue la intención principal de OP, pero como comenté en las respuestas de Mark Wallace y aug , es muy relevante y también es la razón por la que encontré estas preguntas y respuestas.
Puedes usar el paquete de la project-version del project-version .
$ npm install --save project-version
Entonces
const version = require(''project-version'');
console.log(version);
//=> ''1.0.0''
Utiliza process.env.npm_package_version
pero el respaldo en la versión escrita en package.json
en caso de que falte la var. Env por alguna razón.
Sé que esta no es la intención del OP, pero solo tuve que hacer esto, así que espero que ayude a la siguiente persona.
Si está utilizando Docker-Compose para su proceso de CI / CD, ¡puede obtenerlo de esta manera!
version:
image: node:7-alpine
volumes:
- .:/usr/src/service/
working_dir: /usr/src/service/
command: ash -c "node -p /"require(''./package.json'').version.replace(''/n'', '''')/""
Para la imagen, puede utilizar cualquier imagen de nodo. Uso alpino porque es el más pequeño.
Si su aplicación se inicia con ''npm start'', simplemente puede usar:
process.env.npm_package_version
Ver package.json vars para más detalles.
Solo agregué una respuesta porque vine a esta pregunta para ver la mejor manera de incluir la versión de package.json en mi aplicación web.
Sé que esta pregunta está dirigida a Node.js, sin embargo, si está usando Webpack para empaquetar su aplicación, solo un recordatorio, la forma recomendada es usar DefinePlugin para declarar una versión global en la configuración y referencia. Para que puedas hacer en tu webpack.config.json
const pkg = require(''../../package.json'');
...
plugins : [
new webpack.DefinePlugin({
AppVersion: JSON.stringify(pkg.version),
...
Y luego, AppVersion
es ahora un global que está disponible para que lo uses. También asegúrese de que en su .eslintrc
ignore esto a través de los apoyos globales.
Usando módulos ES6 puedes hacer lo siguiente:
import {version} from ''./package.json'';