Est-il possible d’obtenir la version de package.json dans le code nodejs?

Est-il possible d’obtenir la version définie dans package.json dans une application nodejs? Je voudrais quelque chose comme ça

 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 

J’ai trouvé que le fragment de code suivant fonctionnait le mieux pour moi. Comme il utilise ‘require’ pour charger le package.json, il fonctionne indépendamment du répertoire de travail en cours.

 var pjson = require('./package.json'); console.log(pjson.version); 

Un avertissement, gracieuseté de @Pathogen:

Faire ceci avec browserify a des implications de sécurité.
Veillez à ne pas exposer votre package.json au client, car cela signifie que tous vos numéros de version de dépendance, vos commandes de génération et de test, etc., sont envoyés au client.
Si vous créez un serveur et un client dans le même projet, vous exposez également vos numéros de version côté serveur.
De telles données spécifiques peuvent être utilisées par un attaquant pour mieux s’adapter à l’attaque de votre serveur.

Si votre application est lancée avec «npm start», vous pouvez simplement utiliser:

 process.env.npm_package_version 

Voir package.json vars pour plus de détails.

A l’aide des modules ES6, vous pouvez effectuer les opérations suivantes:

 import {version} from './package.json'; 

Ou dans la vieille coquille:

 node -e "console.log(require('./package.json').version);" 

Cela peut être raccourci à

 node -p "require('./package.json').version" 

Même si ce n’est pas exactement ce que la question posait, c’est utile si vous souhaitez utiliser la version de package.json elle-même, par exemple pour vous connecter à un fichier versionné dans 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", ... } 

Voici comment lire la version de package.json:

 fs = require('fs') json = JSON.parse(fs.readFileSync('package.json', 'utf8')) version = json.version 

Il existe un autre moyen de récupérer certaines informations de votre fichier package.json , à savoir en utilisant le module pkginfo .

L’utilisation de ce module est très simple. Vous pouvez obtenir toutes les variables de package en utilisant:

 require('pkginfo')(module); 

Ou seulement certains détails ( version dans ce cas)

 require('pkginfo')(module, 'version'); 

Et vos variables de package seront définies sur module.exports (le numéro de version sera donc accessible via module.exports.version ).

Vous pouvez utiliser l’extrait de code suivant:

 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 

Ce module a une fonctionnalité très intéressante – il peut être utilisé dans n’importe quel fichier de votre projet (par exemple dans les sous-dossiers) et il récupérera automatiquement les informations de votre package.json . Donc, vous n’avez pas à vous inquiéter de savoir où est votre package.json .

J’espère que cela aidera.

Les bonnes réponses seront ici dans l’exemple:

  1. Réponse (ce code inclut le fichier package.json et la version get)

    const { version } = require('./package.json');


  1. Répondre

    const version = process.env.npm_package_version


S’il vous plaît ne pas utiliser JSON.parse , fs.readFile , fs.readFileSync et n’utilisez pas d’autres npm modules ce n’est pas nécessaire pour cette question.

Il suffit d’append une réponse parce que je suis venu à cette question pour voir la meilleure façon d’inclure la version de package.json dans mon application Web.

Je sais que cette question est ciblée pour Node.js. Cependant, si vous utilisez Webpack pour regrouper votre application, il est recommandé d’utiliser le DefinePlugin pour déclarer une version globale dans la configuration et la référence. Donc, vous pourriez faire dans votre webpack.config.json

 const pkg = require('../../package.json'); ... plugins : [ new webpack.DefinePlugin({ AppVersion: JSON.ssortingngify(pkg.version), ... 

Et puis AppVersion est maintenant un global qui est disponible pour vous. Assurez-vous également que dans votre .eslintrc vous ignorez ceci via le prop global.

Pour ceux qui recherchent une solution sécurisée côté client qui fonctionne également côté serveur, il existe une solution générique . C’est un outil de ligne de commande qui lit la version du package.json le plus proche et génère un fichier de module CommonJS importable qui exporte la version. Disclaimer: Je suis un mainteneur.

 $ genversion lib/version.js 

Je reconnais que la sécurité côté client n’était pas la principale intention d’OP, mais comme cela a été discuté dans les réponses de Mark Wallace et d’ aug , c’est très pertinent et c’est la raison pour laquelle j’ai trouvé cette question.

Vous pouvez utiliser le package version-projet .

 $ npm install --save project-version 

alors

 const version = require('project-version'); console.log(version); //=> '1.0.0' 

Il utilise process.env.npm_package_version mais utilise la version écrite dans le package.json au cas où env var serait manquant pour une raison quelconque.

Je le fais avec findup-sync :

 var findup = require('findup-sync'); var packagejson = require(findup('package.json')); console.log(packagejson.version); // => '0.0.1' 

Je sais que ce n’est pas l’intention de l’OP, mais je devais le faire, alors j’espère que cela aidera la prochaine personne.

Si vous utilisez docker-compose pour votre processus CI / CD, vous pouvez l’obtenir de cette façon!

 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', '')\"" 

pour l’image, vous pouvez utiliser n’importe quelle image de nœud. J’utilise l’alpin parce que c’est le plus petit.

Importez votre fichier package.json dans votre fichier server.js ou app.js , puis accédez aux propriétés du package.json dans le fichier du serveur.

 var package = require('./package.json'); 

La variable package contient toutes les données de package.json.

pourquoi ne pas utiliser la manière native? les autres méthodes ont échoué pour moi.

 // Load native UI library var gui = require('nw.gui'); // Get the name field in manifest gui.App.manifest.version