نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

عند تطوير المكونات الإضافية لتطبيقات CAD (في حالتي هذه هي AutoCAD و Revit و Renga) بمرور الوقت ، تظهر مشكلة واحدة - يتم إصدار إصدارات جديدة من البرامج ، وتغييرات واجهة برمجة التطبيقات (API) الخاصة بها ، ويجب إجراء إصدارات جديدة من المكونات الإضافية.

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

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

أولاً ، دعونا نلقي نظرة على طريقة واضحة والتي استخدمتها لفترة طويلة

روابط لملفات المشروع

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

لنفتح Visual Studio (لدي إصدار Community 2019. ونعم - باللغة الروسية) وننشئ حلًا جديدًا. دعنا نسميها MySuperPluginForRevit

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

سنقوم بإنشاء مكون إضافي لبرنامج Revit للإصدارات 2015-2020. لذلك ، سوف أقوم بإنشاء مشروع جديد في الحل (Net Framework Class Library) وأطلق عليه اسم MySuperPluginForRevit_2015

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

نحتاج إلى إضافة مراجع إلى Revit API. بالطبع ، يمكننا إضافة روابط إلى الملفات المحلية (ستحتاج إلى تثبيت جميع حزم SDK الضرورية أو جميع إصدارات Revit) ، لكننا سنمضي قدمًا في تضمين حزمة NuGet. يمكنك العثور على عدد غير قليل من الحزم ، لكنني سأستخدم حزمتي الخاصة.

بعد توصيل الحزمة ، انقر بزر الماوس الأيمن فوق العنصر "مراجع"وحدد عنصر القائمة"نقل الحزم تكوين إلى PackageReference ...»

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

إذا بدأت فجأة في الذعر في هذا المكان ، حيث لن يكون هناك عنصر مهم في نافذة خصائص الحزمة "نسخ محليا"، والذي نحتاج بالتأكيد إلى ضبطه عليه زائف، ثم لا داعي للذعر - انتقل إلى مجلد المشروع ، وافتح الملف بامتداد .csproj في محرر مناسب لك (أستخدم Notepad ++) وابحث عن إدخال حول الحزمة الخاصة بنا هناك. هي تبدو هكذا الآن:

<PackageReference Include="ModPlus.Revit.API.2015">
  <Version>1.0.0</Version>
</PackageReference>

إضافة خاصية لها مدة العرض. سوف يتحول مثل هذا:

<PackageReference Include="ModPlus.Revit.API.2015">
  <Version>1.0.0</Version>
  <ExcludeAssets>runtime</ExcludeAssets>
</PackageReference>

الآن ، عند إنشاء مشروع ، لن يتم نسخ الملفات من الحزمة إلى مجلد الإخراج.
دعنا نمضي قدمًا - تخيل فقط أن المكون الإضافي الخاص بنا سيستخدم شيئًا من Revit API ، والذي تغير بمرور الوقت مع إصدار إصدارات جديدة. حسنًا ، أو نحتاج فقط إلى تغيير شيء خاص بنا في الكود ، اعتمادًا على إصدار Revit الذي نصنع المكون الإضافي له. لحل هذه الاختلافات في الكود ، سنستخدم رموز الترجمة الشرطية. افتح خصائص المشروع ، انتقل إلى علامة التبويب "جمعية"وفي الميدان"تدوين الترجمة الشرطي" يكتب RX450.

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

لاحظ أنه يجب إضافة الرمز لكل من تكوين التصحيح وتكوين الإصدار.

حسنًا ، أثناء وجودنا في نافذة الخصائص ، ننتقل على الفور إلى علامة التبويب "تطبيق"وفي الميدان"مساحة الاسم الافتراضية»إزالة اللاحقة _2015بحيث تكون مساحة الاسم لدينا عالمية ومستقلة عن اسم التجميع:

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

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

دعنا ننتقل إلى كود الملف Class1.cs ومحاكاة بعض التعليمات البرمجية هناك ، مع مراعاة الإصدارات المختلفة من Revit:

namespace MySuperPluginForRevit
{
    using Autodesk.Revit.Attributes;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;

    [Regeneration(RegenerationOption.Manual)]
    [Transaction(TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
#if R2015
            TaskDialog.Show("ModPlus", "Hello Revit 2015");
#elif R2016
            TaskDialog.Show("ModPlus", "Hello Revit 2016");
#elif R2017
            TaskDialog.Show("ModPlus", "Hello Revit 2017");
#elif R2018
            TaskDialog.Show("ModPlus", "Hello Revit 2018");
#elif R2019
            TaskDialog.Show("ModPlus", "Hello Revit 2019");
#elif R2020
            TaskDialog.Show("ModPlus", "Hello Revit 2020");
#endif
            return Result.Succeeded;
        }
    }
}

