Yarn: لا تحترم إضافة تبعية جديدة قيود الإصدار الحالي في الدقة

تم إنشاؤها على ١١ أكتوبر ٢٠١٧  ·  4تعليقات  ·  مصدر: yarnpkg/yarn

هل تريد طلب ميزة أو الإبلاغ عن خطأ ؟
خلل برمجي.

ما هو السلوك الحالي؟
لا يحترم الغزل أقفال الإصدار المضافة بالفعل عند حل تبعيات التبعيات المضافة حديثًا.

إذا كان السلوك الحالي عبارة عن خطأ ، فيرجى تقديم خطوات إعادة الإنتاج.

  1. ابدأ وحدة فارغة
  2. إضافة رد 15.6.1 yarn add [email protected]
  3. أضف [email protected] yarn add [email protected]
  4. يتكاثر الخطأ ويتم تثبيت نسختين مختلفتين من التفاعل:
$ yarn list react
yarn list v1.1.0
├─ [email protected]
└─ [email protected]
   └─ [email protected]
✨  Done in 0.24s.

ما هو السلوك المتوقع؟
من المتوقع أن يتم تثبيت [email protected] فقط لأن ذلك يمكن أن يفي بجميع قيود الإصدار. هذا ما يحدث إذا قمت بحذف yarn.lock بعد وجود كلا التبعيتين في package.json و yarn install ie

$ rm -rf node_modules/ yarn.lock && yarn install && yarn list react
yarn list v1.1.0
└─ [email protected]
✨  Done in 0.17s.

يرجى ذكر node.js والغزل وإصدار نظام التشغيل.

$ node --version
v6.9.4
$ yarn --version
1.2.0
$ system_profiler SPSoftwareDataType|grep "System Version"
      System Version: macOS 10.12.6 (16G29)

تحرير: تم إجراء النسخ الأصلي باستخدام الغزل 1.1.0 ، لكنني قمت بالترقية إلى 1.2.0 ولا يزال هذا يعيد إنتاجه.

cat-bug high-priority triaged

التعليق الأكثر فائدة

سوف ننظر في هذا اليوم 👍

ال 4 كومينتر

أنا أحفر في هذا ...

ملاحظة أن المعلمات التي تم تمريرها إلى PackageResolver.getHighestRangeVersionMatch(name, range, manifest) قد تكون غير صحيحة. يبدو أن range هو الإصدار الفردي الفعلي الذي تم حله ( 15.6.2 ) بدلاً من النطاق المطلوب ( ^15.5.4 ).

وهذا بدوره يتراكم حتى السطر الذي يتحقق منه لمعرفة ما إذا كانت أي إصدارات مثبتة حاليًا تتطابق مع نطاق semver: semver.maxSatisfying(["15.6.1"], '15.6.2'); // null إذا تم تمرير النطاق الصحيح ، فسيتم تنفيذ semver.maxSatisfying(["15.6.1"], '^15.5.4'); // 15.6.1 وهو ما يجب حل هذه المشكلة.

سأستمر في التراجع من خلال الكود ...

حسنًا ، يبدو أن هذا تم تقديمه بواسطة # 3729 تحديدًا السطر الموجود في package-request.js :

const solvedRange = semver.validRange(range) ? info.version : range;

لذا إذا كان النطاق ( ^15.5.4 ) صالحًا ، فإننا نستخدم info.version بدلاً من ذلك ( 15.6.2 ).
يتم تمرير ذلك لمعرفة ما إذا كانت أي إصدارات مثبتة تطابق 15.6.2 :

const maxValidRange = semver.maxSatisfying(['15.6.1'], '15.6.2'); // null

arcanis يبدو أن العلاقات العامة المرتبطة كانت ملكك. أنا متردد في تغيير أي شيء وأخاطر بإعادة فتح أي شيء يتم إصلاحه في العلاقات العامة. هل يمكنك مد يد المساعدة؟

سوف ننظر في هذا اليوم 👍

سوو ، دعنا نحاول إصلاح ذلك! لا أحب أن تعتمد الحزم على الرفع (ضع علامة على كلماتي - حتى لو قمنا بإصلاحها ، فسوف تتعطل مرة أخرى في المستقبل) ، لكننا نجعلها أقل كفاءة مما قد تكون ليست رائعة أيضًا. إعادة ما وضعته على # 5561:

أنا لا أفهم حقًا المنطق أعلاه. إذا كان النطاق semver صالحًا ، فلا تستخدمه؟

أنت محق ، هذا لا معنى له كثيرًا: / أعتقد أن ما أردت فعله هو "إذا لم يكن هذا إصدارًا ولكنه نطاق ، فاستخدم الإصدار الذي لدينا بالفعل إن أمكن" (منذ الهدف من العلاقات العامة هو عدم القيام بالتحسين عند القراءة من ملف القفل). على هذا النحو يجب أن تكون الحالة على الأرجح:

const solvedRange = semver.valid(range) && !semver.validRange(range) ? range : info.version;
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات