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)
Adrian Lynch

답변:


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

14
짧게
-require

60
경고! browserify로이를 수행하면 보안에 영향을 미칩니다. 번들의 package.json은 모든 종속 버전 번호, 빌드 및 테스트 명령 등이 클라이언트로 전송됨을 의미합니다. 동일한 프로젝트에서 서버와 클라이언트를 빌드하는 경우 서버 측 버전 번호도 노출됩니다.
병원체

4
@Pathogen genversion 은 클라이언트 측의 문제를 해결합니다. package.json에서 버전을 읽고 가져 오기 가능한 모듈을 생성하는 도구입니다. 면책 조항 : 저는 관리자입니다.
Akseli Palén

348

'npm start'로 응용 프로그램을 시작한 경우 다음을 사용하면됩니다.

process.env.npm_package_version

자세한 내용은 package.json vars 를 참조하십시오.


6
package.json에있는 대부분의 정보가 프로세스 런타임 변수에 연결되어 있기 때문에 이것은 아마도 가장 좋은 대답 일 것입니다
Alexander Mills

2
네, 동의합니다. package.json 파일을 열고 다시 읽을 필요가없는 프로세스 변수를 사용하여 정답입니다.
Juanma

12
그리고 노드 외부 (예 :을 통해 실행되는 쉘 스크립트 npm run …)는 버전이 환경 변수에 $npm_package_version있습니다.
Quinn Comendant

12
다른 패키지의 스크립트에서 호출 할 때이 잘못의 버전을보고 호출 패키지가 아닌 라는 패키지를.
jjrv

6
로 시작 하는 전자 앱 내에서 작동 npm start하지만 내장 전자 앱 내에서는 작동 하지 않습니다 app.getVersion.
ChrisV

158

ES6 모듈을 사용하면 다음을 수행 할 수 있습니다.

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

2
나는 이것이 노드에서 지원되지 않는다고 생각했다 : github.com/nodejs/help/issues/53
ripper234

1
어떤 ES6 모듈은 바벨을 사용하여 활성화 아직 직접 지원되지하지만 일반적으로 어쨌든 사용되지 않습니다
패트릭 리 스콧을

4
@Sornii 아니오, 전체 package.json이 클라이언트에 있습니다. 웹팩의 definePlugin을 사용하여 선택된 정보 만 노드 환경에서 브라우저로 전달했습니다.
doeke

2
에 규정 된 같은 보안 의미 stackoverflow.com/a/10855054/540144 ?
itsazzad

1
예, 동일한 보안 문제입니다. 전체 package.json이 클라이언트 번들에 포함됩니다.
Neromancer

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
아마 그것보다 훨씬 더.
Steve Bennett

61

버전을 검색하는 방법에는 두 가지가 있습니다.

  1. package.json버전 요구 및 얻기 :
const { version } = require('./package.json');
  1. 환경 변수 사용
const version = process.env.npm_package_version;

사용하지 마십시오 JSON.parse, fs.readFile, fs.readFileSync다른 사용하지 않는 npm modules이 질문 것이 필요는 없습니다합니다.


2
이 코드 스 니펫은 제한적이고 즉각적인 도움이 될 수 있습니다. 적절한 설명은 크게 장기 가치를 향상 할 보여줌으로써 이 문제에 대한 좋은 해결책이고, 다른 유사한 질문을 미래의 독자들에게 더 유용 할 것입니다. 제발 편집 당신이 만든 가정 등 일부 설명을 추가 할 답변을.
milo526

8
그런 다음 npm_*환경 값은 스크립트가 NPM에 의해 시작된 경우에만 사용할 수 있습니다 (예 :) npm start. 당신이 node app.js하거나 비슷한 경우, 그들은 존재하지 않습니다.
Nate

@Nate 따라서 버전을 사용하는 것이 좋습니다 package.json.
Filip Š

37

package.json에서 버전을 읽는 방법은 다음과 같습니다.

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

나는 이것을 많이 보았고 그것을 좋아한다-당신 / 누구든지 require() introduces? (for instance, does utf8 읽기를 지원하지 않는 요구 사항을 알고 있습니까? 발췌 문장에서 제안한대로)
electblake

4
require()파일을 캐시하므로이 경우 차이가 없습니다.
jlee

