Біз Revit/AutoCAD-тың әртүрлі нұсқаларына арналған компиляциясы бар бір плагин жобасын жасаймыз

Біз Revit/AutoCAD-тың әртүрлі нұсқаларына арналған компиляциясы бар бір плагин жобасын жасаймыз

CAD қолданбалары үшін плагиндерді әзірлеу кезінде (менің жағдайда бұл AutoCAD, Revit және Renga) уақыт өте келе бір мәселе пайда болады - бағдарламалардың жаңа нұсқалары шығарылады, олардың API өзгерістері және плагиндердің жаңа нұсқалары жасалуы керек.

Сізде бір ғана плагин болған кезде немесе сіз әлі де осы мәселеде өзін-өзі үйренген бастаушы болсаңыз, сіз жай ғана жобаның көшірмесін жасай аласыз, ондағы қажетті орындарды өзгерте аласыз және плагиннің жаңа нұсқасын жинай аласыз. Тиісінше, кодекске кейінгі өзгерістер еңбек шығындарының бірнеше есе өсуіне әкеледі.

Тәжірибе мен білім алған сайын сіз бұл процесті автоматтандырудың бірнеше жолдарын табасыз. Мен осы жолмен жүрдім және мен сізге немен аяқталғанымды және оның қаншалықты ыңғайлы екенін айтқым келеді.

Алдымен, анық және мен ұзақ уақыт бойы қолданып жүрген әдісті қарастырайық.

Жоба файлдарына сілтемелер

Барлығын қарапайым, көрнекі және түсінікті ету үшін мен плагинді әзірлеудің абстрактілі мысалын қолдана отырып, бәрін сипаттаймын.

Visual Studio-ны ашайық (менде Community 2019 нұсқасы бар. Иә - орыс тілінде) және жаңа шешім жасайық. Оны шақырайық MySuperPluginForRevit

Біз Revit/AutoCAD-тың әртүрлі нұсқаларына арналған компиляциясы бар бір плагин жобасын жасаймыз

