سؤال

لدي حل مع مشروع متعدد.أحاول تحسين ملفات AssemblyInfo.cs عن طريق ربط ملف معلومات التجميع على مستوى الحل الواحد.ما هي أفضل الممارسات للقيام بذلك؟ما هي السمات التي يجب أن تكون في ملف الحل الواسع وما هي السمات الخاصة بالمشروع/التجميع؟


يحرر:إذا كنت مهتمًا، فهناك سؤال للمتابعة ما هي الاختلافات بين AssemblyVersion وAssemblyFileVersion وAssemblyInformationalVersion؟

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

المحلول

نحن نستخدم ملفًا عالميًا يسمى GlobalAssemblyInfo.cs وملفًا محليًا يسمى AssemblyInfo.cs.يحتوي الملف العمومي على السمات التالية:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

يحتوي AssemblyInfo.cs المحلي على السمات التالية:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

يمكنك إضافة GlobalAssemblyInfo.cs باستخدام الإجراء التالي:

  • يختار إضافة/عنصر موجود... في قائمة السياق للمشروع
  • حدد GlobalAssemblyInfo.cs
  • قم بتوسيع زر الإضافة من خلال النقر على هذا السهم الصغير الموجود لأسفل على اليد اليمنى
  • حدد "إضافة كرابط" في القائمة المنسدلة للأزرار

نصائح أخرى

في حالتي، نحن نبني منتجًا لدينا حل Visual Studio له، مع مكونات مختلفة في مشاريعهم الخاصة.تذهب السمات المشتركة.يوجد في الحل حوالي 35 مشروعًا ومعلومات التجميع المشتركة (CommonAssemblyInfo.cs)، والتي تتميز بالسمات التالية:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

أما السمات الأخرى مثل AssemblyTitle وAssemblyVersion وما إلى ذلك، فنوفرها على أساس كل تجميع.عند إنشاء تجميع، يتم دمج كل من AssemblyInfo.cs وCommonAssemblyInfo.cs في كل تجميع.وهذا يمنحنا أفضل ما في العالمين حيث قد ترغب في الحصول على بعض السمات المشتركة لجميع المشاريع وقيم محددة لبعض المشاريع الأخرى.

امل ان يساعد.

الحل الذي قدمتهJRoppert هو تقريبًا نفس ما أقوم به.والفرق الوحيد هو أنني وضعت الأسطر التالية في ملف AssemblyInfo.cs المحلي حيث يمكن أن تختلف مع كل تجميع:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

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

[assembly: AssemblyInformationalVersion("0.9.2.0")]

والذي سيحدد قيمة "ProductVersion" التي يعرضها مستكشف Windows.

مهام المجتمع MSBuild يحتوي على مهمة مخصصة تسمى AssemblyInfo والتي يمكنك استخدامها لإنشاء Assemblyinfo.cs الخاص بك.يتطلب الأمر القليل من التحرير اليدوي لملفات csproj لاستخدامه، ولكنه يستحق العناء.

في رأيي، يعد استخدام GlobalAssemblyInfo.cs مشكلة أكثر مما يستحق، لأنك تحتاج إلى تعديل كل ملف مشروع وتذكر تعديل كل مشروع جديد، بينما تحصل على AssemblyInfo.cs افتراضيًا.

للتغييرات في القيم العالمية (أي.الشركة والمنتج وما إلى ذلك) عادة ما تكون التغييرات نادرة جدًا وسهلة الإدارة، لا أعتقد ذلك جاف ينبغي أن يكون الاعتبار.ما عليك سوى تشغيل البرنامج النصي MSBuild التالي (يعتمد على ملف حزمة ملحق MSBuild) عندما تريد تغيير القيم يدويًا في كافة المشاريع لمرة واحدة:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>

لمشاركة ملف بين مشاريع متعددة، يمكنك إضافة ملف موجود كرابط.

للقيام بذلك، قم بإضافة ملف موجود، ثم انقر فوق "إضافة كرابط" في محدد الملف.Add As Link
(مصدر: free.fr)

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

لا يُنصح باستخدام ملف AseemblyInfo.cs واحد لمشاريع متعددة.يتضمن ملف AssemblyInfo معلومات قد تكون ذات صلة بهذا التجميع المحدد فقط.المعلومتان الأكثر وضوحًا هما AssemblyTitle و AssemblyVersion.

قد يكون الحل الأفضل هو الاستخدام targets الملف، الذي تتم معالجته بواسطة MSBuild، من أجل "حقن" سمات التجميع في أكثر من مشروع واحد.

أحد الأشياء التي وجدتها مفيدة هو إنشاء عناصر AssemblyVersion (إلخ) من خلال تطبيق استبدال الرمز المميز في مرحلة ما قبل الإنشاء.

أستخدم TortoiseSvn، ومن السهل استخدامه SubWCRev.exe لتحويل القالب AssemblyInfo.wcrev داخل AssemblyInfo.cs.قد يبدو السطر ذو الصلة في القالب كما يلي:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

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

بالمناسبة، إضافة AssemblyInfo.wcrev للتحكم في الإصدار الخاص بك و يتجاهل AssemblyInfo.cs إذا كنت تستخدم هذا.

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