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 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.
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.
En utilisant les modules ES6, vous pouvez effectuer les opérations suivantes:
import {version} from './package.json';
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",
...
}
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 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.
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.
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
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.
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.
Pour déterminer la version du package dans le code de noeud, vous pouvez utiliser les éléments suivants:
const version = require('./package.json').version;
pour <versions ES6
import {version} from './package.json';
pour la version ES6
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.
Vous pouvez également utiliser les packages npm suivants - root-require, pkginfo, version du projet.
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}`);
Je le fais avec findup-sync
:
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
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.
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 :)
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
}