@jlee 사람들 이 다시로드 할 때 JSON.parse(fs.readFileSync('package.json', 'utf8'))대신 일반적으로하는 이유가 delete require.cache[require.resolve('package.json')]; require('package.json')있습니까?
Mihail Malostanidis

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

23

pkginfo 모듈을 package.json사용 하여 파일 에서 특정 정보를 가져 오는 다른 방법이 있습니다 .

이 모듈의 사용법은 매우 간단합니다. 다음을 사용하여 모든 패키지 변수를 얻을 수 있습니다.

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여기?
chovy 2018 년

@chovy module는이 특정 변수가 아닙니다. node.js의 현재 모듈을 나타내는 변수입니다. node.js 모듈에 대한 자세한 내용은 다음을 참조
Tom

2
내 모듈에 필요한 다른 모듈 버전을 얻으려고하는데 ... pkginfo가 이것을 가능하게 만드는지 알아내는 데 어려움을 겪고 있습니다.
Michael

23

서버 측에서도 작동 하는 안전한 클라이언트 측 솔루션 을 찾는 사람들에게는 genversion이 있습니다. 가장 가까운 package.json에서 버전을 읽고 버전을 내보내는 가져 오기 가능한 CommonJS 모듈 파일을 생성하는 명령 행 도구입니다. 면책 조항 : 저는 관리자입니다.

$ genversion lib/version.js

고객 측 안전은 OP의 주요 의도가 아니라는 점을 인정하지만 Mark Wallaceaug의 답변에서 논의 된 바와 같이 , 이는 관련성이 높으며이 Q & A를 찾은 이유이기도합니다.


4
이것이 답변이며, 지금 가장 문제가 많은 답변보다 더 많은 표를 얻으려면 더 많은 투표가 필요합니다.
Jeff Allen

1
일부 사람들은 이것이 명령 행 도구라는 사실에 놀라지 않을 수 있습니다. 걱정 하지마! 이 도구의 readme는 빌드시 호출을 package.json에 (쉽게) 통합하는 방법을 설명하므로 도구의 존재를 잊어 버릴 수 있으며 항상 최신 버전 번호를 갖습니다.
malamut 's

11

내 웹 응용 프로그램에 package.json의 버전을 포함시키는 가장 좋은 방법을 보려면이 질문에 왔기 때문에 대답을 추가하십시오.

나는이 질문이 Node.js를 대상으로한다는 것을 알고 있지만 Webpack을 사용하여 응용 프로그램을 번들로 제공하는 경우 권장되는 방법은 DefinePlugin 을 사용 하여 구성에서 전역 버전을 선언하고 참조하는 것입니다. 그래서 당신은 할 수 있습니다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 명령을 사용하여 서비스를 시작할 때만 작동합니다.

빠른 정보 : process.env.npm_package_ [keyname]을 사용하여 pacakge.json의 모든 값을 읽을 수 있습니다

옵션 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"로 설정하는 한 작동합니다.
Russell Phillips

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

프로젝트 버전 패키지를 사용할 수 있습니다 .

$ 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

1

나는 이것을 다음과 findup-sync같이한다 :

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

findup은 cwd로 시작하므로 대부분의 경우 npm을 통해 시작하지 않아도되는 package.json것과 비슷한 최상위 수준을 얻습니다 process.env.npm_package_version. 따라서 라이브러리 버전을 얻으려고하면 실제로 발신자의 버전을 얻습니다. 간단한 require ( './ package.json')은 이것을 피할 것입니다.
Mihail Malostanidis

1

나는 이것이 OP의 의도가 아니라는 것을 알고 있지만 단지 그렇게해야했기 때문에 다음 사람에게 도움이되기를 바랍니다.

CI / CD 프로세스에 도커 작성을 사용하는 경우이 방법으로 얻을 수 있습니다!

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

이미지의 경우 모든 노드 이미지를 사용할 수 있습니다. 나는 그것이 가장 작기 때문에 알파인을 사용합니다.


1

require resolve를 사용하지 않는 이유는 무엇입니까?

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

이 접근법을 사용하면 모든 하위 경로에서 작동합니다. :)


0

가져 오기 package.json당신에 파일 server.js또는 app.js서버 파일에 다음 액세스 package.json 속성.

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

package 변수는 package.json의 모든 데이터를 포함합니다.


0

부모 모듈의 패키지를 얻는 데 유용한 코드를 만들었습니다.

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-replacepackage.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.