nodejsコードのpackage.jsonからバージョンを取得する方法はありますか?


586

package.jsonnodejsアプリで設定されたバージョンを取得する方法はありますか?このようなものが欲しい

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

Nodeのバージョンまたはpackage.jsonで宣言されたバージョンを取得することの方が重要ですか?:フォームならば、これはあなたに実行しているバージョン与えるだろうconsole.log(process.version)
エイドリアンリンチ

回答:


957

次のコードフラグメントが最も効果的であることがわかりました。のrequire読み込みに使用するためpackage.json、現在の作業ディレクトリに関係なく機能します。

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

@Pathogenの厚意による警告:

Browserifyでこれを行うと、セキュリティに影響があります。依存関係のすべてのバージョン番号、ビルドおよびテストコマンドなどがクライアントに送信されることになるため、クライアントをクライアント
に公開しないように注意してくださいpackage.json
同じプロジェクトでサーバーとクライアントを構築している場合は、サーバー側のバージョン番号も公開します。攻撃者はこのような特定のデータを使用して、サーバーへの攻撃をより適切に適合させることができます。


25
(私がそうであったように)さまざまな場所からこれを取得しようとすることでやけどを続ける場合は、実行できますrequire('root-require')('package.json').version
mikermcneil

5
shebangがグローバルにインストールされているスクリプトでは機能しません。Error: Cannot find module 'package.json'
exebook 2015年

14
より短く
-require

60
警告!browserifyでこれを行うと、セキュリティに影響があります。バンドル内のpackage.jsonは、依存関係のすべてのバージョン番号、ビルドおよびテストコマンドなどがクライアントに送信されることを意味します。同じプロジェクトでサーバーとクライアントを構築している場合は、サーバー側のバージョン番号も公開します。
病原体

4
@Pathogen genversionはクライアント側の問題を解決します。これは、package.jsonからバージョンを読み取り、そこからインポート可能なモジュールを生成するツールです。免責事項:私はメンテナーです。
AkseliPalén2017年

349

アプリケーションが「npm start」で起動されている場合は、次のように使用できます。

process.env.npm_package_version

詳細については、package.json varsを参照してください。


6
package.json内の情報のほとんどは、プロセス実行時の変数に添付されているので、これはおそらく最高の答えです
アレクサンダー・ミルズ

2
はい、同意します。これは正しい答えであるはずです。package.jsonファイルを開いて再度読み取る必要がないプロセス変数を使用してください。
Juanma

12
そして、ノードの外(たとえば、を介して実行されるシェルスクリプトnpm run …)のバージョンは、環境変数に含まれます$npm_package_version
Quinn Comendant 2015

12
別のパッケージのスクリプトから呼び出された場合、これは間違ってのバージョンを報告し、呼び出し元のパッケージではなく呼ばれるパッケージを。
jjrv 2016

6
で開始されたelectronアプリ内で機能しますnpm startが、ビルドされたelectronアプリ内では機能しませんapp.getVersion。そのため、で見つけることができます。
ChrisV

158

ES6モジュールを使用すると、次のことができます。

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

2
これらはノードではサポートされていないと思いました:github.com/nodejs/help/issues/53
ripper234

1
es6モジュールはまだ直接サポートされていませんが、いずれにしても一般的に使用されており、Babelを使用して有効になっています
Patrick Lee Scott

4
@Sorniiいいえ、package.json全体がクライアントにあります。webpackのdefinePluginを使用して、選択した情報のみをノード環境からブラウザーに渡しました。
doeke

2
stackoverflow.com/a/10855054/540144で指定されているようなセキュリティ上の影響はありますか?
itsazzad

1
はい、同じセキュリティの問題。package.json全体がクライアントバンドルに含まれます。
ネロマンサー

94

またはプレーンな古いシェルで:

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",
  ...
}

ただし、リクエストされたとおり、それはnodeJSアプリ自体にはありません。
Steve Bennett

1
@SteveBennettいいえ、でも90人と私を助けてくれました。
K-SOの毒性が高まっています。

1
おそらくそれよりもはるかに多い。
スティーブベネット

61

バージョンを取得するには2つの方法があります。

  1. package.jsonバージョンの要求と取得:
const { version } = require('./package.json');
  1. 環境変数を使用する:
const version = process.env.npm_package_version;

使用しないでくださいJSON.parsefs.readFilefs.readFileSyncと別のものを使用していないnpm modules、それはこの質問のために必要はありません。


