web-dev-qa-db-fra.com

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
448
Abhik Bose Pramanik

J'ai trouvé que le fragment de code suivant fonctionnait mieux pour moi. Puisqu'il utilise 'require' pour charger le package.json, cela fonctionne quel que soit le répertoire de travail en cours.

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

Un avertissement, gracieuseté de @Pathogen:

Faire cela avec browserify a des implications sur la sécurité.
Veillez à ne pas exposer votre package.json au client, car cela signifie que tous vos numéros de version de dépendance, commandes de génération et de test, etc.
Si vous construisez serveur et client dans le même projet, vous exposez également vos numéros de version côté serveur.
Un tel attaquant peut utiliser ces données spécifiques pour mieux adapter l'attaque de votre serveur.

791
Mark Wallace

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.

246
Julien Christin

En utilisant les modules ES6, vous pouvez effectuer les opérations suivantes:

import {version} from './package.json';
104
Patrick Lee Scott

Ou en plaine vieux Shell:

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 a demandé, il est utile si vous souhaitez utiliser la version dans package.json elle-même, par exemple pour vous connecter à un fichier versionné dans une 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",
  ...
}
61
abernier

Voici comment lire la version de package.json:

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

Il existe un autre moyen d'extraire certaines informations de votre fichier package.json, à l'aide de pkginfo module.

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 des sous-dossiers) et récupérera automatiquement les informations de votre package.json. Vous n’avez donc pas à vous inquiéter de savoir où se trouve package.json.

J'espère que cela aidera.

21
Tom

Pour ceux qui recherchent une solution sûre côté client qui fonctionne également côté serveur, il existe genversion . C'est un outil de ligne de commande qui lit la version du fichier 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 l’intention principale de OP, mais, comme indiqué dans les réponses de Mark Wallace et aug , c’est très important et la raison pour laquelle j’ai trouvé ce Q & R.

13
Akseli Palén

J'ajoute simplement une réponse car je suis venu à cette question pour voir le meilleur moyen 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, rappelez-vous que la méthode recommandée consiste à utiliser DefinePlugin pour déclarer une version globale dans la configuration et la référencer. Donc, vous pourriez faire dans votre webpack.config.json

const pkg = require('../../package.json');

...

plugins : [
    new webpack.DefinePlugin({
      AppVersion: JSON.stringify(pkg.version),
...

Et alors AppVersion est maintenant un global que vous pouvez utiliser. Assurez-vous également que, dans votre .eslintrc, vous l'ignorez via les globals prop

7
aug

Vous pouvez utiliser la version project-version package.

$ npm install --save project-version

Ensuite

const version = require('project-version');

console.log(version);
//=>  '1.0.0'

Il utilise process.env.npm_package_version mais replie sur la version écrite dans package.json au cas où la variable env est manquante pour une raison quelconque.

3
simonepri

Je sais que ce n'est pas l'intention du PO, mais je devais le faire, j'espère que cela aidera la prochaine personne.

Si vous utilisez docker-compos 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 noeud. J'utilise Alpine parce que c'est le plus petit.

1

Pour déterminer la version du package dans le code de noeud, vous pouvez utiliser les éléments suivants:

  1. const version = require('./package.json').version; pour <versions ES6

  2. import {version} from './package.json'; pour la version ES6

  3. const version = process.env.npm_package_version; si l'application a été démarrée à l'aide de npm start, toutes les variables d'environnement npm_ * sont disponibles.

  4. Vous pouvez également utiliser les packages npm suivants - root-require, pkginfo, version du projet.

1
Rohit

Vous pouvez utiliser ES6 pour importer package.json afin de récupérer le numéro de version et de l'exporter sur la console.

import {name as app_name, version as app_version}  from './path/to/package.json';

console.log(`App ---- ${app_name}\nVersion ---- ${app_version}`);
1
ÁngelBlanco

Je le fais avec findup-sync :

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

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

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

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

0
Patharraj

Pourquoi ne pas utiliser l'exigence de résolution ...

const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)

Avec cette approche, travaillez pour tous les sous-chemins :)

0
Gianluca Cirone

J'ai créé un code utile pour obtenir le package.json du module parent

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
}
0
g00dnatur3