Біз 2015-2020 нұсқалары үшін Revit плагинін жасаймыз. Сондықтан шешімде жаңа жобаны (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>

Енді жобаны құру кезінде бумадағы файлдар шығыс қалтасына көшірілмейді.
Әрі қарай жүрейік - біздің плагин жаңа нұсқалар шыққан кезде уақыт өте өзгерген Revit API-ден бірдеңе пайдаланатынын бірден елестетейік. Немесе біз плагин жасап жатқан 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 сәйкес өрістен

Ескерту: Visual Studio бағдарламасының соңғы нұсқасында қате бар - шартты құрастыру таңбалары қол жетімді болса да, жоба сипаттары терезесінде көрсетілмейді. Егер сізде бұл ақаулық орын алса, оларды .csproj файлынан қолмен жою қажет. Дегенмен, біз әлі де жұмыс істеуіміз керек, сондықтан оқыңыз.

Суффиксті жою арқылы Solution Explorer терезесінде жобаның атын өзгертіңіз _2015 содан кейін жобаны шешімнен алып тастаңыз. Бұл перфекционисттердің тәртібі мен сезімін сақтау үшін қажет! Біз шешіміміздің қалтасын ашамыз, жоба қалтасының атын дәл осылай өзгертеміз және жобаны шешімге қайта жүктейміз.

Конфигурация менеджерін ашыңыз. АҚШ конфигурациясы босату Негізінде бұл қажет емес, сондықтан біз оны жоямыз. Бізге бұрыннан таныс атаулармен жаңа конфигурацияларды жасаймыз R2015, R2016, ..., R2020. Басқа конфигурациялардан параметрлерді көшірудің қажеті жоқ екенін және жоба конфигурацияларын жасаудың қажеті жоқ екенін ескеріңіз:

Біз Revit/AutoCAD-тың әртүрлі нұсқаларына арналған компиляциясы бар бір плагин жобасын жасаймыз

Жоба бар қалтаға өтіп, .csproj кеңейтімі бар файлды өзіңізге ыңғайлы өңдегіште ашыңыз. Айтпақшы, сіз оны Visual Studio бағдарламасында да аша аласыз - жобаны босатуыңыз керек, содан кейін қажетті элемент контекстік мәзірде болады:

Біз Revit/AutoCAD-тың әртүрлі нұсқаларына арналған компиляциясы бар бір плагин жобасын жасаймыз

Visual Studio бағдарламасында өңдеу тіпті жақсырақ, өйткені редактор туралайды және шақырады.

Файлда біз элементтерді көреміз PropertyGroup – ең жоғарғы жағында жалпы, содан кейін шарттар келеді. Бұл элементтер жобаны құрастырған кезде оның қасиеттерін орнатады. Шартсыз бірінші элемент жалпы сипаттарды орнатады, ал шарттары бар элементтер сәйкесінше конфигурацияларға байланысты кейбір қасиеттерді өзгертеді.

Жалпы (бірінші) элементке өтіңіз PropertyGroup және мүлікке қараңыз AssemblyName – міне, ассамблеяның аты, бізде жұрнақсыз болуы керек _2015. Егер жұрнақ болса, оны алып тастаңыз.

Шарты бар элементті табу

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

Бұл бізге қажет емес - біз оны жоямыз.

Шарты бар элемент

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

кодты әзірлеу және жөндеу кезеңінде жұмыс істеу үшін қажет болады. Оның қасиеттерін қажеттіліктеріңізге сай өзгертуге болады - әртүрлі шығыс жолдарын орнату, шартты құрастыру таңбаларын өзгерту және т.б.

Енді жаңа элементтерді жасайық PropertyGroup конфигурацияларымыз үшін. Бұл элементтерде бізге тек төрт сипатты орнату керек:

  • OutputPath – шығыс қалтасы. Мен әдепкі мәнді орнаттым binR20xx
  • Тұрақтыларды анықтау – шартты құрастыру символдары. Мән көрсетілуі керек TRACE;R20хх
  • TargetFrameworkVersion – платформа нұсқасы. Revit API-нің әртүрлі нұсқалары әртүрлі платформаларды көрсетуді талап етеді.
  • AssemblyName – жинақ атауы (яғни файл атауы). Сіз жинақтың нақты атауын жаза аласыз, бірақ әмбебаптық үшін мәнді жазуды ұсынамын $(AssemblyName)_20хх. Ол үшін бұрын құрастыру атынан жұрнақты алып тастадық

Барлық осы элементтердің ең маңызды ерекшелігі - оларды мүлде өзгертпестен басқа жобаларға көшіруге болады. Кейінірек мақалада .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>

Шарттардың бірінде мен арқылы екі конфигурацияны көрсеткенімді ескеріңіз НЕМЕСЕ. Осылайша конфигурация кезінде қажетті бума қосылады Debug.

Ал мұнда бізде барлығы дерлік тамаша. Біз жобаны кері жүктейміз, қажетті конфигурацияны қосамыз, шешімнің мәтінмәндік мәзіріндегі « элементін шақырамыз (жоба емес)Барлық NuGet бумаларын қалпына келтіріңіз«және біз пакеттеріміздің қалай өзгеретінін көреміз.

Біз Revit/AutoCAD-тың әртүрлі нұсқаларына арналған компиляциясы бар бір плагин жобасын жасаймыз

Осы кезеңде мен тұйыққа тірелдім - барлық конфигурацияларды бірден жинау үшін біз пакеттік жинақты пайдалана аламыз (мәзір «Ассамблея«->»Топтамалық құрастыру"), бірақ конфигурацияларды ауыстырған кезде бумалар автоматты түрде қалпына келтірілмейді. Жобаны құрастыру кезінде бұл да болмайды, бірақ теориялық тұрғыдан солай болуы керек. Мен стандартты құралдарды қолдана отырып, бұл мәселенің шешімін таппадым. Бұл, ең алдымен, Visual Studio қатесі.

Сондықтан партияны құрастыру үшін арнайы автоматтандырылған құрастыру жүйесін қолдану туралы шешім қабылданды Nuke. Мен мұны қаламадым, өйткені бұл плагинді әзірлеу тұрғысынан артық деп ойлаймын, бірақ қазіргі уақытта мен басқа шешімді көрмеймін. Ал «Неліктен Nuke?» деген сұраққа. Жауап қарапайым - біз оны жұмыста қолданамыз.

Сонымен, шешіміміздің қалтасына өтіңіз (жоба емес), пернені басып тұрыңыз ауысым және қалтадағы бос орынды тінтуірдің оң жақ түймешігімен нұқыңыз - контекстік мәзірде элементті таңдаңыз «PowerShell терезесін осы жерден ашыңыз«.

Біз Revit/AutoCAD-тың әртүрлі нұсқаларына арналған компиляциясы бар бір плагин жобасын жасаймыз

Егер сізде ол орнатылмаған болса Nuke, содан кейін алдымен пәрменді жазыңыз

dotnet tool install Nuke.GlobalTool –global

Енді пәрменді жазыңыз Nuke және сізге конфигурациялау ұсынылады Nuke ағымдағы жоба үшін. Мен мұны орыс тілінде қалай дұрыс жазу керектігін білмеймін - ағылшын тілінде ол .nuke файлын таба алмады деп жазылады. Құрылымды орнатқыңыз келе ме? [ж/н]

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 терезесіне ораламыз және пәрменді қайтадан жазамыз Nuke (команда жазуға болады Nuke талап етілетінін көрсетеді нысана. Бірақ бізде біреуі бар нысана, ол әдепкі бойынша жұмыс істейді). Enter пернесін басқаннан кейін біз өзімізді нағыз хакерлердей сезінеміз, өйткені фильмдегідей біздің жоба әртүрлі конфигурациялар үшін автоматты түрде жиналады.

Айтпақшы, сіз PowerShell-ті тікелей Visual Studio бағдарламасынан пайдалана аласыз (мәзір «көрініс«->»Басқа терезелер«->»Пакет менеджері консолі«), бірақ бәрі ақ-қара түсте болады, бұл өте ыңғайлы емес.

Осымен менің мақалам аяқталады. AutoCAD үшін опцияны өзіңіз анықтай алатыныңызға сенімдімін. Мұнда ұсынылған материал өзінің «клиенттерін» табады деп үміттенемін.

Назарларыңызға рахмет!

Ақпарат көзі: www.habr.com

пікір қалдыру