node.js شرح ما الفرق بين التبعيات و devDependencies و peerDependencies في ملف npm package.json؟




npm شرح (7)

هذه الوثائق يجيب على سؤالي سيئة للغاية. لم أفهم تلك التفسيرات. يمكن للشخص أن يقول في كلمات أبسط؟ ربما مع أمثلة إذا كان من الصعب اختيار كلمات بسيطة؟


أود أن أضيف للإجابة وجهة نظري حول تفسيرات هذه التبعيات

  • يتم استخدام dependencies للاستخدام المباشر في التعليمات البرمجية الخاصة بك ، الأشياء التي عادة ما ينتهي بها الأمر في رمز الإنتاج ، أو أجزاء من الكود
  • يتم استخدام devDependencies في عملية devDependencies ، وهي الأدوات التي تساعدك على إدارة كيفية انتهاء رمز النهاية ، ووحدات اختبار الطرف الثالث (مثل عناصر حزمة الويب)

تبعيات
التبعيات التي يحتاجها مشروعك للتشغيل ، مثل المكتبة التي توفر الوظائف التي تتصل بها من شفرتك.
يتم تثبيتها بشكل عابر (إذا كانت A تعتمد على B وتعتمد على C ، فستقوم تثبيت npm على A بتثبيت B و C).
مثال: lodash: مشروعك يستدعي بعض وظائف lodash.

devDependencies
التبعيات التي تحتاج إليها فقط أثناء التطوير أو التحرير ، مثل المجمعين الذين يأخذون شفرتك وتجميعها في javascript أو أطر الاختبار أو مولدات الوثائق.
لم يتم تثبيتها بشكل عابر (إذا كانت A تعتمد على B-dev تعتمد على C ، فسيتم تثبيت npm على A فقط B).
مثال: grunt: يستخدم مشروعك grunt لبناء نفسه.

peerDependencies
التبعيات التي يربطها مشروعك أو يتم تعديلها في المشروع الأصل ، عادة ما تكون مكونًا إضافيًا لبعض المكتبات أو الأدوات الأخرى. الغرض منه هو فقط إجراء فحص ، والتأكد من أن المشروع الرئيسي (المشروع الذي يعتمد على مشروعك) يعتمد على المشروع الذي تدخله. لذا ، إذا قمت بإنشاء مكون C يضيف وظائف للمكتبة B ، فسيحتاج شخص ما يقوم بإنشاء مشروع A إلى الاعتماد على B إذا كان لديه اعتماد على C.
لم يتم تثبيتها (ما لم يكن npm <3) ، يتم فحصها فقط.
مثال: grunt: مشروعك يضيف وظائف للنخر ويمكن استخدامه فقط في المشروعات التي تستخدم grunt.

تشرح هذه الوثائق تبعيات النظراء بشكل جيد: https://nodejs.org/en/blog/npm/peer-dependencies/

أيضًا ، تم تحسين وثائق npm بمرور الوقت ، ولديها الآن تفسيرات أفضل لأنواع مختلفة من التبعيات: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies


هناك بعض الوحدات والطرود الضرورية فقط للتنمية ، والتي ليست ضرورية في الإنتاج. كما تقول إنها في documentation :

إذا كان هناك شخص ما يخطط لتنزيل واستخدام الوحدة الخاصة بك في برنامجهم ، فمن المحتمل أنهم لا يريدون أو يحتاجون إلى تنزيل وبناء إطار الاختبار أو الوثائق الخارجية الذي تستخدمه. في هذه الحالة ، من الأفضل إدراج هذه العناصر الإضافية في تجزئة devDependencies.


ملخص الاختلافات السلوكية الهامة:

  • يتم تثبيت dependencies على كلا:

    • npm install من دليل يحتوي على package.json
    • npm install $package على أي دليل آخر
  • devDependencies :

    • أيضا تثبيت على npm install على دليل يحتوي على package.json ، إلا إذا قمت بتمرير علم - --production (الذهاب إجابة upvote غايان Charith ).
    • غير مثبت على npm install "$package" على أي دليل آخر ، ما لم تعطيه خيار --dev .
    • غير مثبتة بشكل عابر.
  • peerDependencies :

    • قبل 3.0: يتم تثبيتها دائمًا في حالة فقدها ، ورفع خطأ في حالة استخدام إصدارات غير متوافقة متعددة من التبعية بواسطة تبعيات مختلفة.
    • المتوقع بدءاً من 3.0 (لم يتم اختباره): تقديم تحذير إذا كان مفقودًا على npm install ، وكان عليك حل التبعية بنفسك يدويًا. عند التشغيل ، إذا كانت التبعية مفقودة ، فستحصل على خطأ (تم ذكره بواسطة @nextgentech )
  • العبور (ذكره بن هوتشيسون ):

    • يتم تثبيت dependencies بشكل عابر: إذا كانت A تتطلب B ، وتحتاج B إلى C ، عندئذ يتم تثبيت C ، وإلا فإن B لا يمكنها العمل ، ولن أ.

    • لم يتم تثبيت devDependencies بشكل devDependencies . على سبيل المثال ، لا نحتاج إلى اختبار B لاختبار A ، لذا يمكن ترك تبعيات الاختبار لـ B.

