Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

SAPR ilovalari uchun plaginlarni ishlab chiqishda (mening holimda Bular AutoCAD, Revit va Renga) vaqt o'tishi bilan bitta muammo paydo bo'ladi - dasturlarning yangi versiyalari chiqariladi, ularning API o'zgarishlari va plaginlarning yangi versiyalarini yaratish kerak.

Agar sizda bitta plagin bo'lsa yoki siz hali ham bu masalada o'z-o'zini o'rgatgan boshlang'ich bo'lsangiz, siz shunchaki loyihaning nusxasini yaratishingiz, undagi kerakli joylarni o'zgartirishingiz va plaginning yangi versiyasini yig'ishingiz mumkin. Shunga ko'ra, kodga keyingi o'zgartirishlar mehnat xarajatlarini bir necha marta oshirishga olib keladi.

Tajriba va bilimga ega bo'lgach, siz ushbu jarayonni avtomatlashtirishning bir qancha usullarini topasiz. Men bu yo'lni bosib o'tdim va men sizga nima bilan yakunlanganimni va bu qanchalik qulay ekanligini aytmoqchiman.

Birinchidan, keling, aniq va men uzoq vaqtdan beri qo'llagan usulni ko'rib chiqaylik.

Loyiha fayllariga havolalar

Va hamma narsani sodda, vizual va tushunarli qilish uchun men plaginlarni ishlab chiqishning mavhum misolidan foydalanib, hamma narsani tasvirlab beraman.

Keling, Visual Studio dasturini ochamiz (menda Community 2019 versiyasi bor. Ha - rus tilida) va yangi yechim yaratamiz. Keling, unga qo'ng'iroq qilaylik MySuperPluginForRevit

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

2015-2020 versiyalari uchun Revit uchun plagin yaratamiz. Shuning uchun, keling, yechimda yangi loyiha yaratamiz (Net Framework Class Library) va uni chaqiramiz MySuperPluginForRevit_2015

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Biz Revit API-ga havolalarni qo'shishimiz kerak. Albatta, biz mahalliy fayllarga havolalar qo'shishimiz mumkin (barcha kerakli SDK yoki Revitning barcha versiyalarini o'rnatishimiz kerak), lekin biz darhol to'g'ri yo'ldan boramiz va NuGet paketini ulaymiz. Siz juda ko'p paketlarni topishingiz mumkin, lekin men o'zimdan foydalanaman.

Paketni ulagandan so'ng, elementni o'ng tugmasini bosing "Manbalar"va elementni tanlang"packages.config faylini PackageReference ga koΚ»chirish...Β»

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Agar siz to'satdan vahima qila boshlasangiz, chunki paket xususiyatlari oynasida muhim element bo'lmaydi "Mahalliy nusxa ko'chiring", biz aniq qiymatni belgilashimiz kerak yolg'on, keyin vahima qo'ymang - loyiha bilan jildga o'ting, .csproj kengaytmali faylni o'zingiz uchun qulay muharrirda oching (men Notepad++ dan foydalanaman) va u yerda paketimiz haqidagi yozuvni toping. U hozir shunday ko'rinadi:

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

Unga mulk qo'shing ish vaqti. Bu shunday bo'ladi:

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

Endi loyihani qurishda paketdagi fayllar chiqish papkasiga ko'chirilmaydi.
Keling, oldinga boraylik - keling, darhol bizning plaginimiz yangi versiyalar chiqarilganda vaqt o'tishi bilan o'zgargan Revit API-dan qandaydir foydalanishini tasavvur qilaylik. Xo'sh, yoki biz plagin yaratayotgan Revit versiyasiga qarab koddagi biror narsani o'zgartirishimiz kerak. Koddagi bunday farqlarni bartaraf etish uchun biz shartli kompilyatsiya belgilaridan foydalanamiz. Loyiha xususiyatlarini oching, "yorlig'iga o'tingO'rnatish"va maydonda"Shartli kompilyatsiya yozuvi"Yozamiz R2015.

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

E'tibor bering, belgi disk raskadrovka va chiqarish konfiguratsiyasi uchun qo'shilishi kerak.

Xo'sh, biz xususiyatlar oynasida bo'lganimizda, biz darhol "yorlig'iga o'tamizariza"va maydonda"Standart nom maydoniΒ» qo'shimchasini olib tashlang _2015Shunday qilib, bizning nomlar maydoni universal va yig'ilish nomidan mustaqil bo'ladi:

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Mening holimda, yakuniy mahsulotda barcha versiyalarning plaginlari bitta papkaga joylashtirilgan, shuning uchun mening yig'ilish nomlari shakl qo'shimchasi bilan qoladi. _20xx. Ammo, agar fayllar turli papkalarda joylashgan bo'lsa, montaj nomidan qo'shimchani olib tashlashingiz mumkin.

Keling, fayl kodiga o'tamiz Class1.cs va u erda Revitning turli versiyalarini hisobga olgan holda ba'zi kodlarni simulyatsiya qiling:

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;
        }
    }
}