2
このコードスニペットをお寄せいただきありがとうございます。このコードスニペットは、限られた、即時の助けを提供する可能性があります。適切な説明が大幅に長期的な価値を向上させるだろう示すことによって、なぜこれが問題に良い解決策であり、他の、同様の質問を将来の読者にそれがより便利になるだろう。答えを編集して、仮定を含めて説明を追加してください。
milo526 2018

8
次に、npm_*環境値は、スクリプトがNPMによって開始された場合にのみ使用できます(例:)npm start。あなたがやっているnode app.jsか、または類似している場合、それらは存在しません。
ネイト

@ネイトそれでは、バージョンを使用する方が良いpackage.jsonですか?
フィリップ

38

package.jsonからバージョンを読み取る方法は次のとおりです。

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

私はこれをたくさん見ました、そして私はそれが好きです-あなた/誰でもrequire() introduces? (for instance, does require() `utf8読み取りをサポートしない考慮事項を知っていますか?スニペットが示唆しているように)
electblake 2014

4
require()ファイルをキャッシュします。この場合、違いはありません。
jlee 2014年

@jleeは、リロードするときではJSON.parse(fs.readFileSync('package.json', 'utf8'))なく、一般的に行う理由がありdelete require.cache[require.resolve('package.json')]; require('package.json')ますか?
Mihail Malostanidis、2018

const {version} = require( './ package.json');
アレックスdykyі18年

23

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はありません。

お役に立てば幸いです。


1
moduleここは何ですか?
2017年

@chovy moduleは、この特定のサンプル変数ではありません。これは、node.jsの現在のモジュールを表す変数です。node.jsモジュールの詳細については、こちらをご覧ください。nodejs.org
Tom

2
私のモジュールに必要な他のモジュールのバージョンを取得しようとしています... pkginfoがこれを可能にするかどうかを理解するのに苦労しています。
マイケル

23

サーバー側でも機能する安全なクライアント側のソリューションを探している人のために、genversionがあります。これは、最も近いpackage.jsonからバージョンを読み取り、バージョンをエクスポートするインポート可能なCommonJSモジュールファイルを生成するコマンドラインツールです。免責事項:私はメンテナーです。

$ genversion lib/version.js

クライアント側の安全性はOPの主な意図ではなかったと認めますが、 Mark Wallaceと8 月の、それは非常に関連性が高く、このQ&Aを見つけた理由でもあります。


4
これが答えです。現在、問題の深刻な答えの上に上るには、さらに投票が必要です。
ジェフアレン

1
これがコマンドラインツールであることを心配する人もいます。心配しないでください!ツールのreadmeには、ビルドの呼び出しをpackage.jsonに(簡単に)統合する方法が記載されているため、ツールの存在を忘れて、常に最新のバージョン番号を取得できます。
Malamut

11

私がこの質問にたどり着いたのは回答を追加するだけです。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


8

オプション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


7

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}`);

3
これは、tsconfig.jsonで「resolveJsonModule」を「true」に設定している限り機能します。
ラッセルフィリップス

6

ノードコードのパッケージバージョンを確認するには、以下を使用できます。

  1. const version = require('./package.json').version; ES6未満のバージョンの場合

  2. import {version} from './package.json'; ES6バージョン

  3. const version = process.env.npm_package_version; を使用してアプリケーションを起動した場合npm start、すべてのnpm_ *環境変数が使用可能になります。

  4. root-require、pkginfo、project-versionなどのnpmパッケージも使用できます。


4

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で記述されたバージョンにフォールバックします。


たとえば、jsファイルがnpmから開始されなかった場合、
Mihail Malostanidis、2018

2

なぜrequire resolveを使わないのですか...

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

このアプローチでは、すべてのサブパスで機能します:)


1

私はこれでこうしfindup-syncます:

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

findupはcwdで始まるため、ほとんどの場合package.jsonprocess.env.npm_package_versionnpmを介して起動する必要がないことと同様に、最上位レベルを取得します。したがって、ライブラリのバージョンを取得しようとすると、実際には呼び出し元のバージョンが取得されます。単純なrequire( './ package.json')はこれを回避します。
Mihail Malostanidis

1

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

イメージには、任意のノードイメージを使用できます。アルパインは一番小さいので使っています。


0

package.jsonファイルをserver.jsまたはにインポートしてapp.jsから、package.jsonプロパティにサーバーファイルにアクセスします。

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

パッケージ変数には、package.json内のすべてのデータが含まれています。


0

親モジュールの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
}

0

ロールアップを使用する場合、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.