خيارات ذات صلة لم تتم مناقشتها هنا:

devDependencies

مطلوب dependencies لتشغيل ، devDependencies فقط لتطوير ، على سبيل المثال: اختبارات الوحدة ، Coffeescript إلى transfilation جافا سكريبت ، minification ، ...

إذا كنت ستقوم بتطوير حزمة ، يمكنك تنزيلها (على سبيل المثال عبر git clone ) ، انتقل إلى جذرها الذي يحتوي على package.json ، وقم بتشغيل:

npm install

نظرًا لأن لديك المصدر الفعلي ، فمن الواضح أنك تريد تطويره ، لذلك بشكل افتراضي كلتا dependencies (بما أنه يجب عليك طبعاً تشغيله) devDependency الاعتمادات devDependency أيضاً.

إذا كنت أنت فقط مستخدمًا نهائيًا يريد فقط تثبيت حزمة لاستخدامها ، فستفعل من أي دليل:

npm install "$package"

في هذه الحالة ، لا ترغب عادةً في تبعيات التطوير ، بحيث تحصل فقط على ما هو مطلوب لاستخدام الحزمة: dependencies .

إذا كنت تريد بالفعل تثبيت حزم تطوير في هذه الحالة ، فيمكنك تعيين خيار dev config على true ، ربما من سطر الأوامر على النحو التالي:

npm install "$package" --dev

يكون الخيار غير false افتراضيًا لأن هذه الحالة أقل شيوعًا.

peerDependencies

(تم اختباره قبل الإصدار 3.0)

المصدر: https://nodejs.org/en/blog/npm/peer-dependencies/

باستخدام تبعيات منتظمة ، يمكنك الحصول على إصدارات متعددة من التبعية: يتم تثبيتها ببساطة داخل node_modules من التبعية.

على سبيل المثال ، إذا dependency1 كل من dependency2 و dependency2 على dependency3 في إصدارات مختلفة ، فسوف تبدو شجرة المشروع كما يلي:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

ومع ذلك ، فالمكونات الإضافية هي حزم لا تتطلب عادةً الحزمة الأخرى ، والتي تُسمى المضيف في هذا السياق. في حين أن:

  • المكونات الإضافية مطلوبة من قبل المضيف
  • توفر المكونات الإضافية واجهة قياسية يتوقع المضيف العثور عليها
  • فقط سيتم استدعاء المضيف مباشرة من قبل المستخدم ، لذلك يجب أن يكون هناك نسخة واحدة منه.

على سبيل المثال ، إذا dependency1 dependency2 ونظير dependency2 على dependency3 ، فسوف تبدو شجرة المشروع كما يلي:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

يحدث هذا على الرغم من أنك لم تذكر أبدًا dependency3 في ملف package.json الخاص بك.

أعتقد أن هذا مثال على نمط تصميم انقلاب التحكم .

مثال نموذجي على التبعية الأقران هو Grunt ، والمضيف ، والمكونات الإضافية الخاصة به.

على سبيل المثال ، في المكون الإضافي Grunt مثل https://github.com/gruntjs/grunt-contrib-uglify ، سترى ما يلي:

  • grunt هو peerDependency
  • فقط require('grunt') هو قيد tests/ : لا يتم استخدامه بالفعل من قبل البرنامج.

بعد ذلك ، عندما يستخدم المستخدم المكوِّن الإضافي ، سيتطلب ضمنيًا المكوّن الإضافي من Gruntfile بإضافة grunt.loadNpmTasks('grunt-contrib-uglify') ، ولكن grunt الذي grunt.loadNpmTasks('grunt-contrib-uglify') المستخدم مباشرةً.

هذا لن ينجح إذا كان كل ملحق يتطلب نسخة Grunt مختلفة.

كتيب

أعتقد أن المستند يجيب على السؤال بشكل جيد ، ربما أنت لست معتادًا بما فيه الكفاية مع العقدة / مديري الحزم الآخرين. ربما أفهم ذلك فقط لأنني أعرف القليل عن باور روبي.

خط المفتاح هو:

سيتم تثبيت هذه الأشياء عند إجراء رابط npm أو تثبيت npm من جذر الحزمة ، ويمكن إدارتها مثل أي معلمة تكوين npm أخرى. انظر npm-config (7) لمزيد من الموضوع.

ثم تحت عنوان npm-config (7) ، ابحث عن dev :

Default: false
Type: Boolean

Install dev-dependencies along with packages.

إذا كنت لا ترغب في تثبيت devDependencies يمكنك ببساطة استخدام npm install --production


التفسير البسيط الذي جعلها أكثر وضوحًا بالنسبة لي هو:

عند نشر تطبيقك ، يلزم تثبيت الوحدات النمطية في تبعيات أو لن يعمل تطبيقك. لا يلزم تثبيت الوحدات النمطية في devDependencies على خادم الإنتاج حيث أنك لا تطور على هذا الجهاز. link


على سبيل المثال ، عادةً ما يكون mocha عبارة عن devDependency ، حيث أن الاختبار ليس ضروريًا في الإنتاج ، في حين أن التعبير عن ذلك سيكون تبعية.







npm