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
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.
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.
Mit ES6-Modulen können Sie Folgendes tun:
import {version} from './package.json';
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",
...
}
Antwort (dieser Code enthält die Datei package.json
Und zeigt die Version an)
const { version } = require('./package.json');
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.
So lesen Sie die Version von package.json aus:
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
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.
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.
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
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.
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.
Um die Paketversion im Knotencode zu ermitteln, können Sie Folgendes verwenden:
const version = require('./package.json').version;
für <ES6-Versionen
import {version} from './package.json';
für die ES6-Version
const version = process.env.npm_package_version;
Wenn die Anwendung mit npm start
gestartet wurde, werden alle Umgebungsvariablen npm_ * verfügbar.
Sie können auch die folgenden npm-Pakete verwenden - root-require, pkginfo, project-version.
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}`);
Ich mache das mit findup-sync
:
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
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.
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 :)
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
}