ما یک پروژه پلاگین با کامپایل برای نسخه های مختلف 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 را وصل می‌کنیم. شما می توانید تعداد زیادی بسته را پیدا کنید، اما من از بسته های خودم استفاده خواهم کرد.

پس از اتصال بسته، بر روی مورد کلیک راست کنید "مراجع"و مورد را انتخاب کنید"packages.config را به 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>

اکنون هنگام ساخت پروژه، فایل‌های بسته در پوشه خروجی کپی نمی‌شوند.
بیایید جلوتر برویم - بیایید بلافاصله تصور کنیم که افزونه ما از API Revit استفاده می کند، که در طول زمان با انتشار نسخه های جدید تغییر کرده است. خوب، یا فقط باید بسته به نسخه Revit که پلاگین را برای آن می سازیم، چیزی در کد تغییر دهیم. برای حل چنین تفاوت هایی در کد، از نمادهای کامپایل شرطی استفاده می کنیم. ویژگی های پروژه را باز کنید، به تب “ برویدمجلس"و در میدان"نماد کامپایل مشروط"بیا بنویسیم R2015.

ما یک پروژه پلاگین با کامپایل برای نسخه های مختلف Revit/AutoCAD ایجاد می کنیم

توجه داشته باشید که نماد باید برای هر دو پیکربندی Debug و Release اضافه شود.

خوب، در حالی که در پنجره خصوصیات هستیم، بلافاصله به تب “ می رویمدرخواست"و در میدان"فضای نام پیش فرض» پسوند را حذف کنید _2015به طوری که فضای نام ما جهانی و مستقل از نام اسمبلی است:

ما یک پروژه پلاگین با کامپایل برای نسخه های مختلف Revit/AutoCAD ایجاد می کنیم

در مورد من، در محصول نهایی، پلاگین های تمام نسخه ها در یک پوشه قرار می گیرند، بنابراین نام اسمبلی من با پسوند فرم باقی می ماند. _20××. اما اگر قرار است فایل ها در پوشه های مختلف قرار داشته باشند، می توانید پسوند را از نام اسمبلی حذف کنید.

بریم سراغ کد فایل 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) را با استفاده از این طرح ایجاد می کنیم. لایف هک - اگر فایل‌ها را در Solution Explorer نه از پروژه پایه، بلکه از پروژه‌ای که قبلاً به‌عنوان لینک درج شده‌اند، بکشید، دیگر لازم نیست کلید Alt را نگه دارید!

گزینه توصیف شده تا لحظه اضافه کردن نسخه جدید افزونه یا تا لحظه اضافه کردن فایل های جدید به پروژه بسیار خوب است - همه اینها بسیار خسته کننده می شود. و اخیراً ناگهان متوجه شدم که چگونه با یک پروژه همه چیز را مرتب کنم و ما به روش دوم می رویم.

جادوی تنظیمات

پس از پایان خواندن اینجا، ممکن است فریاد بزنید، "چرا روش اول را توصیف کردید، اگر مقاله بلافاصله در مورد روش دوم است؟" و من همه چیز را توضیح دادم تا واضح تر شود که چرا به نمادهای کامپایل مشروط نیاز داریم و پروژه های ما در چه مکان هایی متفاوت هستند. و اکنون برای ما واضح تر می شود که دقیقاً چه تفاوت هایی در پروژه ها باید اجرا کنیم و تنها یک پروژه باقی می ماند.

و برای واضح تر شدن همه چیز، ما پروژه جدیدی ایجاد نمی کنیم، بلکه تغییراتی را در پروژه فعلی خود ایجاد می کنیم.

بنابراین، اول از همه، ما تمام پروژه ها را از راه حل حذف می کنیم، به جز پروژه اصلی (که مستقیماً حاوی فایل ها است). آن ها پروژه ها برای نسخه های 2016-2020. پوشه را با راه حل باز کنید و پوشه های این پروژه ها را در آنجا حذف کنید.

ما یک پروژه در تصمیم خود باقی مانده است - MySuperPluginForRevit_2015. خواص آن را باز کنید و:

  1. در برگه "درخواست"حذف پسوند از نام اسمبلی _2015 (چرا بعدا مشخص خواهد شد)
  2. در برگه "مجلس» نماد تالیف شرطی را حذف کنید R2015 از فیلد مربوطه

توجه: آخرین نسخه ویژوال استودیو دارای یک اشکال است - نمادهای کامپایل شرطی در پنجره خصوصیات پروژه نمایش داده نمی شوند، اگرچه در دسترس هستند. اگر با این مشکل مواجه شدید، باید آنها را به صورت دستی از فایل csproj. حذف کنید. با این حال، ما هنوز باید در آن کار کنیم، پس ادامه دهید.

با حذف پسوند، نام پروژه را در پنجره Solution Explorer تغییر دهید _2015 و سپس پروژه را از راه حل حذف کنید. این برای حفظ نظم و احساسات کمال گرایان لازم است! پوشه راه حل خود را باز می کنیم، نام پوشه پروژه را در آنجا تغییر می دهیم و پروژه را دوباره در راه حل بارگذاری می کنیم.

مدیر پیکربندی را باز کنید. پیکربندی ایالات متحده آزاد در اصل، نیازی به آن نخواهد بود، بنابراین ما آن را حذف می کنیم. ما تنظیمات جدیدی را با نام هایی ایجاد می کنیم که قبلاً برای ما آشنا هستند R2015, R2016، ...، R2020. توجه داشته باشید که نیازی به کپی تنظیمات از پیکربندی های دیگر ندارید و نیازی به ایجاد تنظیمات پروژه ندارید:

ما یک پروژه پلاگین با کامپایل برای نسخه های مختلف Revit/AutoCAD ایجاد می کنیم

به پوشه پروژه بروید و فایل را با پسوند csproj. در یک ویرایشگر مناسب برای شما باز کنید. به هر حال، شما همچنین می توانید آن را در ویژوال استودیو باز کنید - باید پروژه را بارگیری کنید و سپس مورد مورد نظر در منوی زمینه قرار می گیرد:

ما یک پروژه پلاگین با کامپایل برای نسخه های مختلف Revit/AutoCAD ایجاد می کنیم

ویرایش در ویژوال استودیو حتی ترجیح داده می شود، زیرا ویرایشگر هم تراز می کند و هم درخواست می کند.

در فایل ما عناصر را خواهیم دید PropertyGroup - در بالای صفحه، حالت کلی است و سپس شرایط فرا می رسد. این عناصر ویژگی های پروژه را هنگام ساخت تعیین می کنند. عنصر اول که بدون شرط است، ویژگی های کلی را تنظیم می کند و عناصر با شرایط، بر این اساس، برخی از ویژگی ها را بسته به تنظیمات تغییر می دهند.

به عنصر مشترک (اول) بروید PropertyGroup و به ملک نگاه کنید اسم اسمبلی – این نام مجمع است و باید آن را بدون پسوند داشته باشیم _2015. اگر پسوندی وجود دارد، آن را حذف کنید.

یافتن یک عنصر با یک شرط

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

ما به آن نیاز نداریم - ما آن را حذف می کنیم.

عنصر با شرط

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

برای کار در مرحله توسعه کد و اشکال زدایی مورد نیاز است. می توانید ویژگی های آن را مطابق با نیازهای خود تغییر دهید - مسیرهای خروجی مختلف را تنظیم کنید، نمادهای کامپایل شرطی را تغییر دهید و غیره.

حالا بیایید عناصر جدید ایجاد کنیم PropertyGroup برای تنظیمات ما در این عناصر فقط باید چهار ویژگی را تنظیم کنیم:

  • مسیر خروجی - پوشه خروجی. مقدار پیش فرض را تنظیم کردم binR20xx
  • Constants را تعریف کنید - نمادهای جمع آوری مشروط مقدار باید مشخص شود TRACE;R20хх
  • TargetFrameworkVersion – نسخه پلتفرم نسخه‌های مختلف Revit API نیاز به پلتفرم‌های متفاوتی دارند.
  • اسم اسمبلی - نام اسمبلی (یعنی نام فایل). شما می توانید نام دقیق اسمبلی را بنویسید، اما برای تطبیق پذیری، نوشتن مقدار را توصیه می کنم $(AssemblyName)_20хх. برای این کار، قبلا پسوند را از نام اسمبلی حذف کردیم