Men zudlik bilan Revitning 2015-yildan yuqori boΚ»lgan barcha versiyalarini hisobga oldim (ular yozish vaqtida mavjud edi) va darhol bir xil shablon yordamida yaratilgan shartli kompilyatsiya belgilarining mavjudligini hisobga oldim.

Keling, asosiy diqqatga sazovor joyga o'tamiz. Biz yechimimizda yangi loyiha yaratamiz, faqat Revit 2016 plaginining versiyasi uchun. Biz yuqorida tavsiflangan barcha amallarni mos ravishda takrorlaymiz, 2015 raqamini 2016 raqami bilan almashtiramiz. Lekin fayl Class1.cs yangi loyihadan o'chirish.

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Kerakli kod bilan fayl - Class1.cs - bizda allaqachon mavjud va biz yangi loyihada unga havolani kiritishimiz kerak. Havolalar kiritishning ikki yo'li mavjud:

  1. Uzoq - loyihani o'ng tugmasini bosing va "ni tanlangqo'shishΒ»->Β«Mavjud element", ochilgan oynada kerakli faylni toping va variant o'rniga "qo'shish"variantni tanlang"Ulanish sifatida qo'shingΒ»

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

  1. Qisqa – toβ€˜gβ€˜ridan-toβ€˜gβ€˜ri yechim tadqiqotchisida kerakli faylni (hatto fayllarni yoki hatto butun papkalarni) tanlang va Alt tugmachasini bosib ushlab turganda uni yangi loyihaga torting. Siz sudrab olib borganingizda, Alt tugmachasini bosganingizda sichqoncha kursori ortiqcha belgisidan strelkaga o'zgarishini ko'rasiz.
    UPS: Men ushbu paragrafda biroz chalkashlik qildim - bir nechta fayllarni uzatish uchun tugmani bosib turing Shift + Alt!

Jarayonni bajarganimizdan so'ng, biz ikkinchi loyihada faylga ega bo'lamiz Class1.cs tegishli belgi bilan (ko'k o'q):

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Tahrirlovchi oynasida kodni tahrirlashda siz kodni qaysi loyiha kontekstida ko'rsatishni ham tanlashingiz mumkin, bu sizga turli shartli kompilyatsiya belgilari ostida tahrir qilinayotgan kodni ko'rish imkonini beradi:

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Biz ushbu sxemadan foydalanib, barcha boshqa loyihalarni (2017-2020) yaratamiz. Life-hack - agar siz Yechim Explorer-da fayllarni asosiy loyihadan emas, balki ular allaqachon havola sifatida kiritilgan loyihadan tortib olsangiz, Alt tugmachasini bosib ushlab turishingiz shart emas!

Ta'riflangan variant plaginning yangi versiyasini qo'shgunga qadar yoki loyihaga yangi fayllar qo'shilgunga qadar juda yaxshi - bularning barchasi juda zerikarli bo'ladi. Va yaqinda men to'satdan hamma narsani bitta loyiha bilan qanday hal qilishni tushunib etdim va biz ikkinchi usulga o'tmoqdamiz.

