package.json
nodejsアプリで設定されたバージョンを取得する方法はありますか?このようなものが欲しい
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
nodejsアプリで設定されたバージョンを取得する方法はありますか?このようなものが欲しい
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
回答:
次のコードフラグメントが最も効果的であることがわかりました。のrequire
読み込みに使用するためpackage.json
、現在の作業ディレクトリに関係なく機能します。
var pjson = require('./package.json');
console.log(pjson.version);
@Pathogenの厚意による警告:
Browserifyでこれを行うと、セキュリティに影響があります。依存関係のすべてのバージョン番号、ビルドおよびテストコマンドなどがクライアントに送信されることになるため、クライアントをクライアント
に公開しないように注意してくださいpackage.json
。
同じプロジェクトでサーバーとクライアントを構築している場合は、サーバー側のバージョン番号も公開します。攻撃者はこのような特定のデータを使用して、サーバーへの攻撃をより適切に適合させることができます。
require('root-require')('package.json').version
Error: Cannot find module 'package.json'
。
アプリケーションが「npm start」で起動されている場合は、次のように使用できます。
process.env.npm_package_version
詳細については、package.json varsを参照してください。
npm run …
)のバージョンは、環境変数に含まれます$npm_package_version
。
ES6モジュールを使用すると、次のことができます。
import {version} from './package.json';
またはプレーンな古いシェルで:
node -e "console.log(require('./package.json').version);"
これは、
node -p "require('./package.json').version"
これは正確に質問されたものではありませんが、内でバージョンを使用したい場合に役立ちます package.json
自体でたとえば、バージョン管理されたファイルにログを記録する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",
...
}
バージョンを取得するには2つの方法があります。
package.json
バージョンの要求と取得:const { version } = require('./package.json');
const version = process.env.npm_package_version;
使用しないでくださいJSON.parse
、fs.readFile
、fs.readFileSync
と別のものを使用していないnpm modules
、それはこの質問のために必要はありません。
npm_*
環境値は、スクリプトがNPMによって開始された場合にのみ使用できます(例:)npm start
。あなたがやっているnode app.js
か、または類似している場合、それらは存在しません。
package.json
ですか?
package.jsonからバージョンを読み取る方法は次のとおりです。
fs = require('fs')
json = JSON.parse(fs.readFileSync('package.json', 'utf8'))
version = json.version
require() introduces? (for instance, does
require() `utf8読み取りをサポートしない考慮事項を知っていますか?スニペットが示唆しているように)
require()
ファイルをキャッシュします。この場合、違いはありません。
JSON.parse(fs.readFileSync('package.json', 'utf8'))
なく、一般的に行う理由がありdelete require.cache[require.resolve('package.json')]; require('package.json')
ますか?
package.json
ファイルから特定の情報を取得する別の方法、つまりpkginfoを使用する方法がありますモジュールます。
このモジュールの使い方はとても簡単です。以下を使用して、すべてのパッケージ変数を取得できます。
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
はありません。
お役に立てば幸いです。
module
ここは何ですか?
module
は、この特定のサンプル変数ではありません。これは、node.jsの現在のモジュールを表す変数です。node.jsモジュールの詳細については、こちらをご覧ください。nodejs.org
サーバー側でも機能する安全なクライアント側のソリューションを探している人のために、genversionがあります。これは、最も近いpackage.jsonからバージョンを読み取り、バージョンをエクスポートするインポート可能なCommonJSモジュールファイルを生成するコマンドラインツールです。免責事項:私はメンテナーです。
$ genversion lib/version.js
クライアント側の安全性はOPの主な意図ではなかったと認めますが、 Mark Wallaceと8 月の、それは非常に関連性が高く、このQ&Aを見つけた理由でもあります。
私がこの質問にたどり着いたのは回答を追加するだけです。webアプリケーションにpackage.jsonからのバージョンを含める最良の方法を確認しました。
私はこの質問がNode.jsを対象としていることを知っていますが、Webpackを使用してアプリをバンドルしている場合は、DefinePluginを使用してconfigでグローバルバージョンを宣言し、それを参照することをお勧めします。だからあなたはあなたの中で行うことができますwebpack.config.json
const pkg = require('../../package.json');
...
plugins : [
new webpack.DefinePlugin({
AppVersion: JSON.stringify(pkg.version),
...
そしてAppVersion
今、あなたが使用できるグローバルです。また、あなたがグローバルプロップを介してこれを無視することを確認してください.eslintrc
オプション1
ベストプラクティスは、npm環境変数を使用してpackage.jsonからバージョン管理することです。
process.env.npm_package_version
詳細:https : //docs.npmjs.com/using-npm/config.html
これは、NPMコマンドを使用してサービスを開始する場合にのみ機能します。
クイック情報:pacakge.jsonの任意の値を、process.env.npm_package_ [keyname]を使用して読み取ることができます
オプション2
https://www.npmjs.com/package/dotenvを.env
ファイルとして使用して環境変数にバージョンを設定し、それについてprocess.env.version
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}`);
ノードコードのパッケージバージョンを確認するには、以下を使用できます。
const version = require('./package.json').version;
ES6未満のバージョンの場合
import {version} from './package.json';
ES6バージョン
const version = process.env.npm_package_version;
を使用してアプリケーションを起動した場合npm start
、すべてのnpm_ *環境変数が使用可能になります。
root-require、pkginfo、project-versionなどのnpmパッケージも使用できます。
project-versionパッケージを使用できます。
$ npm install --save project-version
その後
const version = require('project-version');
console.log(version);
//=> '1.0.0'
何らかの理由でenv varが欠落している場合に使用しますprocess.env.npm_package_version
が、package.json
で記述されたバージョンにフォールバックします。
私はこれでこうしfindup-sync
ます:
var findup = require('findup-sync');
var packagejson = require(findup('package.json'));
console.log(packagejson.version); // => '0.0.1'
package.json
、process.env.npm_package_version
npmを介して起動する必要がないことと同様に、最上位レベルを取得します。したがって、ライブラリのバージョンを取得しようとすると、実際には呼び出し元のバージョンが取得されます。単純なrequire( './ package.json')はこれを回避します。
これが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', '')\""
イメージには、任意のノードイメージを使用できます。アルパインは一番小さいので使っています。
親モジュールの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
}
ロールアップを使用する場合、rollup-plugin-replace
プラグインを使用して、package.jsonをクライアントに公開せずにバージョンを追加できます。
// rollup.config.js
import pkg from './package.json';
import { terser } from "rollup-plugin-terser";
import resolve from 'rollup-plugin-node-resolve';
import commonJS from 'rollup-plugin-commonjs'
import replace from 'rollup-plugin-replace';
export default {
plugins: [
replace({
exclude: 'node_modules/**',
'MY_PACKAGE_JSON_VERSION': pkg.version, // will replace 'MY_PACKAGE_JSON_VERSION' with package.json version throughout source code
}),
]
};
次に、ソースコードで、package.jsonバージョンを作成する場所のどこでも、文字列 'MY_PACKAGE_JSON_VERSION'を使用します。
// src/index.js
export const packageVersion = 'MY_PACKAGE_JSON_VERSION' // replaced with actual version number in rollup.config.js
console.log(process.version)