أخذت على الفور في الاعتبار جميع إصدارات Revit فوق إصدار 2015 (الذي كان وقت كتابة المقال) وأخذت في الاعتبار على الفور وجود رموز تجميع شرطية أقوم بإنشائها وفقًا لنفس القالب.

دعنا ننتقل إلى التمييز الرئيسي. نقوم بإنشاء مشروع جديد في حلنا ، فقط للإصدار الإضافي ضمن Revit 2016. نكرر جميع الخطوات الموضحة أعلاه ، على التوالي ، مع استبدال الرقم 2015 برقم 2016. لكن الملف Class1.cs تمت إزالته من المشروع الجديد.

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

ملف مع الكود المطلوب - Class1.cs - لدينا بالفعل ونحتاج فقط إلى إدخال رابط له في مشروع جديد. توجد طريقتان لإدراج الروابط:

  1. طويل - اضغط على المشروع بزر الفأرة الأيمن ، حدد العنصر "إضافة"->"عنصر موجود"، في النافذة التي تفتح ، ابحث عن الملف المطلوب وبدلاً من الخيار"إضافة»تحديد خيار«أضف كارتباط»

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

  1. باختصار - في مستكشف الحلول مباشرةً ، حدد الملف المطلوب (أو حتى الملفات. أو حتى المجلدات بأكملها) واسحبه إلى مشروع جديد أثناء الضغط باستمرار على مفتاح Alt. عند السحب ، سترى أنه عند الضغط على مفتاح Alt ، سيتغير مؤشر الماوس من علامة الجمع إلى سهم.
    UPD: لقد أحدثت بعض الارتباك في هذه الفقرة - لنقل عدة ملفات ، يجب عليك تثبيت Shift + Alt!

بعد الإجراء ، سيكون لدينا ملف في المشروع الثاني Class1.cs بالأيقونة المقابلة (السهم الأزرق):

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

عند تحرير الكود في نافذة المحرر ، يمكنك أيضًا الاختيار في سياق المشروع الذي تريد عرض الكود ، مما سيسمح لك بمشاهدة الكود الذي يتم تحريره برموز تجميع شرطية مختلفة:

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

وفقًا لهذا المخطط ، نقوم بإنشاء جميع المشاريع الأخرى (2017-2020). اختراق الحياة - إذا قمت بسحب الملفات في مستكشف الحلول ليس من المشروع الأساسي ، ولكن من المشروع حيث تم إدراجها بالفعل كرابط ، فلا يمكنك الضغط باستمرار على مفتاح Alt!

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

تكوين ماجيك

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

ولجعل كل شيء أكثر وضوحًا ، لن ننشئ مشروعًا جديدًا ، لكننا سنجري تغييرات على مشروعنا الحالي الذي تم إنشاؤه بالطريقة الأولى.

لذلك ، أولاً وقبل كل شيء ، نقوم بإزالة جميع المشاريع من الحل ، باستثناء المشروع الرئيسي (الذي يحتوي على الملفات مباشرة). أولئك. مشاريع للإصدارات 2016-2020. افتح المجلد الذي يحتوي على الحل واحذف مجلدات هذه المشاريع هناك.

لدينا مشروع واحد متبقي في الحل - MySuperPluginForRevit_2015. افتح خصائصه و:

  1. في علامة التبويب "تطبيق»إزالة اللاحقة من اسم التجميع _2015 (سيتضح السبب لاحقًا)
  2. في علامة التبويب "جمعية»إزالة رمز الترجمة الشرطية RX450 من المجال المقابل

ملاحظة: هناك خلل في أحدث إصدار من Visual Studio - لا يتم عرض رموز الترجمة الشرطية في نافذة خصائص المشروع ، على الرغم من توفرها. إذا كان لديك هذا الخلل ، فأنت بحاجة إلى إزالته يدويًا من ملف .csproj. ومع ذلك ، لا يزال يتعين علينا العمل فيه ، لذا تابع القراءة.

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

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

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

نذهب إلى المجلد الذي يحتوي على المشروع ونفتح الملف بامتداد .csproj في محرر مناسب لك. بالمناسبة ، يمكنك أيضًا فتحه في Visual Studio - تحتاج إلى إلغاء تحميل المشروع وبعد ذلك سيكون العنصر المناسب في قائمة السياق:

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

يُفضل التحرير في Visual Studio ، حيث يقوم المحرر بالمحاذاة والمطالبات.

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

