নোডেজ কোডে প্যাকেজ.জসন থেকে সংস্করণ পাওয়ার কোনও উপায় আছে কি?


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

নোডের সংস্করণ বা প্যাকেজ.জসনে ঘোষিত সংস্করণটি পাওয়া কি আরও গুরুত্বপূর্ণ? যদি ফর্মটি হয় তবে এটি আপনাকে চলমান সংস্করণ দেবে:console.log(process.version)
অ্যাড্রিয়ান লিঞ্চ

উত্তর:


957

আমি খুঁজে পেয়েছি যে নিম্নলিখিত কোডের খণ্ডগুলি আমার পক্ষে সবচেয়ে ভাল কাজ করেছে। যেহেতু এটি requireলোড করতে ব্যবহার করে package.json, এটি বর্তমান ওয়ার্কিং ডিরেক্টরি নির্বিশেষে কাজ করে।

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

@ প্যাথোজেনের সৌজন্যে একটি সতর্কতা:

ব্রাউজারিফাই দিয়ে এটি করার ক্ষেত্রে সুরক্ষা জড়িত।
আপনার package.jsonক্লায়েন্টের কাছে প্রকাশ না করার বিষয়ে সতর্ক থাকুন , কারণ এর অর্থ হ'ল আপনার সমস্ত নির্ভরতা সংস্করণ নম্বর, বিল্ড এবং পরীক্ষার কমান্ড এবং আরও অনেকগুলি ক্লায়েন্টকে প্রেরণ করা হয়েছে।
আপনি যদি একই প্রকল্পে সার্ভার এবং ক্লায়েন্ট তৈরি করে থাকেন তবে আপনি নিজের সার্ভার-সাইড সংস্করণ নম্বরগুলিও প্রকাশ করবেন। আপনার সার্ভারের আক্রমণটিকে আরও ভালভাবে ফিট করার জন্য এই জাতীয় নির্দিষ্ট ডেটা আক্রমণকারী ব্যবহার করতে পারেন।


25
আপনি যদি বিভিন্ন জায়গা থেকে এটি দখলের চেষ্টা করে require('root-require')('package.json').version
জ্বলতে থাকেন

5
আমার স্ক্রিপ্টের জন্য বিশ্বব্যাপী শেবাং ইনস্টল করা নিয়ে কাজ করছে না। Error: Cannot find module 'package.json'
ইজিবুক

14
সংক্ষিপ্ত - প্রয়োজন ('./ প্যাকেজ')। সংস্করণ
আফানাসি কুরকিন

60
সতর্কবাণী! ব্রাউজারফাইটি দিয়ে এটি করার ক্ষেত্রে সুরক্ষা জড়িত রয়েছে: আপনার বান্ডেলে প্যাকেজ.জসনের অর্থ আপনার সমস্ত নির্ভরতা সংস্করণ নম্বর, বিল্ড এবং পরীক্ষার কমান্ড এবং আরও অনেকগুলি ক্লায়েন্টকে প্রেরণ করা হয়েছে। আপনি যদি একই প্রকল্পে সার্ভার এবং ক্লায়েন্ট তৈরি করে থাকেন তবে আপনি নিজের সার্ভারসাইড সংস্করণ নম্বরগুলিও প্রকাশ করে দিন।
প্যাথোজেন

4
@ প্যাথোজেন রূপান্তর বিষয়টি ক্লায়েন্টের পক্ষে সমাধান করে। এটি এমন একটি সরঞ্জাম যা প্যাকেজ.জসন থেকে সংস্করণটি পড়ে এবং এটি থেকে আমদানিযোগ্য মডিউল তৈরি করে। দাবি অস্বীকার: আমি একজন রক্ষণাবেক্ষণকারী।
আকসেলি পলান

348

যদি আপনার অ্যাপ্লিকেশনটি 'এনপিএম স্টার্ট' দিয়ে চালু করা হয়, আপনি কেবল ব্যবহার করতে পারেন:

process.env.npm_package_version

আরও তথ্যের জন্য প্যাকেজ.জসন ওয়ার্স দেখুন ।


