كيف يمكنك مشاركة التبعيات الخارجية بين Visual Studio Solutions؟

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

سؤال

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

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

أدركت أن هناك حلًا واحدًا هو تضمين المكتبات الخارجية في "مشروع المكتبة" المدرجة في جميع الحلول والسماح للمشاريع الأخرى بمراجعها من خلالها. (أو فقط تأكد من الرجوع إلى DLL الخارجي من نفس المكان لجميع المشاريع.)

ولكن هل هناك طرق أفضل للقيام بذلك؟ (يفضل استخدام نوع من المكونات الإضافية لـ Visual Studio.)

لقد نظرت إلى Visual Studio Dependency Manager ويبدو أنها مباراة مثالية ولكن هل جربها أي شخص حقيقي؟ لقد رأيت أيضًا منافذ .NET من Maven ، لكن لسوء الحظ ، لم أكن معجبًا جدًا بحالة هؤلاء. (ولكن يرجى المضي قدمًا والتوصية بهم إذا كنت تعتقد أنني يجب أن أعطيهم محاولة أخرى.)

إذن ما هي أذكى طريقة لمعالجة هذه المشكلة؟

تحديث:

أدركت أنني بحاجة لشرح ما قصدته الارتباط بنفس مجموعة DLL.

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

تحديث 2:لاحظ أن هذا سؤال قديم يتم طرحه قبل أدوات مثل nuget أو OpenWrap موجود. إذا كان أي شخص على استعداد لتقديم المزيد من الحوادث ، فيرجى المضي قدمًا وسأغير الإجابة المقبولة.

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

المحلول

  1. ابحث عن مكان لتخزين التجميعات. على سبيل المثال ، أقوم بتخزين مجموعات .NET الأساسية مثل ذلك:

    • <branch> netfx 2.0527\*
    • <branch> netfx 3.0\*
    • <branch> netfx 3.5\*
    • <branch> netfx silverlight 2\*
    • <branch> netfx silverlight 3\*
  2. استخدم خاصية WeveringPath في MSBUILD (أو الإضافية في Build Team) لتوجيه مشاريعك إلى المسارات المناسبة. من أجل البساطة وسهولة الصيانة ، لدي ملف 1 *.Targets يعرف كل دليل من هذا القبيل ؛ جميع مشاريعي تستورد هذا الملف.

  3. تأكد من أن استراتيجية التحكم في الإصدار (المتفرعة ، الدمج ، تعيينات <->-> خادم) تحافظ على المسارات النسبية بين مشاريعك ومساراتك المرجعية ثابتة.

تعديل

رداً على التحديث في السؤال ، اسمحوا لي أن أضيف خطوة أخرى:

4) تأكد من أن كل مرجع تجميع في كل ملف مشروع يستخدم اسم .NET القوي الكامل ولا شيء آخر.

سيئ:

<Reference Include="Microsoft.SqlServer.Smo">
  <SpecificVersion`>False</SpecificVersion>
  <HintPath>..\..\..\..\..\..\..\Program Files (x86)\Microsoft SQL Server\100\Shared\Microsoft.SqlServer.Smo.dll</HintPath>
</Reference>

جيد:

<Reference Include="Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL" />

مزايا التنسيق الأخير:

  • إن استخدام HintPath في بيئة تنمية تعاونية سيؤدي حتماً إلى مواقف "تعمل بالنسبة لي" ولكن ليس غيرها. خاصة خادم البناء الخاص بك. إن حذفه يجبرك على تصحيح مساراتك المرجعية أو لن يتم تجميعها.
  • باستخدام اسم ضعيف يدعو إلى إمكانية "DLL Hell". بمجرد استخدام أسماء قوية ، يكون من الآمن أن يكون لديك إصدارات متعددة من نفس التجميع في مساراتك المرجعية لأن الرابط لن يحمل سوى تلك التي تتطابق مع كل معيار. بالإضافة إلى ذلك ، إذا قررت تحديث بعض التجميعات في مكانها (بدلاً من إضافة نسخ) ، فسوف يتم إخطارك بأي تغييرات كسر في وقت الترجمة بدلاً من كلما بدأت الحشرات في الوصول.

نصائح أخرى

إضافة إلى ما يقوله أي شخص آخر ، فإن الأمر يتعلق بشكل أساسي إلى شيئين:

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

كما يشير ريتشارد بيرج ، يمكنك استخدام مرجع و/أو إضافية للمساعدة في حل #2. إذا كنت تستخدم MSBUILD في عملية الإنشاء الخاصة بك (في حالتنا ، فإننا نستخدم Cruisecontrol بدلاً من MS Team Build) ، يمكنك أيضًا تمرير Passing Wath على سطر الأوامر. لحل #1 ، لقد وجدت SVN: الخارجيات لتكون مفيدة (إذا كنت تستخدم SVN).

تجربتي مع Maven هي أنها تفرط في معظم الأغراض.

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

عام الخارجي المكتبات nunit 2.6

أو

Public Internal Libraries Logger 5.4.312

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

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