Konfiguratsiyalar sehri

Bu erda o'qishni tugatgandan so'ng, siz: "Agar maqola darhol ikkinchisi haqida bo'lsa, nega birinchi usulni tasvirlab berdingiz?!" Va men nima uchun shartli kompilyatsiya belgilariga ehtiyoj borligini va loyihalarimiz qaysi joylarda farq qilishini aniqroq qilish uchun hamma narsani tasvirlab berdim. Va endi faqat bitta loyihani qoldirib, loyihalarda qanday farqlarni amalga oshirishimiz kerakligi bizga aniqroq bo'ladi.

Va hamma narsani aniqroq qilish uchun biz yangi loyiha yaratmaymiz, balki birinchi usulda yaratilgan joriy loyihamizga o'zgartirishlar kiritamiz.

Shunday qilib, birinchi navbatda, biz asosiy loyihadan tashqari (to'g'ridan-to'g'ri fayllarni o'z ichiga olgan) barcha loyihalarni yechimdan olib tashlaymiz. Bular. 2016-2020 versiyalari uchun loyihalar. Yechim bilan papkani oching va u erda ushbu loyihalarning papkalarini o'chiring.

Bizning qarorimizda bitta loyiha qoldi - MySuperPluginForRevit_2015. Uning xususiyatlarini oching va:

  1. Yorliqda "ariza"montaj nomidan qo'shimchani olib tashlang _2015 (Nega keyinroq ma'lum bo'ladi)
  2. Yorliqda "O'rnatishΒ» shartli kompilyatsiya belgisini olib tashlang R2015 tegishli maydondan

Eslatma: Visual Studio ning so'nggi versiyasida xatolik bor - shartli kompilyatsiya belgilari mavjud bo'lsa-da, loyiha xususiyatlari oynasida ko'rsatilmaydi. Agar siz ushbu nosozlikni sezsangiz, ularni .csproj faylidan qo'lda olib tashlashingiz kerak. Biroq, biz hali ham unda ishlashimiz kerak, shuning uchun o'qing.

Suffiksni olib tashlash orqali Solution Explorer oynasida loyiha nomini o'zgartiring _2015 va keyin loyihani yechimdan olib tashlang. Bu tartib va ​​perfektsionistlarning his-tuyg'ularini saqlab qolish uchun kerak! Biz yechimimiz papkasini ochamiz, u yerdagi loyiha papkasini xuddi shunday nomlaymiz va loyihani yana yechimga yuklaymiz.

Konfiguratsiya menejerini oching. AQSh konfiguratsiyasi ozod qilish printsipial jihatdan, bu kerak bo'lmaydi, shuning uchun biz uni o'chirib tashlaymiz. Bizga allaqachon tanish bo'lgan nomlar bilan yangi konfiguratsiyalar yaratamiz R2015, R2016,…, R2020. Esda tutingki, siz boshqa konfiguratsiyalardan sozlamalarni nusxalashingiz shart emas va loyiha konfiguratsiyasini yaratishingiz shart emas:

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Loyiha bilan papkaga o'ting va .csproj kengaytmali faylni o'zingiz uchun qulay tahrirlovchida oching. Aytgancha, siz uni Visual Studio'da ham ochishingiz mumkin - siz loyihani yuklab olishingiz kerak va keyin kerakli element kontekst menyusida bo'ladi:

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Visual Studio'da tahrirlash afzalroqdir, chunki muharrir ham tekislaydi, ham taklif qiladi.

Faylda biz elementlarni ko'ramiz PropertyGroup - eng yuqori qismida umumiy, keyin esa shartlar keladi. Ushbu elementlar loyihani qurishda uning xususiyatlarini o'rnatadi. Shartlarsiz birinchi element umumiy xususiyatlarni o'rnatadi va shartli elementlar mos ravishda konfiguratsiyalarga qarab ba'zi xususiyatlarni o'zgartiradi.

Umumiy (birinchi) elementga o'ting PropertyGroup va mulkka qarang AssemblyName - bu assambleyaning nomi va biz uni qo'shimchasiz olishimiz kerak _2015. Agar qo'shimcha mavjud bo'lsa, uni olib tashlang.

Shartli elementni topish

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

Bizga kerak emas - biz uni o'chirib tashlaymiz.

Shartli element

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

kodni ishlab chiqish va disk raskadrovka bosqichida ishlash uchun kerak bo'ladi. Uning xususiyatlarini ehtiyojlaringizga mos ravishda o'zgartirishingiz mumkin - turli chiqish yo'llarini o'rnatish, shartli kompilyatsiya belgilarini o'zgartirish va hokazo.

Endi yangi elementlarni yaratamiz PropertyGroup konfiguratsiyalarimiz uchun. Ushbu elementlarda biz faqat to'rtta xususiyatni o'rnatishimiz kerak:

  • OutputPath – chiqish papkasi. Men standart qiymatni o'rnatdim binR20xx
  • Konstantlarni aniqlang – shartli kompilyatsiya belgilari. Qiymat ko'rsatilishi kerak TRACE;R20xx
  • TargetFrameworkVersion - platforma versiyasi. Revit API ning turli versiyalari turli platformalarni ko'rsatishni talab qiladi.
  • AssemblyName - yig'ish nomi (ya'ni fayl nomi). Siz yig'ilishning aniq nomini yozishingiz mumkin, ammo ko'p qirrali bo'lish uchun men qiymatni yozishni maslahat beraman $(AssemblyName)_20xx. Buning uchun biz avval yig'ilish nomidan qo'shimchani olib tashladik