6
প্যাকেজ.জসনের বেশিরভাগ তথ্য প্রক্রিয়া রানটাইম ভেরিয়েবলের সাথে সংযুক্ত থাকায় এটি সম্ভবত সেরা উত্তর
আলেকজান্ডার মিলস

2
ইয়াপ, আমি রাজি। প্রক্রিয়া ভেরিয়েবলটি ব্যবহার করে আপনাকে প্যাকেজ.জসোন ফাইলটি খোলার এবং পুনরায় পড়ার দরকার নেই এটির সঠিক উত্তর হওয়া উচিত।
জুয়ানমা

12
এবং নোডের বাইরে (উদাহরণস্বরূপ, শেল স্ক্রিপ্টগুলি এর মাধ্যমে কার্যকর করা হয় npm run …) সংস্করণটি পরিবেশে পরিবর্তনশীল হবে $npm_package_version
কুইন কমেন্ডেন্ট

12
যখন অন্য প্যাকেজের স্ক্রিপ্ট থেকে বলা হয়, এই ভুল সংস্করণ রিপোর্ট কলিং প্যাকেজ এবং না বলা প্যাকেজ।
jjrv

6
এটি একটি ইলেক্ট্রন অ্যাপ্লিকেশনটির সাথে কাজ করে npm startতবে এটি কোনও বিল্ট ইলেক্ট্রন অ্যাপের মধ্যে নয়: তার জন্য আপনি এটিকে খুঁজে পেতে পারেন app.getVersion
ChrisV

158

ES6 মডিউল ব্যবহার করে আপনি নিম্নলিখিতটি করতে পারেন:

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

2
আমি ভেবেছিলাম এগুলি নোডে সমর্থিত নয়: github.com/nodejs/help/issues/53
ripper234

1
কোনও এস mod মডিউল এখনও সরাসরি সমর্থিত নয় তবে সাধারণত যেভাবেই ব্যবহৃত হয়, ব্যাবেল ব্যবহার করে সক্ষম করা হয়েছে
প্যাট্রিক লি স্কট

4
@ সর্নি না, পুরো প্যাকেজ.জসন ক্লায়েন্টে থাকবে। নোড এনভায়রনমেন্ট থেকে ব্রাউজারে কেবলমাত্র নির্বাচিত তথ্য পাস করার জন্য আমি ওয়েবপ্যাকের ডিফাইন প্লাগইন ব্যবহার করেছি।
doeke

2
স্ট্যাকওভারফ্লো . com/a/10855054/540144 তে উল্লিখিত মতো কোনও সুরক্ষা জড়িত ?
itazzad 25'18

1
হ্যাঁ, একই সুরক্ষা সমস্যা। পুরো প্যাকেজ.জসন ক্লায়েন্ট বান্ডিল অন্তর্ভুক্ত করা হবে।
নেরোমেন্সার

93

বা সরল পুরানো শেল মধ্যে:

node -e "console.log(require('./package.json').version);"

এটি সংক্ষিপ্ত করা যেতে পারে

node -p "require('./package.json').version"

যদিও এই ঠিক নয় কি প্রশ্ন জিজ্ঞাসা, এটা দরকারী আপনি মধ্যে সংস্করণ ব্যবহার করতে চান তাহলে package.jsonএকটি মধ্যে একটি versioned ফাইলে লগ ইন করার উদাহরণস্বরূপ খোদ 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
@ স্টিভবেনেট নং, তবে এটি আমার পক্ষে 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বা অনুরূপ হন তবে তারা উপস্থিত থাকবে না।
Nate

@ নেট তাই সংস্করণ ব্যবহার করা ভাল package.json?
ফিলিপ Š

37

প্যাকেজ.জসনের বাইরে সংস্করণটি কীভাবে পড়বেন তা এখানে রয়েছে:

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

আমি এটি একটি গুচ্ছ দেখেছি, এবং আমি এটি পছন্দ করি - আপনি / কেউ কি বিবেচ্য বিষয়গুলি জানেন যা require() introduces? (for instance, does () ut utf8 পড়া সমর্থন করে না? আপনার স্নিপেট যেমন পরামর্শ দিতে পারে)
ইলেক্টব্লেক

4
require()ফাইলটিকে ক্যাশে করে, যা এই ক্ষেত্রে কোনও পার্থক্য করা উচিত নয়।
jlee

