क्या नोडजेस कोड में package.json से संस्करण प्राप्त करने का एक तरीका है?


586

क्या 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

क्या 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
विश्व स्तर पर शेबंग के साथ मेरी स्क्रिप्ट के लिए काम नहीं करना। Error: Cannot find module 'package.json'
एक्सबुक

14
छोटा - आवश्यकता ('./ पैकेज')। संस्करण
अफानासी कुराकिन

60
चेतावनी! Browserify के साथ ऐसा करने से सुरक्षा निहितार्थ होते हैं: आपके बंडल में package.json का मतलब है कि आपके सभी निर्भरता संस्करण संख्या, बिल्ड और परीक्षण कमांड और अधिक क्लाइंट को भेजे जाते हैं। यदि आप एक ही परियोजना में सर्वर और क्लाइंट का निर्माण कर रहे हैं, तो आप अपने सर्वरसाइड संस्करण संख्याओं को भी उजागर करते हैं।
पैथोजेन

4
@Pathogen genversion क्लाइंट की तरफ समस्या को हल करता है। यह एक ऐसा टूल है जो संस्करण को package.json से पढ़ता है और इससे एक आयात करने योग्य मॉड्यूल उत्पन्न करता है। डिस्क्लेमर: मैं एक अनुचर हूं।
अक्सेली पाल्कन

348

यदि आपका एप्लिकेशन 'एनपीएम स्टार्ट' के साथ लॉन्च किया गया है, तो आप बस इसका उपयोग कर सकते हैं:

process.env.npm_package_version

देखें package.json वार्स अधिक जानकारी के लिए।


6
पैकेज में अधिकांश जानकारी के बाद से यह संभवतः सबसे अच्छा उत्तर है। जसन प्रक्रिया रनटाइम चर से जुड़ी हुई है
अलेक्जेंडर मिल्स

2
हाँ, मैं सहमत हूँ। यह सही उत्तर होना चाहिए, प्रक्रिया चर का उपयोग करके आपको पैकेज को खोलने और दोबारा पढ़ने की आवश्यकता नहीं है। फ़ाइल को खोलें।
जुआनमा

12
और नोड के बाहर (जैसे, शेल स्क्रिप्ट के माध्यम से निष्पादित npm run …) संस्करण पर्यावरण चर में होगा $npm_package_version
क्विन कॉमपेंड

12
जब किसी अन्य पैकेज की स्क्रिप्ट से कॉल किया जाता है, तो यह गलत तरीके से कॉलिंग पैकेज के संस्करण की रिपोर्ट करता है, न कि कॉल किए गए पैकेज की।
jjrv

6
यह एक इलेक्ट्रान ऐप के साथ काम करना शुरू कर देता है npm start, लेकिन एक निर्मित इलेक्ट्रॉन ऐप के भीतर नहीं: इसके लिए, आप इसे पा सकते हैं app.getVersion
क्रिस ऑक्ट

158

ES6 मॉड्यूल का उपयोग करके आप निम्नलिखित कार्य कर सकते हैं:

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

2
मैंने सोचा था कि ये नोड में समर्थित नहीं थे: github.com/nodejs/help/issues/53
ripper234

1
कोई es6 मॉड्यूल अभी तक सीधे समर्थित नहीं हैं लेकिन आमतौर पर वैसे भी उपयोग किया जाता है, बैबल का उपयोग करने में सक्षम है
पैट्रिक ली स्कॉट

4
@Sornii नहीं, पूरा पैकेज.जॉन क्लाइंट में होगा। मैंने नोड वातावरण से ब्राउज़र में केवल चयनित जानकारी को पारित करने के लिए वेबपैक डिफाइनप्लगिन का उपयोग किया।
डोके १३'१

2
में विनिर्दिष्ट की तरह कोई भी सुरक्षा निहितार्थ stackoverflow.com/a/10855054/540144 ?
इसकी जाजाद

1
हां, वही सुरक्षा मुद्दे। पूरे पैकेज.जसन को क्लाइंट बंडल में शामिल किया जाएगा।
नेरोमेंसर

93

या सादे पुराने खोल में:

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

