node.js - Npm package.json ফাইলের মধ্যে নির্ভরতা, devDependencies এবং peer dependencies মধ্যে পার্থক্য কী?
(7)
এই ডকুমেন্টেশন আমার প্রশ্ন খুব দুর্বল উত্তর। আমি যারা ব্যাখ্যা বুঝতে পারিনি। কেউ সহজ কথা বলতে পারেন? উদাহরণস্বরূপ যদি সহজ শব্দ নির্বাচন করা কঠিন হয়?
EDIT এছাড়াও peerDependencies
যোগ, যা ঘনিষ্ঠভাবে সম্পর্কিত এবং বিভ্রান্তির কারণ হতে পারে।
আপনি যদি devdependencies ইনস্টল করতে না চান তবে আপনি কেবল npm ইনস্টল - প্রডাকশন ব্যবহার করতে পারেন
আমি এই নির্ভরতা ব্যাখ্যা ব্যাখ্যা আমার ভিউ যোগ করতে চাই
-
dependencies
আপনার কোডবেসে সরাসরি ব্যবহারের জন্য ব্যবহৃত হয়, যা সাধারণত উত্পাদনের কোড বা কোডগুলির অংশে শেষ হয় -
devDependencies
বিল্ড প্রসেসের জন্য ব্যবহৃত হয়, টুলগুলি আপনাকে কীভাবে শেষ কোড শেষ করবে তা পরিচালনা করতে সহায়তা করবে, তৃতীয় পক্ষের পরীক্ষা মডিউলগুলি, (যেমন ওয়েবপ্যাক স্টাফ)
একটি npm প্যাকেজ বিতরণ করার চেষ্টা করার সময় আপনি dependencies
ব্যবহার করে এড়ানো উচিত। পরিবর্তে আপনি এটি peerDependencies
মধ্যে যোগ বিবেচনা বা dependencies
থেকে এটি মুছে ফেলার প্রয়োজন।
একটি সহজ ব্যাখ্যা যা আমাকে আরো পরিষ্কার করে তোলে:
আপনি যখন আপনার অ্যাপটি স্থাপন করেন, নির্ভরতাগুলিতে মডিউলগুলি ইনস্টল করা প্রয়োজন বা আপনার অ্যাপ্লিকেশন কাজ করবে না। আপনি যে মেশিনে ডেভেলপ করছেন না সেহেতু devdependencies এর মডিউলগুলি উত্পাদন সার্ভারে ইনস্টল করার প্রয়োজন নেই। link
গুরুত্বপূর্ণ আচরণ পার্থক্য সারসংক্ষেপ:
dependencies
উভয় ইনস্টল করা হয়:-
package.json
ধারণকারী ডিরেক্টরির মধ্যেpackage.json
npm install
-
npm install $package
অন্য কোন ডিরেক্টরিতেnpm install $package
করুন
-
devDependencies
হয়:-
package.json
ধারণকারীpackage.json
ডিরেক্টরীতেpackage.json
npm install
এnpm install
করা থাকে, যদি না আপনিpackage.json
ফ্ল্যাগটি পাস করেন ( Gayan Charith এর উত্তরের উপরে যান )। -
npm install "$package"
করা হয় নাnpm install "$package"
অন্য কোন ডিরেক্টরিতে, যদি না আপনি এটি--dev
অপশনটি না দেন। - transitively ইনস্টল করা হয় না।
-
- 3.0 এর আগে: অনুপস্থিত থাকলে সর্বদা ইনস্টল করা থাকে, এবং নির্ভরতার একাধিক অসঙ্গতিপূর্ণ সংস্করণ যদি বিভিন্ন নির্ভরতা দ্বারা ব্যবহার করা হয় তবে একটি ত্রুটি বাড়াতে হবে।
- 3.0 (আনস্টেস্টেড) থেকে শুরু হওয়া প্রত্যাশিত :
npm install
অনুপস্থিত থাকলে সতর্কতা দিন, এবং আপনাকে নিজে নির্ভরতাটি নিজে নিজে সমাধান করতে হবে। চলমান হলে, নির্ভরতা অনুপস্থিত থাকলে, আপনি একটি ত্রুটি পাবেন ( @nextgentech দ্বারা উল্লিখিত)
ট্রানজিটিভিটি ( বেন হাচিসন উল্লেখ করেছেন):
dependencies
ট্রানজিটলিভ্যালি ইনস্টল করা হয়: যদি A কে B প্রয়োজন হয়, এবং B কে C প্রয়োজন হয় তবে C ইনস্টল করা হয়, না হলে B কাজ করতে পারে না এবং এটিও হবে না।devDependencies
transitively ইনস্টল করা হয় না। উদাহরণস্বরূপ আমরা পরীক্ষা করতে B পরীক্ষা করতে হবে না, তাই B এর পরীক্ষার নির্ভরতাগুলি বাদ দেওয়া যেতে পারে।
সম্পর্কিত অপশন এখানে আলোচনা করা হয় না:
- নিম্নলিখিত প্রশ্নে আলোচনা করা হয়েছে যা বান্ডিল নির্ভরতা: এনপিএম স্বাভাবিক নির্ভরতা উপর bundled নির্ভরতা উপকারিতা
-
optionalDependencies
নির্ভরতা ( এডেন ফেল্ডম্যান দ্বারা উল্লেখ)
devDependencies
dependencies
চালানোর প্রয়োজন হয়, শুধুমাত্র devDependencies
বিকাশের জন্য, উদাহরণস্বরূপ: ইউনিট পরীক্ষা, কফিস্ক্রিপ্ট থেকে জাভাস্ক্রিপ্ট স্বচ্ছতা, খনি, ...
আপনি যদি কোনও প্যাকেজ বিকাশ করতে যাচ্ছেন, তবে আপনি এটি ডাউনলোড করুন (উদাহরণস্বরূপ, git clone
), তার root এ যান যা package.json
ধারণ করে এবং চালান:
npm install
যেহেতু আপনার কাছে প্রকৃত উত্স আছে, তাই এটি স্পষ্ট যে আপনি এটি বিকাশ করতে চান, তাই ডিফল্টরূপে উভয় dependencies
(যেহেতু আপনাকে অবশ্যই বিকাশের জন্য চালানো উচিত) এবং devDependency
নির্ভরতাগুলিও ইনস্টল করা আছে।
তবে আপনি যদি শুধুমাত্র শেষ ব্যবহারকারী হন তবে এটি ব্যবহার করার জন্য কেবল একটি প্যাকেজ ইনস্টল করতে চান, আপনি যে কোনও ডিরেক্টরি থেকে করবেন:
npm install "$package"
সেই ক্ষেত্রে, আপনি সাধারণত উন্নয়ন নির্ভরতাগুলি চান না, তাই প্যাকেজটি ব্যবহার করার জন্য আপনার যা দরকার তা ঠিক করুন: dependencies
।
আপনি যদি সত্যিই সেই ক্ষেত্রে ডেভেলপমেন্ট প্যাকেজগুলি ইনস্টল করতে চান, তবে আপনি সম্ভবত dev
কনফিগারেশন বিকল্পটি true
হিসাবে, কমান্ড লাইন থেকে সেট করতে পারেন:
npm install "$package" --dev
ডিফল্ট হিসাবে বিকল্প false
এই কম সাধারণ ক্ষেত্রে হয়।
peerDependencies
(3.0 আগে পরীক্ষিত)
উত্স: https://nodejs.org/en/blog/npm/peer-dependencies/
নিয়মিত নির্ভরতাগুলির সাথে, নির্ভরতাটির একাধিক সংস্করণ থাকতে পারে: এটি কেবল নির্ভরতাটির node_modules
এর ভিতরে ইনস্টল করা আছে।
যেমন dependency1
এবং dependency2
উভয় ভিন্ন সংস্করণগুলিতে dependency3
তে নির্ভর করে তবে প্রকল্প গাছটি দেখতে হবে:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
প্লাগইন তবে প্যাকেজ যা সাধারণত অন্যান্য প্যাকেজ প্রয়োজন হয় না, যা এই প্রসঙ্গে হোস্ট বলা হয়। পরিবর্তে:
- প্লাগইন হোস্ট দ্বারা প্রয়োজন হয়
- প্লাগইন হোস্ট আশা করে যে একটি আদর্শ ইন্টারফেস প্রস্তাব
- শুধুমাত্র হোস্ট ব্যবহারকারী দ্বারা সরাসরি বলা হবে, তাই এটি একটি একক সংস্করণ থাকা আবশ্যক।
যেমন dependency1
এবং dependency2
সহকর্মী নির্ভরতা 3 উপর dependency3
, প্রকল্প গাছ দেখতে হবে:
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
যদিও আপনি আপনার package.json
ফাইলটিতে dependency3
উল্লেখ করেন না তবে এটি ঘটে।
আমি মনে করি এটি কন্ট্রোল ডিজাইন প্যাটার্নের বিপরীত একটি উদাহরণ।
পিয়ার নির্ভরতাগুলির একটি প্রোটোটিক্যাল উদাহরণ গ্রান্ট, হোস্ট এবং এর প্লাগিন।
উদাহরণস্বরূপ, https://github.com/gruntjs/grunt-contrib-uglify মত গ্রান্ট প্লাগিনে, আপনি এটি দেখতে পাবেন:
-
peerDependency
একটিpeerDependency
- একমাত্র
require('grunt')
tests/
অধীনেtests/
: এটি আসলে প্রোগ্রাম দ্বারা ব্যবহার করা হয় না।
তারপরে, ব্যবহারকারী যখন একটি প্লাগইন ব্যবহার করবে, তখন সে Gruntfile
থেকে Gruntfile
থেকে প্লাগইনটির জন্য একটি grunt.loadNpmTasks('grunt-contrib-uglify')
লাইন যোগ করবে, তবে ব্যবহারকারীর সরাসরি কল করবে।
প্রতিটি প্লাগইন একটি ভিন্ন Grunt সংস্করণ প্রয়োজন হলে এই কাজ করবে না।
ম্যানুয়াল
আমি মনে করি ডকুমেন্টেশনটি বেশ ভালভাবে উত্তর দেয়, হয়তো আপনি কেবল নোড / অন্যান্য প্যাকেজ পরিচালকদের সাথে যথেষ্ট পরিচিত নন। আমি সম্ভবত এটি শুধুমাত্র বুঝতে কারণ আমি রুবি Bundler সম্পর্কে একটি বিট জানি।
মূল লাইন হল:
প্যাকেজটির root থেকে npm লিঙ্ক বা npm ইনস্টল করার সময় এই জিনিসগুলি ইনস্টল করা হবে এবং অন্য কোন npm কনফিগারেশন প্যারামিটারের মতো পরিচালিত হতে পারে। বিষয় উপর আরো জন্য npm- কনফিগার (7) দেখুন।
এবং তারপর npm-config (7) এর অধীনে dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
peerDependencies
উপরে বর্ণিত সিরোতে একটি ব্লগ পোস্ট থেকে এই স্নিপেটটি পড় না হওয়া পর্যন্ত peerDependencies
আমার পক্ষে মোটামুটি peerDependencies
করেননি:
প্লাগিন এবং তাদের হোস্ট প্যাকেজের মধ্যে এই "নির্ভরতা" প্রকাশ করার একটি উপায় কি [ প্লাগইন ] প্রয়োজন। বলার কিছু উপায়, "আমি কেবল আমার হোস্ট প্যাকেজের সংস্করণ 1.2.x তে প্লাগ ইন করার সময় কাজ করি, তাই যদি আপনি আমাকে ইনস্টল করেন তবে নিশ্চিত করুন যে এটি একটি সামঞ্জস্যপূর্ণ হোস্টের পাশাপাশি।" আমরা এই সম্পর্কটিকে একটি সহকর্মী নির্ভরতা বলি।
প্লাগইন হোস্টের একটি নির্দিষ্ট সংস্করণ আশা করে ...
peerDependencies
প্লাগিনগুলির জন্য, লাইব্রেরিগুলির জন্য তাদের "ফাংশন" সঞ্চালনের জন্য "হোস্ট" লাইব্রেরি প্রয়োজন, তবে হোস্টের সর্বশেষ সংস্করণটি প্রকাশ করার আগে একটি সময়ে এটি লেখা থাকতে পারে।
অর্থাৎ, যদি আমি HostLibraryX v3
জন্য PluginX v1
HostLibraryX v3
এবং দূরে চলে যাই তবে গ্যারান্টি নেই PluginX v1
HostLibraryX v4
(বা এমনকি HostLibraryX v3.0.1
) প্রকাশ করলেও কাজ করবে।
... কিন্তু প্লাগইন হোস্ট উপর নির্ভর করে না ...
প্লাগিনের দৃষ্টিকোণ থেকে, এটি কেবল হোস্ট লাইব্রেরিতে ফাংশন যোগ করে। প্লাগিনের উপর নির্ভরতা যোগ করার জন্য আমি সত্যিই হোস্টের প্রয়োজন নেই এবং প্লাগিনগুলি প্রায়ই তাদের হোস্টের উপর আক্ষরিকভাবে নির্ভর করে না। আপনি হোস্ট না থাকে, প্লাগইন harmlessly কিছুই না।
এই dependencies
প্লাগইন জন্য সত্যিই সঠিক ধারণা না মানে।
এমনকি আরও খারাপ, যদি আমার হোস্টটিকে নির্ভরতার মত আচরণ করা হয়, তবে আমরা এই পরিস্থিতির মধ্যে শেষ হয়ে যাব যে একই ব্লগ পোস্টটি উল্লেখ করেছে (এই উত্তরটির তৈরি হোস্ট এবং প্লাগইনটি ব্যবহার করতে একটু সম্পাদনা করুন):
কিন্তু এখন, [যদি আমরা প্লাগইনএক্সের নির্ভরতা হিসাবে হোস্টLibraryX এর সমসাময়িক সংস্করণটির সাথে আচরণ করি,] অপ্রত্যাশিত নির্ভরতা গ্রাফের মধ্যে Npm
npm install
ফলাফলগুলি পরিচালনা করে├── [email protected].0.0 └─┬ [email protected].0.0 └── [email protected].0.0
আমি আপনার কল্পনার মূল অ্যাপ্লিকেশনের চেয়ে ভিন্ন [HostLibraryX] API ব্যবহার করে প্লাগইন থেকে আসা সূক্ষ্ম ব্যর্থতাগুলি ত্যাগ করব।
... এবং হোস্ট স্পষ্টভাবে প্লাগইন উপর নির্ভর করে না ...
... যে প্লাগিন পুরো বিন্দু। এখন যদি হোস্টটি তার সমস্ত প্লাগিনগুলির জন্য নির্ভরতা তথ্য অন্তর্ভুক্ত করার জন্য যথেষ্ট চমৎকার ছিল তবে সমস্যাটির সমাধান হবে, তবে এটি একটি বিশাল নতুন সাংস্কৃতিক সমস্যাও চালু করবে : প্লাগইন পরিচালনা!
প্লাগইন পুরো বিন্দু তারা বেনামে জোড়া করতে পারেন। একটি নিখুঁত জগতে, হোস্ট পরিচালনা করে সবগুলি সুষ্ঠু ও পরিচ্ছন্ন হবে, তবে আমাদের লাইব্রেরি গোড়ালি বিড়ালগুলির প্রয়োজন হবে না।
আমরা যদি অনুক্রমিকভাবে নির্ভরশীল নই, তাহলে আমরা স্বতঃস্ফূর্ত সহকর্মী হতে পারি ...
পরিবর্তে, আমরা সহকর্মী হচ্ছে ধারণা আছে। উভয় হোস্ট বা প্লাগইন অন্য নির্ভরতা বালতি বসা। উভয় নির্ভরতা গ্রাফ একই স্তরে বাস।
... কিন্তু এটি একটি automatable সম্পর্ক নয়।
যদি আমি PluginX v1
এবং হোস্ট HostLibraryX v3
একটি সহকর্মী (অর্থাৎ, একটি সহকর্মীর নির্ভরতা আছে ) HostLibraryX v3
করি, তাই বলব। আপনি যদি সর্বশেষ HostLibraryX v4
স্বয়ংক্রিয়ভাবে আপগ্রেড করেন (নোটটি সংস্করণ 4 ) এবং Plugin v1
ইনস্টল করা আছে, আপনাকে ঠিক জানা দরকার?
npm
আমার জন্য এই অবস্থা পরিচালনা করতে পারবেন না -
"আরে, আমি দেখছি আপনি
PluginX v1
ব্যবহার করছেন! আমি স্বয়ংক্রিয়ভাবেHostLibraryX
v4 থেকে v3 থেকেHostLibraryX
, কে?"
... বা ...
"আরে আমি দেখি আপনি
PluginX v1
ব্যবহার করছেন। আশাHostLibraryX v3
আপনার সর্বশেষ আপডেটের সময় আপনি ধুলোতে রেখে গেছেনHostLibraryX v3
নিরাপদ হতে, আমিPlugin v1
স্বয়ংক্রিয়ভাবে আনইনস্টল করছি !! 1!
কিভাবে না, npm ?!
সুতরাং npm না। এটি আপনাকে পরিস্থিতি সম্পর্কে সতর্ক করে, এবং যদি আপনি HostLibraryX v4
Plugin v1
জন্য একটি উপযুক্ত সহকর্মী হন তবে এটি HostLibraryX v4
করতে পারেন।
কোডা
ভাল peerDependency
প্লাগইন peerDependency
ব্যবস্থাপনা এই ধারণা অনুশীলন আরও intuitively কাজ করবে। ব্লগ পোস্ট থেকে , এখনো আবার ...
পরামর্শের এক টুকরা: নিয়মিত নির্ভরশীলতার জন্য যারা ভিন্ন, পিয়ার নির্ভরতা প্রয়োজনীয়তা, লেনদেন হওয়া উচিত। আপনি আপনার প্যারার নির্ভরতা নিচে নির্দিষ্ট প্যাচ সংস্করণ লক করা উচিত নয়। চেই প্লাগিন পিয়ারের উপর নির্ভর করে চাইল 1.4.1 এর উপর নির্ভর করে এটি সত্যিই বিরক্তিকর হবে, অন্যজন চাই 1.5.0 এর উপর নির্ভরশীল, কারণ লেখক অলস ছিল এবং চায়ের প্রকৃত ন্যূনতম সংস্করণ খুঁজে বের করার সময় ব্যয় করে নি। মানানসই.
নির্ভরতা
আপনার প্রকল্পটি চালানোর প্রয়োজন এমন নির্ভরতা, লাইব্রেরির মতো যা আপনার কোড থেকে কল করা ফাংশন সরবরাহ করে।
তারা ট্রানজিটলিভ্যালি ইনস্টল করা থাকে (যদি A নির্ভর করে B উপর নির্ভর করে C, npm ইনস্টল A এ B এবং C ইনস্টল করবে)।
উদাহরণ: লোডশ: আপনার প্রকল্পটি কিছু লোডশ ফাংশন কল করে।
devDependencies
আপনার কোডটি গ্রহণকারী এবং জাভাস্ক্রিপ্ট, পরীক্ষা ফ্রেমওয়ার্ক বা ডকুমেন্টেশান জেনারেটরগুলিতে কম্পাইলারগুলির মতো, কেবলমাত্র ডেভেলপমেন্টের সময়ই এটির ডেভেলপমেন্ট বা রিলিজিংয়ের প্রয়োজন।
তারা ট্রানজিটলিভ্যালি ইনস্টল করা হয় না (যদি A B-dev-এর উপর নির্ভর করে-সিটির উপর নির্ভর করে, A এ ইনস্টল করা npm এ শুধুমাত্র B ইনস্টল করবে)।
উদাহরণ: কৃপণতা: আপনার প্রকল্প নিজেই বিল্ড ব্যবহার করে।
peerDependencies
নির্ভরশীলতা যে আপনার প্রকল্পটি মূল প্রজেক্টে হুক, বা সংশোধন করে, সাধারণত অন্য কোন লাইব্রেরি বা সরঞ্জামের জন্য একটি প্লাগইন। এটি কেবল একটি চেক হওয়া, এটি নিশ্চিত করা যে অভিভাবক প্রজেক্ট (প্রকল্প যা আপনার প্রকল্পের উপর নির্ভর করবে) আপনার হুক প্রকল্পে নির্ভরশীল। সুতরাং আপনি যদি একটি প্লাগইন সি তৈরি করেন যা লাইব্রেরিতে B কার্যকারিতা যুক্ত করে তবে কোনও প্রকল্প A কে তৈরি করা হলে এটিতে বি নির্ভরতা থাকতে হবে।
তারা ইনস্টল করা হয় না (যদি না npm <3), তারা শুধুমাত্র জন্য চেক করা হয়।
উদাহরণ: তিক্ততা: আপনার প্রকল্প কৃপণতা কার্যকারিতা যোগ করে এবং শুধুমাত্র কৃপণ ব্যবহার যে প্রকল্পে ব্যবহার করা যেতে পারে।
এই ডকুমেন্টেশনটি খুব ভালভাবে পিয়ার নির্ভরতা ব্যাখ্যা করে: https://nodejs.org/en/blog/npm/peer-dependencies/
এছাড়াও, এনপিএম ডকুমেন্টেশনটি সময়ের সাথে উন্নত করা হয়েছে, এবং এখন বিভিন্ন ধরনের নির্ভরতার আরও ভাল ব্যাখ্যা রয়েছে: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies