سؤال

هل يمكنني تعيين خيار "نسخة محلية" في Visual Studio إلى False؟ في معظم الأوقات ، عندما أقوم بإضافة DLL كاعتماد على المشروع ، أريد أن يتم تعيين النسخة المحلية للخاصية على FALSE. لكل افتراضي ، هذا صحيح. هل هناك طريقة لتغيير السلوك الافتراضي للاستوديو المرئي؟ (2008)

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

المحلول

لا - يستخدم Visual Studio مجموعة داخلية من القواعد لتحديد ما يجب تعيين نسخة محلية على.

من MSDN:

  1. إذا كان المرجع مشروعًا آخر ، يسمى مرجع مشروع إلى مشروع ، فإن القيمة هي حقيقي.
  2. إذا تم العثور على التجميع في ذاكرة التخزين المؤقت للتجميع العالمي ، فإن القيمة هي خاطئة.
  3. كحالة خاصة ، تكون قيمة مرجع mscorlib.dll خاطئة.
  4. إذا تم العثور على التجميع في مجلد SDK الإطار ، فإن القيمة هي خاطئة.
  5. خلاف ذلك ، القيمة هي حقيقي.

نصائح أخرى

في الواقع ، يمكنك. أنت بحاجة إلى بضعة أشياء:

  1. خلق .targets الملف الذي يجعل copylocal (<Private> العلامة ، لتكون دقيقة) خطأ بشكل افتراضي.
  2. استيراد الهدف في .csproj الملفات. يمكنك إضافته في السطر الأخير ، قبل الإغلاق </Project> علامة ، سوف تبدو <Import Project="..\Build\yourtarget.targets" />.

الآن كل مشروع مع هذا الهدف لديه تعطيل Copylocal بشكل افتراضي.

العيب هو أنك تحتاج إلى تعديل كل ملف CSPROJ ، بما في ذلك ملفات جديدة. يمكنك العمل حول قضية المشروع الجديدة بواسطة تعديل قالب مشروع VS. بدلاً من Class.cs الموصوفة في مقالة المدونة ، تحتاج إلى تعديل Class.vstemplate (في نفس ملف الرمز البريدي).

مع هذا النهج ، هناك مشكلة أخرى - المسار نفسه. إذا كنت تستخدم المسار النسبي المتشددين في ملفات CSPROJ التي تم إنشاؤها حديثًا ، فقد تكون خاطئة (ما لم يكن لديك بنية مشروع مسطح).

تستطيع:

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

يجب أن يكون هناك حل أفضل لذلك ، ولكن لم يجد ذلك بعد.

لا نستخدم ملفات .Targets (كما هو مقترح في الإجابة من قبل YA23) ، لذلك نقوم بتحرير فقط .csproj ملف المشروع يدويًا في محرر نصوص وأضف ملف <Private> عنصر في المرجع ، مثل هذا:

<Reference Include="[...]">
  <Private>False</Private>
  [...]
</Reference>

قيمة <Private> يطابق العنصر قيمة الخاصية "Copy Local". على سبيل المثال ، إذا <Private> تم تعيينه على خطأ ، ثم "نسخة محلية" خاطئة أيضًا ..

تصطدم هذا لأنه يبدو أن هناك الآن حزمة nuget تسمح بذلك بالضبط ...

https://nuget.org/packages/copylocalfalse

لم تجرب بعد ، فقط على أمل أن يساعد.

بدءًا من MSBuild v 15 ، يمكنك نسخ ملف واحد يسمى DIRECTORY.BUILD.PROPS في مجلد الجذر الذي يحتوي على مصدرك:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
     <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>
</Project>

لا شيء أكثر من ذلك! هذا يعمل بشكل جيد مع Visual Studio 2017 وكذلك بناء Vnext. قد تضطر إلى إغلاق Visual Studio ومن فتح الحل الخاص بك مرة أخرى لأخذ تأثير الملف.

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build#directorybuildprops-and-directorybuildtargets

فيما يتعلق بالحل الذي تم نشره بواسطة herzbube ، إذا كنت ترغب في إيقاف تشغيل "نسخة محلية" لجميع المراجع (أو معظمها) من المراجع في .csproj ملف ، لا تحتاج إلى تعيين <Private>False</Private> بشكل فردي على كل Reference, ، يمكنك فقط وضع ما يلي مباشرة في .csproj:

<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
</ItemDefinitionGroup>