@ জেলি কি এমন কোনও কারণ আছে যা লোকে লোড করতে চাইলে লোকেরা সাধারণত তার JSON.parse(fs.readFileSync('package.json', 'utf8'))পরিবর্তে কাজ করে delete require.cache[require.resolve('package.json')]; require('package.json')?
মিহাইল মালোস্টানিডিস

কনস্ট {সংস্করণ} = প্রয়োজন ('./ প্যাকেজ.জসন');
dlex dykyі

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এখানে কি ?
chovy

@ শেভি, moduleএই নির্দিষ্ট উদাহরণটি পরিবর্তনশীল নয়; এটি নোড.জেএস-তে বর্তমান মডিউলটির প্রতিনিধিত্বকারী একটি পরিবর্তনশীল is : আপনি এখানে Node.js সম্পর্কে আরও মডিউল পড়তে পারেন nodejs.org/api/modules.html#modules_the_module_object
টম

2
আমি আমার মডিউল দ্বারা প্রয়োজনীয় অন্যান্য মডিউলগুলির সংস্করণটি পাওয়ার চেষ্টা করছি ... এবং pkginfo এটি সম্ভব করে তোলে কিনা তা নির্ধারণ করার জন্য আমার খুব কষ্ট হচ্ছে।
মাইকেল

23

যারা সার্ভার- সাইডেও কাজ করে এমন কোনও নিরাপদ ক্লায়েন্ট-সাইড সলিউশন সন্ধান করেন তাদের জন্য রূপান্তর রয়েছে । এটি একটি কমান্ড-লাইন সরঞ্জাম যা নিকটতম প্যাকেজ.জসন থেকে সংস্করণটি পড়ে এবং একটি আমদানিযোগ্য কমনজেএস মডিউল ফাইল তৈরি করে যা সংস্করণটি রফতানি করে। দাবি অস্বীকার: আমি একজন রক্ষণাবেক্ষণকারী।

$ genversion lib/version.js

আমি স্বীকার করি ক্লায়েন্টের পক্ষের সুরক্ষা ওপির প্রাথমিক উদ্দেশ্য ছিল না, তবে মার্ক ওয়ালেস এবং অগের উত্তরে যেমন আলোচনা করা হয়েছে , এটি অত্যন্ত প্রাসঙ্গিক এবং এটির কারণেই আমি এই প্রশ্নোত্তর খুঁজে পেয়েছি।


4
এটি উত্তর, এবং এখনই শীর্ষে গভীরতর সমস্যাযুক্ত উত্তরের উপরে উঠতে আরও বেশি ভোটের প্রয়োজন।
জেফ অ্যালেন

1
কিছু লোক এই কমান্ড লাইনের সরঞ্জাম বলে এই বিষয়টি শুনে আতঙ্কিত হতে পারে। চিন্তা করো না! সরঞ্জামটির রিডমি বর্ণনা করে যে কীভাবে (সহজেই) বিল্ডিং কলটিকে প্যাকেজ.জসন-এ সংহত করতে হবে, যাতে আপনি সরঞ্জামটির অস্তিত্ব সম্পর্কে ভুলে যেতে পারেন এবং সর্বদা সর্বশেষতম সংস্করণ নম্বরটি থাকবে।
ম্যালামুট

11

কেবলমাত্র একটি উত্তর যুক্ত করুন কারণ আমি আমার ওয়েব অ্যাপ্লিকেশনটিতে প্যাকেজ.জসন থেকে সংস্করণ অন্তর্ভুক্ত করার সর্বোত্তম উপায়টি দেখতে এই প্রশ্নটিতে এসেছি।

আমি জানি এই প্রশ্নটি নোড.জেএস এর জন্য লক্ষ্যযুক্ত, তবে আপনি যদি নিজের অ্যাপ্লিকেশনটিকে বান্ডিল করতে ওয়েবপ্যাক ব্যবহার করেন তবে কেবলমাত্র একটি অনুস্মারক হিসাবে কনফিগারেশনে এবং রেফারেন্সে একটি বিশ্বব্যাপী সংস্করণ ঘোষণা করতে DefinePlugin ব্যবহার করা উচিত । সুতরাং আপনি আপনার করতে পারেwebpack.config.json

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