Bu elementlarning eng muhim xususiyati shundaki, ularni umuman o'zgartirmasdan boshqa loyihalarga ko'chirish mumkin. Keyinchalik maqolada men .csproj faylining barcha mazmunini biriktiraman.

Xo'sh, biz loyihaning xususiyatlarini aniqladik - bu qiyin emas. Lekin plagin kutubxonalari (NuGet paketlari) bilan nima qilish kerak. Agar biz uzoqroq qarasak, kiritilgan kutubxonalar elementlarda ko'rsatilganligini ko'ramiz Elementlar guruhi. Ammo omadsizlik - bu element shartlarni element sifatida noto'g'ri qayta ishlaydi PropertyGroup. Ehtimol, bu hatto Visual Studio xatosi, lekin agar siz bir nechta elementlarni ko'rsatsangiz Elementlar guruhi konfiguratsiya shartlari bilan va NuGet paketlariga turli havolalarni kiriting, so'ngra konfiguratsiyani o'zgartirganingizda, barcha belgilangan paketlar loyihaga ulanadi.

Element bizning yordamimizga keladi tanlang, bu bizning odatiy mantiqimiz bo'yicha ishlaydi agar-keyin-boshqa.

Elementdan foydalanish tanlang, biz turli xil konfiguratsiyalar uchun turli NuGet paketlarini o'rnatdik:

Barcha tarkib 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>

E'tibor bering, shartlardan birida men orqali ikkita konfiguratsiyani ko'rsatdim YOKI. Shunday qilib, kerakli paket konfiguratsiya vaqtida ulanadi Xato qilish.

Va bu erda deyarli hamma narsa mukammaldir. Biz loyihani qayta yuklaymiz, kerakli konfiguratsiyani yoqamiz, yechimning kontekst menyusidagi elementni chaqiramiz (loyiha emas)Barcha NuGet paketlarini tiklang"va biz paketlarimiz qanday o'zgarganini ko'ramiz.

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Va bu bosqichda men boshi berk ko'chaga keldim - barcha konfiguratsiyalarni bir vaqtning o'zida to'plash uchun biz ommaviy yig'ilishdan foydalanishimiz mumkin edi (menyu "O'rnatishΒ»->Β«To'plamli qurish"), lekin konfiguratsiyalarni almashtirishda paketlar avtomatik ravishda tiklanmaydi. Va loyihani yig'ishda, bu ham sodir bo'lmaydi, garchi nazariy jihatdan shunday bo'lishi kerak. Men bu muammoni standart vositalar yordamida hal qilmadim. Va, ehtimol, bu ham Visual Studio xatosi.