هذا لا يؤثر على المشاريع المشار إليها <ProjectReference>, ، ولكن يمكنك أن تفعل الشيء نفسه-بدلاً من ذلك أو مثل هؤلاء:

<ItemDefinitionGroup>
  <ProjectReference>
    <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>

إذا كنت تريد كلاهما ، فيمكنك دمجهما في مجموعة واحدة:

<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
  <ProjectReference>
    <Private>False</Private>
  </ProjectReference>
</ItemDefinitionGroup>

تأكد من وضع هذه التجاوزات قبل الأول الفعلي <Reference ...> أو <ProjectReference ...> تريد التأثير لأن هذه الكتل لن تنطبق إلا على تلك المراجع التي تظهر أسفلها. ثم ، إذا كان هناك عدد قليل أنت فعل في الواقع تريد أن يتم نسخها محليًا ، يمكنك فقط تجاوزها الى الخلف بشكل فردي (أي ، داخل العلامة الفردية نفسها) ، هذه المرة باستخدام True.

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

كل هذا يجب أن يجعل XML في .csproj أكثر نظافة وأسهل للقراءة. ولكن هناك المزيد من الأخبار الجيدة ، لذلك اقرأ ...


أما بالنسبة لاختيار المشاريع التي يجب تمييزها <Private>False</Private> يعتمد هذا عادة على الموقف المحدد ، ولكن هناك شيء أساسي كل واحد يستطيع و ينبغي فعل للمبتدئين. إنها خطوة أساسية وبسيطة وفعالة وتوفر مثل هذه الضخمة msbuild تحسينات الموثوقية1. وتسريع وقت البناء-ومع القليل من الجانب السلبي-كل حل كبير يستخدم الافتراضي (أي محلي لكل مشروع) ج# يجب أن تجعل مواقع الإخراج دائمًا هذا التعديل:

في أي حل Visual Studio الذي يبني متعددة C# مكتبات الفصل مع أي عدد غير تافهة <ProjectReference> البيع البيني ، والتي تتوج ببناء واحد آخر التطبيقات (أي التنفيذيين):

  1. بالقرب من الجزء العلوي. csproj لكل مكتبة الفصل, ، أدخل ال <ProjectReference> كتلة موضحة أعلاه.
    السبب: ليست هناك حاجة لأي .dll لجمع أي من المكتبات التي تشير إليها إلى دليل فرعي خاص بها ، حيث لا يتم تشغيل أي شخص من هذا الموقع. مثل هذا النسخ المتفشي هو عمل مشغول عديمة الفائدة وقد يتباطأ بشكل غير ضروري بنيتك ، وربما بشكل كبير.

  2. من ناحية أخرى ، افعل ليس تعديل .csproj لأي من الحلول الخاصة بك التطبيقات.
    السبب: يحتاج التنفيذيون إلى الحصول على جميع المكتبات الخاصة التي يحتاجونها في المخرجين الفرعيين ، ولكن يجب أن يكون البناء لكل تطبيق وحده مسؤولاً عن جمع كل تبعية بشكل فردي ، مباشرة من الدليل الفرعي الخاص به ، إلى فرعي التطبيق- الدليل.

هذا يعمل بشكل مثالي لأن .csproj لمكتبة الفصل قد يشير إلى العديد من مكتبات الفصول الدراسية الأخرى ، ولكن .csproj لـ exectable لا يشير أبدًا إلى آخر قابلة للتنفيذ. وبالتالي ، لكل مكتبة محلية ، الوحيدة .dll فيها bin سيكون المجلد هو نفسه ، في حين أن كل تطبيق مصمم محليًا سيحتوي على مجموعة كاملة من المكتبات المصممة محليًا التي تشير إليها.

مريح ، لا شيء يتغير للمكتبات المشار إليها التي لا يتم بناؤها بواسطة الحل الخاص بك ، لأن هذه تستخدم عادة <Reference> بدلاً من <ProjectReference>, ، ولم نقم بتعديل العلامة السابقة على الإطلاق. لكن لاحظ الافتراض المذكور للتو ؛ إذا تم انتهاكها من قبل بعض مشاريعك ، فقد تحتاج إلى إجراء بعض التعديلات.

1.] يمكن أن تكون تحسينات الموثوقية مرتبطة بتصادمات الملفات التي قد تحدث عند جمع نفس المكتبة من مسارات مفككة متعددة في رسم بياني التبعية ، وخاصة في التصميم المتزامن.

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