انتقل إلى العنصر المشترك (الأول) PropertyGroup وإلقاء نظرة على الممتلكات اسم التجمع - هذا هو اسم التجمع ويجب أن نحصل عليه بدون لاحقة _2015. إذا كانت هناك لاحقة ، فقم بإزالتها.

البحث عن عنصر بشرط

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">

نحن لا نحتاجها - نحن نحذفها.

عنصر بشرط

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

سوف تكون هناك حاجة للعمل في مرحلة التطوير وتصحيح الكود. يمكنك تغيير خصائصه لتناسب احتياجاتك - تعيين مسارات إخراج مختلفة ، وتغيير رموز الترجمة الشرطية ، وما إلى ذلك.

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

  • مسار الاخراج - مجلد الإخراج. لقد قمت بتعيين القيمة الافتراضية بن R20xx
  • تعريف الثوابت هي رموز ترجمة شرطية. يجب التعيين على TRACE ؛ R20xx
  • TargetFrameworkVersion - إصدار المنصة. تتطلب الإصدارات المختلفة من Revit API تعيين أنظمة أساسية مختلفة.
  • اسم التجمع - اسم التجميع (أي اسم الملف). يمكنك كتابة اسم التجميع المطلوب مباشرةً ، ولكن من أجل العالمية ، أنصحك بكتابة القيمة $ (اسم التجميع) _20xx. للقيام بذلك ، قمنا مسبقًا بإزالة اللاحقة من اسم التجميع

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

حسنًا ، اكتشفنا خصائص المشروع - إنه ليس بالأمر الصعب. ولكن ماذا تفعل بالمكتبات المضمنة (حزم NuGet). إذا نظرنا إلى أبعد من ذلك ، فسنرى أن المكتبات المضمنة محددة بواسطة العناصر مجموعة العناصر. لكن ها هي المشكلة - هذا العنصر يعالج الشروط بشكل غير صحيح ، كعنصر PropertyGroup. ربما يكون هذا خللًا في Visual Studio ، ولكن إذا قمت بتعيين عدة عناصر مجموعة العناصر بشروط التكوين ، وأدخل روابط مختلفة إلى حزم NuGet بالداخل ، ثم عند تغيير التكوين ، يتم توصيل جميع الحزم المحددة بالمشروع.

عنصر يأتي لمساعدتنا اختارالذي يعمل وفق المنطق المألوف لدينا إذا، ثم بين آخر.

باستخدام العنصر اختار، قم بتعيين حزم NuGet مختلفة لتكوينات مختلفة:

جميع محتويات csproj

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0"  ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{5AD738D6-4122-4E76-B865-BE7CE0F6B3EB}</ProjectGuid>
    <OutputType>Library</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>MySuperPluginForRevit</RootNamespace>
    <AssemblyName>MySuperPluginForRevit</AssemblyName>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <Deterministic>true</Deterministic>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>binDebug</OutputPath>
    <DefineConstants>DEBUG;R2015</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2015|AnyCPU' ">
    <OutputPath>binR2015</OutputPath>
    <DefineConstants>TRACE;R2015</DefineConstants>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2015</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2016|AnyCPU' ">
    <OutputPath>binR2016</OutputPath>
    <DefineConstants>TRACE;R2016</DefineConstants>
    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2016</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2017|AnyCPU' ">
    <OutputPath>binR2017</OutputPath>
    <DefineConstants>TRACE;R2017</DefineConstants>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2017</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2018|AnyCPU' ">
    <OutputPath>binR2018</OutputPath>
    <DefineConstants>TRACE;R2018</DefineConstants>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2018</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2019|AnyCPU' ">
    <OutputPath>binR2019</OutputPath>
    <DefineConstants>TRACE;R2019</DefineConstants>
    <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2019</AssemblyName>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2020|AnyCPU' ">
    <OutputPath>binR2020</OutputPath>
    <DefineConstants>TRACE;R2020</DefineConstants>
    <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
    <AssemblyName>$(AssemblyName)_2020</AssemblyName>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Class1.cs" />
    <Compile Include="PropertiesAssemblyInfo.cs" />
  </ItemGroup>
  <Choose>
    <When Condition=" '$(Configuration)'=='R2015' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2015">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2016' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2016">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2017' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2017">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2018' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2018">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2019' ">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2019">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
    <When Condition=" '$(Configuration)'=='R2020' or '$(Configuration)'=='Debug'">
      <ItemGroup>
        <PackageReference Include="ModPlus.Revit.API.2020">
          <Version>1.0.0</Version>
          <ExcludeAssets>runtime</ExcludeAssets>
        </PackageReference>
      </ItemGroup>
    </When>
  </Choose>
  <Import Project="$(MSBuildToolsPath)Microsoft.CSharp.targets" />