...

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

এবং তারপরে AppVersionএখন এমন একটি গ্লোবাল যা আপনার ব্যবহারের জন্য উপলব্ধ। গ্লোবাল প্রোপ এর মাধ্যমে আপনার এটিকে এড়িয়ে যাওয়ার বিষয়টি নিশ্চিত .eslintrcকরুন


8

বিকল্প 1

সেরা অনুশীলন হ'ল এনএমপি এনভায়রনমেন্ট ভেরিয়েবলগুলি ব্যবহার করে প্যাকেজ.জসনের সংস্করণ।

process.env.npm_package_version

আরও তথ্য: https://docs.npmjs.com/used-npm/config.html

এটি তখনই কাজ করবে যখন আপনি এনপিএম কমান্ড ব্যবহার করে আপনার পরিষেবা শুরু করবেন।

দ্রুত তথ্য: আপনি প্রক্রিয়া.এনভি.এনপিএম_প্যাকেজ_ [কীনাম]

বিকল্প 2

ফাইল হিসাবে https://www.npmjs.com/package/dotenv ব্যবহার করে পরিবেশ পরিবর্তনশীলতে সংস্করণ স্থাপন করা হচ্ছে .envএবং এতে সম্পর্কিতprocess.env.version


7

সংস্করণ নম্বর পুনরুদ্ধার করতে এবং কনসোলটিতে সংস্করণ আউটপুট করতে আপনি প্যাকেজ.জসন আমদানি করতে 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- এ "রিসোলিউশন জসনমডুল" কে "সত্য" হিসাবে সেট করবেন ততক্ষণ কাজ করে।
রাসেল ফিলিপস

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, সমস্ত এনএমপি_ * এনভায়রনমেন্ট ভেরিয়েবল উপলভ্য।

  4. আপনি নিম্নলিখিত এনপিএম প্যাকেজগুলিও ব্যবহার করতে পারেন - রুট-প্রয়োজনীয়, পিকগিনফো, প্রকল্প-সংস্করণ।


4

আপনি প্রকল্প-সংস্করণ প্যাকেজটি ব্যবহার করতে পারেন ।

$ npm install --save project-version

তারপর

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

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

এটি এনভ ভার্চ কোনও কারণে নিখোঁজ হওয়ার ক্ষেত্রে process.env.npm_package_versionলিখিত সংস্করণে ফ্যালব্যাক ব্যবহার করে তবে package.json


উদাহরণস্বরূপ, যদি জেএস ফাইলটি এনপিএম থেকে শুরু করা হয়নি?
মিহাইল মালোস্টানিডিস

1

আমি এটি দিয়ে 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, এটি এনপিএমের মাধ্যমে শুরু করার প্রয়োজন না করার অনুরূপ । সুতরাং আপনার লাইব্রেরি সংস্করণটি পাওয়ার চেষ্টা করলে প্রকৃতপক্ষে কলারের সংস্করণটি পাওয়া যায়। একটি সাধারণ প্রয়োজন ('./ প্যাকেজ.জসন') এড়াতে পারে।
মিহাইল মালোস্টানিডিস

1

আমি জানি এটি ওপির উদ্দেশ্য নয়, তবে আমাকে কেবল এটি করতে হয়েছিল, তাই আশা করি এটি পরবর্তী ব্যক্তিকে সহায়তা করবে।

আপনি যদি নিজের সিআই / সিডি প্রক্রিয়াটির জন্য ডকার-রচনা ব্যবহার করেন তবে আপনি এটি এইভাবে পেতে পারেন!

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এবং তারপরে প্যাকেজ.জসন বৈশিষ্ট্যগুলি সার্ভার ফাইলে অ্যাক্সেস করুন।

var package = require('./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-replaceপ্লাগইনটি ক্লায়েন্টের কাছে প্যাকেজ.জসনকে প্রকাশ না করে সংস্করণ যুক্ত করতে ব্যবহার করা যেতে পারে।

// 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
    }),
  ]
};

তারপরে, উত্স কোডে, আপনার প্যাকেজ.জসন সংস্করণটি যেখানেই হোক না কেন, আপনি '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.