مهمترین ویژگی همه این عناصر این است که به سادگی می توان آنها را بدون تغییر در پروژه های دیگر کپی کرد. بعداً در مقاله تمام محتویات فایل csproj را پیوست خواهم کرد.

خوب، ما ویژگی های پروژه را فهمیدیم - دشوار نیست. اما با کتابخانه های پلاگین (بسته های NuGet) چه باید کرد. اگر بیشتر نگاه کنیم، خواهیم دید که کتابخانه های موجود در عناصر مشخص شده اند گروه آیتم. اما بدشانسی - این عنصر به اشتباه شرایط را به عنوان یک عنصر پردازش می کند PropertyGroup. شاید این حتی یک نقص ویژوال استودیو باشد، اما اگر چندین عنصر را مشخص کنید گروه آیتم با شرایط پیکربندی، و لینک های مختلف بسته های 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 ایجاد می کنیم

و در این مرحله من به بن بست رسیدم - برای جمع آوری تمام تنظیمات به طور همزمان، می توانیم از مونتاژ دسته ای (منو "مجلس»->«ساخت دسته ای")، اما هنگام تغییر تنظیمات، بسته ها به طور خودکار بازیابی نمی شوند. و هنگام مونتاژ پروژه، این نیز اتفاق نمی افتد، اگرچه، از نظر تئوری، باید. من راه حلی برای این مشکل با استفاده از وسایل استاندارد پیدا نکردم. و به احتمال زیاد این نیز یک باگ ویژوال استودیو است.

بنابراین، برای مونتاژ دسته ای، تصمیم گرفته شد از یک سیستم مونتاژ خودکار ویژه استفاده شود قدیمی ترین سایت دانلود آهنگ جدید آمار. من در واقع این را نمی خواستم زیرا فکر می کنم از نظر توسعه افزونه بیش از حد است، اما در حال حاضر هیچ راه حل دیگری نمی بینم. و به این سوال که "چرا نوک؟" پاسخ ساده است - ما از آن در محل کار استفاده می کنیم.

بنابراین، به پوشه راه حل ما (نه پروژه) بروید، کلید را نگه دارید تغییر و روی یک فضای خالی در پوشه کلیک راست کنید - در منوی زمینه مورد را انتخاب کنید "پنجره PowerShell را در اینجا باز کنید'.

ما یک پروژه پلاگین با کامپایل برای نسخه های مختلف Revit/AutoCAD ایجاد می کنیم

اگر آن را نصب نکرده اید هسته ای، سپس ابتدا دستور را بنویسید

dotnet tool install Nuke.GlobalTool –global

حالا دستور را بنویسید هسته ای و از شما خواسته می شود که پیکربندی کنید هسته ای برای پروژه فعلی من نمی دانم چگونه این را به روسی درستتر بنویسم - به انگلیسی نوشته خواهد شد Could not find .nuke file. آیا می خواهید یک بیلد راه اندازی کنید؟ [y/n]

کلید Y را فشار دهید و سپس موارد تنظیمات مستقیم وجود خواهد داشت. ما به ساده ترین گزینه با استفاده نیاز داریم MSBuild، بنابراین مانند تصویر پاسخ می دهیم:

ما یک پروژه پلاگین با کامپایل برای نسخه های مختلف Revit/AutoCAD ایجاد می کنیم

بیایید به ویژوال استودیو برویم، که از ما می خواهد راه حل را دوباره بارگذاری کنیم، زیرا پروژه جدیدی به آن اضافه شده است. راه حل را دوباره بارگذاری می کنیم و می بینیم که یک پروژه داریم ساختن که در آن فقط به یک فایل علاقه مندیم - 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 (منوی " استفاده کنیددیدن»->«پنجره های دیگر»->«کنسول Package Manager")، اما همه چیز سیاه و سفید خواهد بود، که خیلی راحت نیست.

این مقاله من را به پایان می رساند. من مطمئن هستم که می توانید خودتان گزینه اتوکد را پیدا کنید. امیدوارم مطالب ارائه شده در اینجا "مشتریان" خود را پیدا کند.

با تشکر از شما!

منبع: www.habr.com

اضافه کردن نظر