</Project>

يرجى ملاحظة أنه في أحد الشروط حددت تهيئتين عبر أو. وبالتالي ، سيتم توصيل الحزمة المطلوبة أثناء التكوين تصحيح.

وها نحن شبه مثاليين. نقوم بإعادة تحميل المشروع ، وتشغيل التكوين الذي نحتاجه ، والاتصال بالعنصر "قم باستعادة كافة حزم NuGet"وشاهد كيف تتغير حزمنا.

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

وفي هذه المرحلة ، وصلت إلى طريق مسدود - من أجل جمع كل التكوينات في وقت واحد ، يمكننا استخدام تجميع الدُفعات (القائمة "جمعية"->"تجميع الدفعة”) ، ولكن عند تبديل التكوينات ، لا تتم استعادة الحزم تلقائيًا. وعند تجميع المشروع ، فإنه لا يحدث أيضًا ، على الرغم من أنه ينبغي من الناحية النظرية. لم أجد حلًا لهذه المشكلة بالوسائل القياسية. وعلى الأرجح هذا أيضًا خطأ في Visual Studio.

لذلك ، لتجميع الدُفعات ، تقرر استخدام نظام تجميع آلي خاص السلاح النووي. لم أكن أريد هذا حقًا لأنني أعتقد أنه مبالغة فيما يتعلق بتطوير البرنامج المساعد ، لكن في الوقت الحالي لا أرى أي حل آخر. والسؤال "لماذا نوك؟" الجواب بسيط - نستخدمه في العمل.

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

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

إذا لم تقم بتثبيت السلاح النووي، ثم اكتب الأمر أولاً

dotnet tool install Nuke.GlobalTool –global

اكتب الآن أمرًا السلاح النووي وسيُطلب منك التهيئة السلاح النووي للمشروع الحالي. لا أعرف كيف أكتبه باللغة الروسية بشكل صحيح - سيتم كتابته باللغة الإنجليزية تعذر العثور على ملف .nuke. هل تريد إعداد بناء؟ [y / n]

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

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

دعنا ننتقل إلى Visual Studio ، والذي سيطلب منا إعادة تحميل الحل ، حيث تمت إضافة مشروع جديد إليه. أعد تحميل الحل وانظر أن لدينا مشروعًا نساعدك في بناء الذي نحن مهتمون فيه فقط بملف واحد - Build.cs

نقوم بعمل مشروع مكون إضافي واحد مع تجميع لإصدارات مختلفة من Revit / AutoCAD

نفتح هذا الملف ونكتب نصًا لبناء المشروع لجميع التكوينات. حسنًا ، أو استخدم البرنامج النصي الخاص بي ، والذي يمكنك تعديله بنفسك:

using System.IO;
using Nuke.Common;
using Nuke.Common.Execution;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tools.MSBuild;
using static Nuke.Common.Tools.MSBuild.MSBuildTasks;

[CheckBuildProjectConfigurations]
[UnsetVisualStudioEnvironmentVariables]
class Build : NukeBuild
{
    public static int Main () => Execute<Build>(x => x.Compile);

    [Solution] readonly Solution Solution;

    // If the solution name and the project (plugin) name are different, then indicate the project (plugin) name here
    string PluginName => Solution.Name;

    Target Compile => _ => _
        .Executes(() =>
        {
            var project = Solution.GetProject(PluginName);
            if (project == null)
                throw new FileNotFoundException("Not found!");

            var build = new List<string>();
            foreach (var (_, c) in project.Configurations)
            {
                var configuration = c.Split("|")[0];

                if (configuration == "Debug" || build.Contains(configuration))
                    continue;

                Logger.Normal($"Configuration: {configuration}");

                build.Add(configuration);

                MSBuild(_ => _
                    .SetProjectFile(project.Path)
                    .SetConfiguration(configuration)
                    .SetTargets("Restore"));
                MSBuild(_ => _
                    .SetProjectFile(project.Path)
                    .SetConfiguration(configuration)
                    .SetTargets("Rebuild"));
            }
        });
}

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

بالمناسبة ، يمكنك استخدام PowerShell مباشرة من Visual Studio (القائمة "رؤية"->"نوافذ أخرى"->"وحدة تحكم مدير الحزم") ، ولكن كل شيء سيكون أبيض وأسود ، وهو أمر غير مريح للغاية.

هذا يختتم مقالتي. أنا متأكد من أنه يمكنك معرفة خيار AutoCAD بنفسك. آمل أن تجد المواد المعروضة هنا "العملاء".

شكرا لك!

المصدر: www.habr.com

إضافة تعليق