it-swarm.com.de

Gibt es eine Möglichkeit, die Version von package.json im nodejs-Code abzurufen?

Gibt es eine Möglichkeit, die in package.json in einer nodejs-App eingestellte Version abzurufen? Ich würde so etwas wollen

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

Ich fand, dass das folgende Codefragment für mich am besten funktionierte. Da es das Paket "requir" zum Laden der package.json verwendet, funktioniert es unabhängig vom aktuellen Arbeitsverzeichnis.

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

Eine Warnung mit freundlicher Genehmigung von @Pathogen:

Wenn Sie dies mit browserify tun, hat dies Auswirkungen auf die Sicherheit.
Achten Sie darauf, dass Sie package.json nicht für den Client verfügbar machen. Dies bedeutet, dass alle Versionsnummern für Abhängigkeiten, Build- und Testbefehle und mehr an den Client gesendet werden.
Wenn Sie Server und Client in demselben Projekt erstellen, legen Sie auch die serverseitigen Versionsnummern offen.
Solche spezifischen Daten können von einem Angreifer verwendet werden, um besser auf den Angriff Ihres Servers einzugehen.

791
Mark Wallace

Wenn Ihre Anwendung mit 'npm start' gestartet wird, können Sie einfach Folgendes verwenden:

process.env.npm_package_version

Siehe package.json vars für weitere Details.

246
Julien Christin

Mit ES6-Modulen können Sie Folgendes tun:

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

Oder in einfachen alten Shell:

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

Dies kann zu verkürzt werden

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

Auch wenn dies nicht genau das ist, was die Frage stellt, ist es nützlich, wenn Sie die Version innerhalb von package.json selbst verwenden möchten, um sich beispielsweise in einer versionierten Datei in einer script anzumelden:

{
  "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

Die richtigen Antworten werden hier in Beispiel sein:

  1. Antwort (dieser Code enthält die Datei package.json Und zeigt die Version an)

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


  1. Antworten

    const version = process.env.npm_package_version


Bitte verwenden Sie nicht JSON.parse, fs.readFile, fs.readFileSync Und verwenden Sie keinen anderen npm modules. Dies ist für diese Frage nicht erforderlich.

42
аlex dykyі

So lesen Sie die Version von package.json aus:

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

Es gibt eine andere Möglichkeit, bestimmte Informationen aus Ihrer package.json-Datei abzurufen, und zwar mit dem Modul pkginfo .

Die Verwendung dieses Moduls ist sehr einfach. Sie können alle Paketvariablen abrufen mit:

require('pkginfo')(module);

Oder nur bestimmte Details (version in diesem Fall)

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

Und Ihre Paketvariablen werden auf module.exports gesetzt (daher ist die Versionsnummer über module.exports.version erreichbar).

Sie könnten den folgenden Code-Ausschnitt verwenden:

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

Dieses Modul verfügt über eine sehr schöne Funktion - es kann in jeder Datei in Ihrem Projekt (z. B. in Unterordnern) verwendet werden und holt automatisch Informationen aus Ihrem package.json. Sie müssen sich also keine Sorgen machen, wo Sie package.json sind.

Ich hoffe das wird helfen.

21
Tom

Für diejenigen, die nach einer sicheren clientseitigen - Lösung suchen, die auch serverseitig funktioniert, gibt es genversion . Es ist ein Befehlszeilentool, das die Version aus dem nächstgelegenen package.json liest und eine importierbare CommonJS-Moduldatei generiert, die die Version exportiert. Haftungsausschluss: Ich bin Betreuer.

$ genversion lib/version.js

Ich gebe zu, dass die Sicherheit auf Kundenseite nicht die Hauptabsicht von OP war, aber wie in den Antworten von Mark Wallace und aug erörtert, ist dies äußerst relevant und auch der Grund, warum ich diese Fragen und Antworten fand.

13
Akseli Palén

Fügen Sie einfach eine Antwort hinzu, da ich zu dieser Frage gekommen bin, um die beste Möglichkeit zu finden, die Version von package.json in meine Webanwendung aufzunehmen. 

Ich weiß, dass diese Frage für Node.js gedacht ist. Wenn Sie Webpack verwenden, um Ihre App zu bündeln, ist dies nur eine Erinnerung. Die empfohlene Methode ist die Verwendung von DefinePlugin , um eine globale Version in der Konfiguration zu deklarieren und darauf hinzuweisen. Sie könnten also in Ihrem webpack.config.json

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

...

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

Und dann ist AppVersion jetzt eine globale, die Sie verwenden können. Stellen Sie außerdem sicher, dass Sie in Ihrem .eslintrc dies über die Globals-Eigenschaft ignorieren

7
aug

Sie können das Paket project-version verwenden.

$ npm install --save project-version

Dann

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

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

Es verwendet process.env.npm_package_version, aber Fallback auf die Version, die in package.json geschrieben ist, falls die Umgebungsvariable aus irgendeinem Grund fehlt.

3
simonepri

Ich weiß, dass dies nicht die Absicht des OP ist, aber ich musste dies nur tun, also hoffe, es hilft der nächsten Person.

Wenn Sie Docker-Compose für Ihren CI/CD-Prozess verwenden, können Sie es auf diese Weise erhalten! 

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

für das Bild können Sie ein beliebiges Knotenbild verwenden. Ich benutze Alpine, weil es das kleinste ist.

1

Um die Paketversion im Knotencode zu ermitteln, können Sie Folgendes verwenden:

  1. const version = require('./package.json').version; für <ES6-Versionen

  2. import {version} from './package.json'; für die ES6-Version

  3. const version = process.env.npm_package_version; Wenn die Anwendung mit npm start gestartet wurde, werden alle Umgebungsvariablen npm_ * verfügbar.

  4. Sie können auch die folgenden npm-Pakete verwenden - root-require, pkginfo, project-version.

1
Rohit

Mit ES6 können Sie package.json importieren, um die Versionsnummer abzurufen und die Version auf der Konsole auszugeben.

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

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

Ich mache das mit findup-sync :

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

Importieren Sie Ihre package.json-Datei in Ihren server.js oder app.js und greifen Sie auf die package.json-Eigenschaften in die Server-Datei zu.

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

paketvariable enthält alle Daten in package.json.

0
Patharraj

Warum verwenden Sie nicht die erforderliche Auflösung ...

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

Mit diesem Ansatz für alle Unterpfade arbeiten :)

0
Gianluca Cirone

Ich habe einen nützlichen Code erstellt, um package.json des übergeordneten Moduls zu erhalten

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