अनुरोध के अनुसार, खुद नोडज एप्लिकेशन के भीतर नहीं है।
स्टीव बेनेट

1
@SteveBennett नहीं, लेकिन इसने 90 लोगों की मदद की।
कार्ल मॉरिसन

1
शायद उससे कहीं ज्यादा।
स्टीव बेनेट

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 start। यदि आप ऐसा कर रहे हैं node app.jsया समान हैं, तो वे मौजूद नहीं होंगे।
नैट

@ तो यह संस्करण से उपयोग करने के लिए बेहतर है package.json?
फिलिप Fil

37

यहाँ पैकेज से बाहर संस्करण को पढ़ने का तरीका बताया गया है।

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

मैंने इसे एक गुच्छा देखा है, और मुझे यह पसंद है - क्या आप / कोई भी उन विचारों को जानता है जिनकी require() introduces? (for instance, does आवश्यकता है () `utf8 पढ़ने का समर्थन नहीं करते? जैसा कि आपका स्निपेट सुझाव दे सकता है)
इलेक्ट्रबलेक

4
require()फ़ाइल को कैश करता है, जिसे इस मामले में फर्क नहीं करना चाहिए।
1

@jlee एक कारण लोग आमतौर पर करते हैं JSON.parse(fs.readFileSync('package.json', 'utf8'))बजाय delete require.cache[require.resolve('package.json')]; require('package.json')जब वे फिर से लोड करना चाहते हैं?
मिखाइल मलोस्तानिडिस

const {संस्करण} = आवश्यकता ('./ package.json');
एलेक्स डाईकी

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, moduleयह विशिष्ट उदाहरण चर नहीं है; यह नोड में वर्तमान मॉड्यूल का प्रतिनिधित्व करने वाला एक चर है ।js. आप यहां नोड.जेएस मॉड्यूल के बारे में अधिक पढ़ सकते हैं: नोडजे.ओआर.आईएपी
टॉम

2
मैं अपने मॉड्यूल द्वारा आवश्यक अन्य मॉड्यूल के संस्करण को प्राप्त करने की कोशिश कर रहा हूं ... और अगर pkginfo यह संभव बनाता है, तो मुझे एक कठिन समय मिल रहा है।
माइकल

23

उन लोगों के लिए जो एक सुरक्षित क्लाइंट-साइड समाधान की तलाश करते हैं जो सर्वर-साइड पर भी काम करता है, वहाँ जीनवर्सन होता है । यह एक कमांड-लाइन टूल है, जो संस्करण को निकटतम पैकेज से पढ़ता है। जेसन और संस्करण आयात करने वाली एक कॉमनेबल जेएसजेएस मॉड्यूल फ़ाइल उत्पन्न करता है। अस्वीकरण: मैं एक अनुचर हूँ।

$ genversion lib/version.js

मैं स्वीकार करता हूं कि क्लाइंट-साइड सुरक्षा ओपी का प्राथमिक उद्देश्य नहीं था, लेकिन जैसा कि मार्क वालेस और ईग द्वारा जवाब में चर्चा की गई है , यह अत्यधिक प्रासंगिक है और यह भी कारण है कि मुझे यह क्यू एंड ए मिला।


4
यह उत्तर है, और इसे अभी शीर्ष पर गहन समस्याग्रस्त उत्तर से ऊपर पहुंचने के लिए अधिक वोटों की आवश्यकता है।
जेफ एलेन

1
कुछ लोग इस तथ्य से चिंतित हो सकते हैं कि यह एक कमांड लाइन उपकरण है। परेशान मत होइये! टूल की रीडमे बताती है कि कैसे (आसानी से) बिल्ड पर पैकेज में एकीकृत करें। जसन, ताकि आप उपकरण के अस्तित्व के बारे में भूल सकें और हमेशा सबसे हाल का संस्करण नंबर होगा।
मैलामुट

11

बस एक उत्तर जोड़ना क्योंकि मैं इस सवाल पर आया था कि मेरे वेब एप्लिकेशन में package.json से संस्करण को शामिल करने का सबसे अच्छा तरीका है।

मुझे पता है कि यह प्रश्न Node.js के लिए लक्षित है, हालांकि, यदि आप अपने ऐप को बंडल करने के लिए वेबपैक का उपयोग कर रहे हैं, तो अनुशंसित तरीके से अनुस्मारक और संदर्भ में वैश्विक संस्करण घोषित करने के लिए DefinePlugin का उपयोग करना है। तो आप अपने में कर सकते हैंwebpack.config.json

const pkg = require('../../package.json');

...

plugins : [
    new webpack.DefinePlugin({
      AppVersion: JSON.stringify(pkg.version),
...

और फिर AppVersionअब एक वैश्विक है जो आपके उपयोग के लिए उपलब्ध है। यह भी सुनिश्चित करें कि आप अपने .eslintrcग्लोबल्स प्रोप के माध्यम से इसे अनदेखा करें


8

विकल्प 1

सबसे अच्छा अभ्यास पैकेज से संस्करण है। npm पर्यावरण चर का उपयोग करके।

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 का उपयोग करके पर्यावरण चर में संस्करण सेट करना.envprocess.env.version


7

आप संस्करण संख्या को पुनः प्राप्त करने और कंसोल पर संस्करण को आउटपुट करने के लिए package.json को आयात करने के लिए ES6 का उपयोग कर सकते हैं।

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 में "resolutionJsonModule" को "true" सेट करते हैं।
रसेल फिलिप्स

6

नोड कोड में पैकेज संस्करण का निर्धारण करने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं:

  1. const version = require('./package.json').version; <ईएस 6 संस्करणों के लिए

  2. import {version} from './package.json'; ES6 संस्करण के लिए

  3. const version = process.env.npm_package_version; यदि अनुप्रयोग का उपयोग शुरू कर दिया गया है npm start, तो सभी npm_ * पर्यावरण चर उपलब्ध हो जाते हैं।

  4. आप निम्नलिखित npm पैकेजों का उपयोग कर सकते हैं - रूट-आवश्यकता, pkginfo, प्रोजेक्ट-संस्करण।


4

आप प्रोजेक्ट-संस्करण पैकेज का उपयोग कर सकते हैं ।

$ npm install --save project-version

फिर

const version = require('project-version');

console.log(version);
//=>  '1.0.0'

मामले में process.env.npm_package_versionलिखे गए संस्करण पर इसका उपयोग किया जाता है, लेकिन package.jsonएनवी संस्करण किसी कारण से गायब है।


उदाहरण के लिए अगर js फाइल npm से शुरू नहीं हुई थी?
मिहेल मलोस्तानिडिस

1

मैं इसके साथ करता हूं findup-sync:

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

फाइंडअप cwd से शुरू होता है, इसलिए ज्यादातर मामलों में यह सिर्फ शीर्ष स्तर को प्राप्त करेगा package.json, process.env.npm_package_versionइसके अलावा इसे दोपहर 12 बजे से शुरू करने की आवश्यकता नहीं है। इसलिए अपने लाइब्रेरी संस्करण को पाने की कोशिश करने से वास्तव में कॉलर का संस्करण प्राप्त होगा। एक साधारण आवश्यकता ('./ package.json') इससे बचती है।
Mihail Malostanidis

1

मुझे पता है कि यह ओपी का इरादा नहीं है, लेकिन मुझे बस ऐसा करना था, इसलिए उम्मीद है कि यह अगले व्यक्ति की मदद करेगा।

यदि आप अपने 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', '')\""

छवि के लिए, आप किसी भी नोड छवि का उपयोग कर सकते हैं। मैं अल्पाइन का उपयोग करता हूं क्योंकि यह सबसे छोटा है।


1

आवश्यकता समाधान का उपयोग क्यों न करें ...

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.json में सभी डेटा होते हैं।


0

माता-पिता के मॉड्यूल पैकेज को प्राप्त करने के लिए मैंने एक उपयोगी कोड बनाया। 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
    }),
  ]
};

फिर, स्रोत कोड में, जहाँ भी आप पैकेज .json संस्करण रखना चाहते हैं, आप स्ट्रिंग 'MY_PACKAGE_JSON_VERSION' का उपयोग करेंगे।

// src/index.js
export const packageVersion = 'MY_PACKAGE_JSON_VERSION' // replaced with actual version number in rollup.config.js
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.