الحفاظ على تجمعات مكتبة الطبقة المستخدمة من خلال مشاريع متعددة

StackOverflow https://stackoverflow.com/questions/1156000

سؤال

حسنا، هنا هو السيناريو.

يحتوي المشروع على مكتبة فئة تم تطويرها (يتيح الاتصال به MyLIB). أقوم بإصدار المشروع A (في مشروع المنزل) مع الإصدار 1 من MyLIB.

أبدأ التطوير في المشروع B، ولكن قم بتوسيع MyLIB إلى الإصدار 2، بما في ذلك بعض التحسينات للأنواع الموجودة.

إذا قمت بإصدار MyLib 2 لكل من المشروع A و Project B، فسوف أضطر إلى إعادة ترجمة المشروع إلى تغييرات نوع الدعم، هل لدى أي شخص حلولا لهذه التي جربتها وصحيحة؟

هل كانت مفيدة؟

المحلول

اقتراحي: التكامل المستمر.

باستخدام أداة مثل Cruisecontrol.net، يمكنك القيام بإعادة إنشاء كل مشروع / حل، حتى يكون لديك إخراج واحد (dll) الذي تم تحميله إلى عنصر تحكم مصدر لاستخدامه من قبل مشاريع أخرى، واجهت اختبارات وحدة في كل مرة حتى تكون فيها يمكن التحقق مما إذا كانت الإضافات / التعديلات في مشروع يستخدم في الحل A لا يكسر الحل B أيضا استخدام هذا المشروع. يمكنك ضبط الإنشاء على تلقائي كل ليلة أو يؤدي إلى تشغيل واحد يدويا من تطبيق CruiseControl.net Systray.

نصائح أخرى

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

مثال من هذه المادة ما يبدو أن الملف:

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="myAssembly"
          publicKeyToken="32ab4ba45e0a69a1"
          culture="en-us" />
        <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

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

إذا كنت لا تحب اتجاه Steven لإعادة توجيه التجميع، والافتراض أنك لا ترغب في إعادة ترجمة المشروع A، يمكنك فقط نشر إصدارات مختلفة من MyLIB لكل مشروع.
بعد ذلك، ستستمر Project A فقط في استخدام الإصدار 1، وسيستخدم Project B الإصدار 2. يبدو أن هذا ما تريد أن تسمعه - وهو أمر تافه. إما وضع DLL MyLib DLL في مجلد كل مشروع (أو مجلد فرعي) وسيقوم كل مشروع بالتقاط الإصدار المحلي المعني تلقائيا، أو يمكنك استخدامها بقوة في GAC، ولديك كل مشروع استلام الإصدار المحدد الذي قمت بتجميعه مقابله.
هذا هو في الواقع السلوك الافتراضي، ولا تحتاج إلى القيام بأي شيء مجمع لتحقيق ذلك.

إعطاء ميليب أ اسم قوي و تثبيته إلى GAC. وبعد يمكن أن يكون لدى GAC إصدارات متعددة من نفس التجميع. سيتطلب إعطاء اسم قوي للإصدار 1 من MyLIB (وليس فقط الإصدار 2).

عرض الإصدار 1 من MyLiB ويجدها في GAC. يريد Project B الإصدار 2 من MyLIB ويجدها في GAC. الجميع سعداء، ولن تضطر إلى الحفاظ على 30 نسخة من الإصدارات المختلفة من MyLIB في نفس الدلائل من الجمعيات التي تستخدمها، وإعادة إنشاء DLL-HELL.

أعلم أن Avid ذكر GAC أيضا، ولكن كبديل للنسخ الخاصة عن الملفات التنفيذية. أعتقد أنه ينبغي تجنبه.

فيما يلي خيار آخر، على الرغم من أنه يجب عليك التفكير بجدية في الخيارات الأخرى أولا.

مراجع Projecta MyLib.dll، والتي تحدث أن تكون الإصدار 1.

اضبط اسم الإخراج لمشروع MyLIB لإنتاج "MyLib.2.dll". (يمكنك أيضا إنشاء مشروع جديد، لكن هذا يبدو وكأنه مبالغ فيه.)

إعادة بناء MyLIB ومضمون. سيقوم العرض الآن بالرجوع إلى MyLib.2.dll، مغادرة PROTSA و MYLIB.DLL غير متأثر تماما.

سؤالك عام جدا. ماذا تريد أن تتحول؟ يجب أن يشرح الإصدار 2 من LIB أو النسخة القديمة؟

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

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

للحفاظ على التغييرات المطلوبة صغيرة قابلة للإدارة هي مسألة تصميم كائن جيد / واجهة. ولكن كيفية القيام بذلك لا يمكن الإجابة عليه دون تفاصيل حول الكائنات الخاصة بك والتغييرات المطلوبة.

أود أن أضع كل الكود الخاص بي في عنصر تحكم إصدار مثل التخريب (استخدام الفروع والعلامات) وأتمتة عملية البناء. أنا أستعمل FinalBuilder..

لأنك تحكم في المكتبة وأوصي بذلك الافراج عن الفروع نمط .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top