Nodejsアプリケーションのpackage.json
に設定されているバージョンを取得する方法はありますか?私はこのようなものが欲しいです
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
私は、次のコードが最も効果的であることがわかりました。 package.jsonをロードするのに 'require'を使用しているので、現在の作業ディレクトリに関係なく動作します。
var pjson = require('./package.json');
console.log(pjson.version);
警告、@ Pathogenのご好意による。
Browserifyでこれを行うことはセキュリティ上の影響があります。
package.jsonをクライアントに公開しないように注意してください。これは、すべての依存関係のバージョン番号、ビルドおよびテストのコマンドなどがクライアントに送信されることを意味します。
同じプロジェクトでサーバーとクライアントを構築している場合は、サーバー側のバージョン番号も公開します。
このような特定のデータは、攻撃者がサーバーへの攻撃に適したものにするために使用される可能性があります。
あなたのアプリケーションが 'npm start'で起動された場合、あなたは単に使うことができます:
process.env.npm_package_version
詳細については package.json vars を参照してください。
ES6モジュールを使用すると、次のことができます。
import {version} from './package.json';
あるいは普通のシェルでは:
node -e "console.log(require('./package.json').version);"
これを短縮することができます
node -p "require('./package.json').version"
これは必ずしも質問の対象ではありませんが、script
内のバージョン管理されたファイルにログを記録するためなど、package.json
内のバージョンを使用する場合に役立ちます。
{
"name": "myapp",
"version": "0.1.2",
"scripts": {
"run": "node index.js 2>&1 | tee -a myapp_v$(node -p \"require('./package.json').version\").log",
...
}
答え(このコードにはpackage.json
ファイルが含まれており、バージョンを取得します)
const { version } = require('./package.json');
回答
const version = process.env.npm_package_version
JSON.parse
、fs.readFile
、fs.readFileSync
を使用しないでください。また別のnpm modules
を使用しないでください。この質問には必要ありません。
Package.jsonからバージョンを読み取る方法は次のとおりです。
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
package.json
ファイルから特定の情報を取得する別の方法、すなわち pkginfo moduleを使う方法があります。
このモジュールの使い方はとても簡単です。次のようにして、すべてのパッケージ変数を取得できます。
require('pkginfo')(module);
または特定の詳細のみ(この場合はversion
)
require('pkginfo')(module, 'version');
そしてあなたのパッケージ変数はmodule.exports
に設定されるでしょう(それでバージョン番号はmodule.exports.version
を通してアクセス可能になるでしょう)。
次のコードスニペットを使用できます。
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
このモジュールはとても素晴らしい機能を持っています - それはあなたのプロジェクト内のどのファイル(例えばサブフォルダ)でも使用することができ、自動的にあなたのpackage.json
から情報を取得します。だからあなたはpackage.json
がどこにあるのか心配する必要はありません。
それが役立つことを願っています。
サーバサイドでも動作する安全な クライアントサイド ソリューションを探している人のために、 genversion があります。これは、最も近いpackage.jsonからバージョンを読み取り、そのバージョンをエクスポートするインポート可能なCommonJSモジュールファイルを生成するコマンドラインツールです。免責事項:私はメンテナです。
$ genversion lib/version.js
クライアントサイドの安全性はOPの主な意図ではないと認めますが、 Mark Wallace および aug の回答で説明したように、これは非常に関連性があり、またこのQ&Aを見つけた理由です。
私のWebアプリケーションにpackage.jsonのバージョンを含めるための最良の方法を見るためにこの質問に来たので、答えを追加するだけです。
ただし、Webpackを使用してアプリをバンドルする場合は、 DefinePlugin を使用してグローバルバージョンを設定し、それを参照することをお勧めします。 webpack.config.json
でできること
const pkg = require('../../package.json');
...
plugins : [
new webpack.DefinePlugin({
AppVersion: JSON.stringify(pkg.version),
...
そしてAppVersion
は今やあなたが使うことのできるグローバルなものです。また、あなたの .eslintrc
の中で、あなたがグローバルプロップでこれを無視することを確認してください
project-version パッケージを使用できます。
$ npm install --save project-version
それから
const version = require('project-version');
console.log(version);
//=> '1.0.0'
これはprocess.env.npm_package_version
を使用しますが、何らかの理由でenv varが欠落している場合に備えて、package.json
で書かれたバージョンにフォールバックします。
ES6を使用してpackage.jsonをインポートし、バージョン番号を取得してそのバージョンをコンソールに出力することができます。
import {name as app_name, version as app_version} from './path/to/package.json';
console.log(`App ---- ${app_name}\nVersion ---- ${app_version}`);
これはOPの意図ではないことを私は知っていますが、私はこれをしなければならなかったので、それが次の人に役立つことを願っています。
CI/CDプロセスにdocker-composeを使用している場合は、この方法で入手できます。
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', '')\""
画像には、任意のノード画像を使用できます。それが一番小さいので、私はアルパインを使います。
ノードコードでパッケージのバージョンを確認するには、以下を使用できます。
<ES6バージョンのconst version = require('./package.json').version;
ES6バージョンのimport {version} from './package.json';
const version = process.env.npm_package_version;
アプリケーションがnpm start
を使用して起動されている場合、すべてのnpm_ *環境変数が使用可能になります。
以下のnpmパッケージ(root-require、pkginfo、project-version)も使用できます。
findup-sync
でこれを行います。
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
package.json
ファイルをserver.js
またはapp.js
にインポートしてから、package.jsonプロパティにアクセスしてサーバーファイルに入れます。
var package = require('./package.json');
package変数には、package.json内のすべてのデータが含まれています。
Require resolveを使用しない理由...
const packageJson = path.dirname(require.resolve('package-name')) + '/package.json';
const { version } = require(packageJson);
console.log('version', version)
このアプローチでは、すべてのサブパスで機能します:)
親モジュールのpackage.jsonを取得するのに便利なコードを作りました
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
}