تايب سكريبت - كيف يمكنني جعل اعتماد النظير اختياريًا؟
أنا أطور الوحدة أ. يمكن للمستخدم، اختيارياً، دمج مسجل Winston في وحدتي، لذلك winston هو تبعية نظير لها.
كلما قمت بتثبيت الوحدة الخاصة بي A في وحدة أخرى حيث لا أرغب في تسجيل الأمور (لذلك لا أدرج Winston) وحاولت tsc، يصرخ TypeScript:
لا يمكن العثور على الوحدة 'winston' أو التصريحات النوعية المقابلة لها.
كيف أقوم بذلك؟
الإجابة رقم 1
منذ إصدار NPM v7.x، يمكنك استخدام إعداد peerDependenciesMeta في ملف package.json، والذي يسمح بهذا الخيار بالضبط.
على سبيل المثال، في package.json الخاص بـ "الوحدة أ":
"peerDependencies": {
"winston": "> 1.0.0 <= 1.2.10",
"foo": "~2.3.0"
},
"peerDependenciesMeta": {
"winston": {
"optional": true
}
}
في هذه الحالة، عند تثبيت الوحدة أ كمكتبة تابعة لمشروع آخر، سيسمح بتثبيت نسخة اعتماد winston ضمن نطاق semver المحدد > 1.0.0 <= 1.2.10، ولكن إذا لم تكن موجودة على الإطلاق، فلن تتلقى أخطاء، لذلك سيتم السماح بها أيضًا.
لاحظ أنه باتباع هذا المثال، ستظل الحاجة إلى تبعية foo قائمة لأنها لم تُحدد على أنها اختيارية.
نصيحة إضافية: يمكنك التحقق من النطاقات واختبارها على الحزم المتاحة في NPM باستخدام هذه الأداة https://semver.npmjs.com/، لقد ساعدتني أيضًا.
ملاحظة: هذه إجابتي الأولى على SO! :)
الإجابة رقم 2
إضافة صغيرة على جواب @tmilar. أنا أستخدم نفس الطريقة لإضافة تبعية اختيارية (وأيضًا winston :)) المثال لـ npm@7 الذي يدعم peerDependenciesMeta
"peerDependencies": {
"winston": "~3.3.0"
},
"peerDependenciesMeta": {
"winston": {
"optional": true
}
}
بالنسبة للتابعيات الاختيارية، يجب أن تتوقع استثناءات عند استخدام require والتحقق من إصدارات الحزمة
let winston;
let winstonVersion;
try {
winston = require('winston')
winstonVersion = require('winston/package.json').version
} catch (er) {
winston = null
}
if (isUnsupportedVersion(winstonVersion) ) {
winston = null
}
// .. then later in your program ..
if (winston) {
winston.doSomething()
}