Shuning uchun, partiyani yig'ish uchun maxsus avtomatlashtirilgan yig'ish tizimidan foydalanishga qaror qilindi Nuke. Men buni aslida xohlamadim, chunki bu plaginlarni ishlab chiqish nuqtai nazaridan ortiqcha, deb o'ylayman, lekin hozircha men boshqa yechimni ko'rmayapman. Va "Nima uchun Nuke?" Degan savolga. Javob oddiy - biz uni ishda ishlatamiz.

Shunday qilib, bizning yechimimiz papkasiga (loyiha emas) o'ting, kalitni bosib ushlab turing smena va papkadagi bo'sh joyni o'ng tugmasini bosing - kontekst menyusida elementni tanlang "Bu yerda PowerShell oynasini oching".

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Agar sizda o'rnatilmagan bo'lsa yadro, keyin avval buyruqni yozing

dotnet tool install Nuke.GlobalTool –global

Endi buyruqni yozing yadro va sizdan sozlash so'raladi yadro joriy loyiha uchun. Buni rus tilida qanday qilib to'g'ri yozishni bilmayman - ingliz tilida u .nuke faylini topib bo'lmadi deb yoziladi. Qurilishni sozlashni xohlaysizmi? [y/n]

Y tugmachasini bosing va keyin to'g'ridan-to'g'ri sozlash elementlari bo'ladi. Bizga eng oddiy variantni ishlatish kerak MSBuild, shuning uchun biz ekran tasviridagi kabi javob beramiz:

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Keling, Visual Studio dasturiga o'tamiz, bu bizga yechimni qayta yuklashni taklif qiladi, chunki unga yangi loyiha qo'shilgan. Biz yechimni qayta yuklaymiz va loyihamiz borligini ko'ramiz qurish unda bizni faqat bitta fayl qiziqtiradi - Build.cs

Biz Revit/AutoCAD ning turli versiyalari uchun kompilyatsiya bilan bitta plagin loyihasini yaratamiz

Ushbu faylni oching va barcha konfiguratsiyalar uchun loyihani yaratish uchun skript yozing. Xo'sh, yoki mening skriptimdan foydalaning, uni o'z ehtiyojlaringizga mos ravishda tahrirlashingiz mumkin:

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"));
            }
        });
}

Biz PowerShell oynasiga qaytamiz va buyruqni yana yozamiz yadro (buyruqni yozishingiz mumkin yadro zarurligini bildiradi maqsad. Lekin bizda bitta maqsad, sukut bo'yicha ishlaydi). Enter tugmachasini bosgandan so'ng, biz o'zimizni haqiqiy xakerlar kabi his qilamiz, chunki xuddi filmdagi kabi, bizning loyihamiz avtomatik ravishda turli xil konfiguratsiyalar uchun yig'iladi.

Aytgancha, siz PowerShell-dan to'g'ridan-to'g'ri Visual Studio'dan foydalanishingiz mumkin (menyu "ko'rinishΒ»->Β«Boshqa oynalarΒ»->Β«Paket menejeri konsoli"), lekin hamma narsa qora va oq rangda bo'ladi, bu juda qulay emas.

Bu mening maqolamni yakunlaydi. Ishonchim komilki, siz AutoCAD uchun variantni o'zingiz aniqlay olasiz. Umid qilamanki, bu erda taqdim etilgan material o'zining "mijozlarini" topadi.

E'tiboringiz uchun tashakkur!

Manba: www.habr.com

a Izoh qo'shish