Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Izstrādājot spraudņus CAD lietojumprogrammām (manā gadījumā tie ir AutoCAD, Revit un Renga) laika gaitā parādās viena problēma - tiek izlaistas jaunas programmu versijas, jāveic to API izmaiņas un jaunas spraudņu versijas.

Ja jums ir tikai viens spraudnis vai jÅ«s joprojām esat autodidakts iesācējs Å”ajā jautājumā, varat vienkārÅ”i izveidot projekta kopiju, mainÄ«t tajā nepiecieÅ”amās vietas un salikt jaunu spraudņa versiju. AttiecÄ«gi turpmākās koda izmaiņas radÄ«s daudzkārtēju darbaspēka izmaksu pieaugumu.

IegÅ«stot pieredzi un zināŔanas, jÅ«s atradÄ«siet vairākus veidus, kā automatizēt Å”o procesu. Es gāju Å”o ceļu un vēlos pastāstÄ«t, ar ko es beidzu un cik tas ir ērti.

Vispirms apskatīsim metodi, kas ir acīmredzama un kuru esmu izmantojis jau ilgu laiku.

Saites uz projektu failiem

Un, lai viss bÅ«tu vienkārÅ”i, vizuāli un saprotami, es visu aprakstÄ«Å”u, izmantojot abstraktu spraudņa izstrādes piemēru.

Atveram Visual Studio (man ir Community 2019 versija. Un jā - krievu valodā) un izveidosim jaunu risinājumu. Sauksim viņu MySuperPluginForRevit

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Mēs izveidosim Revit spraudni 2015.ā€“2020. gada versijām. Tāpēc izveidosim jaunu projektu risinājumā (Net Framework Class Library) un nosauksim to MySuperPluginForRevit_2015

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Mums ir jāpievieno saites uz Revit API. Protams, mēs varam pievienot saites uz vietējiem failiem (mums bÅ«s jāinstalē visi nepiecieÅ”amie SDK vai visas Revit versijas), taču mēs nekavējoties ejam pa pareizo ceļu un savienosim NuGet pakotni. JÅ«s varat atrast diezgan daudz iepakojumu, bet es izmantoÅ”u savu.

Pēc paketes pievienoÅ”anas ar peles labo pogu noklikŔķiniet uz vienuma "atsauces"un atlasiet vienumu"Pārvietot packages.config uz PackageReference...Ā»

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Ja pēkŔņi Å”ajā brÄ«dÄ« jÅ«s sākat krist panikā, jo pakotnes rekvizÄ«tu logā nebÅ«s svarÄ«gas preces "Kopēt lokāli", kas mums noteikti ir jāiestata uz vērtÄ«bu nepatiess, tad nekrÄ«ti panikā ā€“ dodies uz mapi ar projektu, atver failu ar paplaÅ”inājumu .csproj sev ērtā redaktorā (es izmantoju Notepad++) un atrodi tur ierakstu par mÅ«su pakotni. Viņa tagad izskatās Ŕādi:

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

Pievienojiet tam īpaŔumu izpildlaiks. Tas izrādīsies Ŕādi:

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

Tagad, veidojot projektu, faili no pakotnes netiks kopēti izvades mapē.
Dosimies tālāk ā€“ uzreiz iedomāsimies, ka mÅ«su spraudnis izmantos kaut ko no Revit API, kas laika gaitā ir mainÄ«jies, izlaižot jaunas versijas. Vai arÄ« mums vienkārÅ”i kaut kas jāmaina kodā atkarÄ«bā no Revit versijas, kurai mēs veidojam spraudni. Lai atrisinātu Ŕādas koda atŔķirÄ«bas, mēs izmantosim nosacÄ«jumu kompilācijas simbolus. Atveriet projekta rekvizÄ«tus, dodieties uz cilni ā€œMontāža"un laukā"NosacÄ«tā kompilācijas apzÄ«mējums"rakstÄ«sim R2015.

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Ņemiet vērā, ka simbols ir jāpievieno gan atkļūdoÅ”anas, gan izlaiÅ”anas konfigurācijām.

Kamēr atrodamies rekvizÄ«tu logā, mēs nekavējoties pārejam uz cilni ā€œPieteikums"un laukā"Noklusējuma nosaukumvietaĀ» noņemiet piedēkli _2015lai mÅ«su nosaukumvieta bÅ«tu universāla un neatkarÄ«ga no montāžas nosaukuma:

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Manā gadÄ«jumā galaproduktā visu versiju spraudņi tiek ievietoti vienā mapē, tāpēc mani montāžas nosaukumi paliek ar formas sufiksu _20хх. Bet jÅ«s varat arÄ« noņemt sufiksu no montāžas nosaukuma, ja faili atrodas dažādās mapēs.

Dosimies uz faila kodu Klase1.cs un simulēt tur kādu kodu, ņemot vērā dažādas Revit versijas:

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

Es nekavējoties ņēmu vērā visas Revit versijas virs 2015. gada versijas (kas bija pieejamas rakstÄ«Å”anas laikā) un nekavējoties ņēmu vērā nosacÄ«jumu kompilācijas simbolu klātbÅ«tni, kas tiek veidoti, izmantojot to paÅ”u veidni.

Pāriesim pie galvenā akcenta. Mēs savā risinājumā izveidojam jaunu projektu, tikai spraudņa versijai Revit 2016. Atkārtojam visas iepriekÅ” aprakstÄ«tās darbÄ«bas, attiecÄ«gi aizstājot numuru 2015 ar numuru 2016. Bet fails Klase1.cs dzēst no jaunā projekta.

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Fails ar nepiecieÅ”amo kodu - Klase1.cs ā€“ mums tas jau ir, un mums tikai jāievieto saite uz to jaunā projektā. Ir divi veidi, kā ievietot saites:

  1. GarÅ” - ar peles labo pogu noklikŔķiniet uz projekta un atlasiet ā€œPievienotĀ»->Ā«EsoÅ”ais elements", atvērtajā logā atrodiet vajadzÄ«go failu un opcijas vietāPievienot"izvēlies opciju"Pievienot kā savienojumuĀ»

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

  1. ÄŖss ā€“ tieÅ”i risinājumu pārlÅ«kā atlasiet vajadzÄ«go failu (vai pat failus, vai pat veselas mapes) un velciet to jaunā projektā, turot nospiestu taustiņu Alt. Velkot, jÅ«s redzēsit, ka, nospiežot taustiņu Alt, peles kursors tiks mainÄ«ts no pluszÄ«mes uz bultiņu.
    UPD: Es radÄ«ju nelielu neskaidrÄ«bu Å”ajā rindkopā - lai pārsÅ«tÄ«tu vairākus failus, jums vajadzētu turēt nospiestu Shift + Alt!

Pēc procedÅ«ras veikÅ”anas mums bÅ«s fails otrajā projektā Klase1.cs ar atbilstoÅ”o ikonu (zilā bultiņa):

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Rediģējot kodu redaktora logā, varat arī izvēlēties, kurā projekta kontekstā kodu rādīt, kas ļaus redzēt rediģējamo kodu zem dažādiem nosacījuma kompilācijas simboliem:

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Visus pārējos projektus (2017-2020) veidojam, izmantojot Å”o shēmu. Life hack - ja velciet failus Solution Explorer nevis no pamatprojekta, bet no projekta, kur tie jau ir ievietoti kā saite, tad jums nav jātur nospiests Alt taustiņŔ!

AprakstÄ«tā opcija ir diezgan laba lÄ«dz jaunas spraudņa versijas pievienoÅ”anas brÄ«dim vai lÄ«dz jaunu failu pievienoÅ”anas brÄ«dim projektam - tas viss kļūst ļoti nogurdinoÅ”s. Un nesen es pēkŔņi sapratu, kā to visu sakārtot ar vienu projektu, un mēs pārejam pie otrās metodes

Konfigurāciju maģija

Pabeidzot lasÄ«t Å”eit, jÅ«s varat iesaukties: "Kāpēc jÅ«s aprakstÄ«jāt pirmo metodi, ja raksts ir tieÅ”i par otro?!" Un es visu aprakstÄ«ju, lai bÅ«tu skaidrāk, kāpēc mums ir vajadzÄ«gi nosacÄ«ti apkopoÅ”anas simboli un kurās vietās mÅ«su projekti atŔķiras. Un tagad mums kļūst skaidrāk, kādas tieÅ”i atŔķirÄ«bas projektos mums ir jāīsteno, atstājot tikai vienu projektu.

Un, lai viss bÅ«tu acÄ«mredzamāk, mēs neveidosim jaunu projektu, bet veiksim izmaiņas mÅ«su paÅ”reizējā projektā, kas izveidots pirmajā veidā.

Tātad, pirmkārt, mēs no risinājuma noņemam visus projektus, izņemot galveno (kas satur tieÅ”i failus). Tie. projekti versijām 2016-2020. Atveriet mapi ar risinājumu un tur izdzēsiet Å”o projektu mapes.

Mūsu lēmumā ir palicis viens projekts - MySuperPluginForRevit_2015. Atveriet tā rekvizītus un:

  1. Cilnē "Pieteikums"noņemiet sufiksu no montāžas nosaukuma _2015 (kāpēc kļūs skaidrs vēlāk)
  2. Cilnē "MontāžaĀ» noņemiet nosacÄ«tās kompilācijas simbolu R2015 no atbilstoŔā lauka

PiezÄ«me: jaunākajā Visual Studio versijā ir kļūda - nosacÄ«juma kompilācijas simboli netiek parādÄ«ti projekta rekvizÄ«tu logā, lai gan tie ir pieejami. Ja rodas Ŕī kļūme, tās ir jānoņem manuāli no .csproj faila. Tomēr mums vēl ir jāpiestrādā, tāpēc lasiet tālāk.

Pārdēvējiet projektu Solution Explorer logā, noņemot sufiksu _2015 un pēc tam noņemiet projektu no risinājuma. Tas ir nepiecieÅ”ams, lai uzturētu kārtÄ«bu un perfekcionistu jÅ«tas! Mēs atveram mÅ«su risinājuma mapi, tādā paŔā veidā pārdēvējam tur esoÅ”o projekta mapi un ielādējam projektu atpakaļ risinājumā.

Atveriet konfigurācijas pārvaldnieku. ASV konfigurācija Atlaidiet principā tas nebūs vajadzīgs, tāpēc svītrojam. Mēs veidojam jaunas konfigurācijas ar mums jau pazīstamiem nosaukumiem R2015, R2016, ..., R2020. Ņemiet vērā, ka jums nav jākopē iestatījumi no citām konfigurācijām un jums nav jāizveido projekta konfigurācijas:

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Dodieties uz mapi ar projektu un atveriet failu ar paplaÅ”inājumu .csproj sev ērtā redaktorā. Starp citu, to var atvērt arÄ« Visual Studio - jāizlādē projekts un tad vēlamais vienums bÅ«s konteksta izvēlnē:

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

RediģēŔana programmā Visual Studio ir pat vēlama, jo redaktors gan lÄ«dzina, gan uzvednē.

Failā mēs redzēsim elementus PropertyGroup ā€“ paŔā augŔā ir vispārējais, un tad nāk nosacÄ«jumi. Å ie elementi nosaka projekta Ä«paŔības, kad tas tiek bÅ«vēts. Pirmais elements, kas ir bez nosacÄ«jumiem, nosaka vispārÄ«gās Ä«paŔības, un elementi ar nosacÄ«jumiem attiecÄ«gi maina dažas Ä«paŔības atkarÄ«bā no konfigurācijām.

Pārejiet uz kopējo (pirmo) elementu PropertyGroup un apskatÄ«t Ä«paÅ”umu AssemblyName ā€“ Å”is ir kopas nosaukums, un mums tas ir jābÅ«t bez sufiksa _2015. Ja ir piedēklis, noņemiet to.

Elementa atraŔana ar nosacījumu

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

Mums tas nav vajadzÄ«gs - mēs to izdzÄ“Å”am.

Elements ar nosacījumu

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

būs nepiecieŔams, lai strādātu koda izstrādes un atkļūdoŔanas stadijā. Varat mainīt tā rekvizītus atbilstoŔi savām vajadzībām - iestatīt dažādus izvades ceļus, mainīt nosacījumu kompilācijas simbolus utt.

Tagad veidosim jaunus elementus PropertyGroup mūsu konfigurācijām. Šajos elementos mums vienkārŔi jāiestata četri rekvizīti:

  • Izvades ceļŔ - izvades mape. Es iestatÄ«ju noklusējuma vērtÄ«bu binR20xx
  • DefineConstants ā€“ nosacÄ«juma kompilācijas simboli. Jānorāda vērtÄ«ba TRACE;R20хх
  • TargetFrameworkVersion - platformas versija. Dažādām Revit API versijām ir jānorāda dažādas platformas.
  • AssemblyName ā€“ montāžas nosaukums (t.i., faila nosaukums). Var uzrakstÄ«t precÄ«zu montāžas nosaukumu, taču daudzpusÄ«bas labad iesaku ierakstÄ«t vērtÄ«bu $(AssemblyName)_20хх. Lai to izdarÄ«tu, mēs iepriekÅ” noņēmām sufiksu no montāžas nosaukuma

Visu Å”o elementu svarÄ«gākā iezÄ«me ir tā, ka tos var vienkārÅ”i iekopēt citos projektos, tos nemaz nemainot. Vēlāk rakstā pievienoÅ”u visu .csproj faila saturu.

Labi, mēs esam izdomājuÅ”i projekta Ä«paŔības - tas nav grÅ«ti. Bet ko darÄ«t ar spraudņu bibliotēkām (NuGet pakotnēm). Ja skatÄ«simies tālāk, redzēsim, ka iekļautās bibliotēkas ir norādÄ«tas elementos Preču grupa. Bet slikta veiksme - Å”is elements nepareizi apstrādā apstākļus kā elements PropertyGroup. VarbÅ«t tas ir pat Visual Studio kļūme, bet, ja norādāt vairākus elementus Preču grupa ar konfigurācijas nosacÄ«jumiem un ievietojiet dažādas saites uz NuGet pakotnēm, tad, mainot konfigurāciju, visas norādÄ«tās pakotnes tiek savienotas ar projektu.

Elements nāk mums palīgā izvēlēties, kas darbojas saskaņā ar mūsu ierasto loģiku ja-tad-cits.

Izmantojot elementu izvēlētiesMēs iestatām dažādas NuGet pakotnes dažādām konfigurācijām:

Viss saturs 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>

LÅ«dzu, ņemiet vērā, ka vienā no nosacÄ«jumiem es norādÄ«ju divas konfigurācijas, izmantojot VAI. Tādā veidā konfigurācijas laikā tiks pievienota nepiecieÅ”amā pakotne Debug.

Un Å”eit mums ir gandrÄ«z viss ideāli. Mēs ielādējam projektu atpakaļ, iespējojam nepiecieÅ”amo konfigurāciju, izsaucam vienumu ā€œ risinājuma (nevis projekta) konteksta izvēlnē.Atjaunojiet visas NuGet pakotnes"un mēs redzam, kā mainās mÅ«su iepakojumi.

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Un Å”ajā posmā es nonācu strupceļā - lai savāktu visas konfigurācijas uzreiz, mēs varētu izmantot partijas montāžu (izvēlne "MontāžaĀ»->Ā«Partijas veidoÅ”ana"), taču, pārslēdzot konfigurācijas, pakotnes netiek automātiski atjaunotas. Un, saliekot projektu, tas arÄ« nenotiek, lai gan teorētiski tā vajadzētu. Es neesmu atradis Ŕīs problēmas risinājumu, izmantojot standarta lÄ«dzekļus. Un, visticamāk, Ŕī ir arÄ« Visual Studio kļūda.

Tāpēc partijas montāžai tika nolemts izmantot Ä«paÅ”u automatizētu montāžas sistēmu Nuke. Es patiesÄ«bā to negribēju, jo uzskatu, ka tas ir pārspÄ«lēti spraudņa izstrādes ziņā, taču Å”obrÄ«d es neredzu citu risinājumu. Un uz jautājumu "Kāpēc Nuke?" Atbilde ir vienkārÅ”a ā€“ mēs to izmantojam darbā.

Tātad, dodieties uz mÅ«su risinājuma (nevis projekta) mapi, turiet nospiestu taustiņu maiņa un ar peles labo pogu noklikŔķiniet uz tukÅ”as vietas mapē - konteksta izvēlnē atlasiet vienumu "Å eit atveriet PowerShell logu'.

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Ja jums tas nav instalēts nuke,, tad vispirms ierakstiet komandu

dotnet tool install Nuke.GlobalTool ā€“global

Tagad uzrakstiet komandu nuke, un jums tiks piedāvāts konfigurēt nuke, paÅ”reizējam projektam. Es nezinu, kā pareizi uzrakstÄ«t krieviski - angliski tiks rakstÄ«ts Nevarēja atrast .nuke failu. Vai vēlaties iestatÄ«t bÅ«vniecÄ«bu? [y/n]

Nospiediet taustiņu Y, un tad bÅ«s tieÅ”ie iestatÄ«jumu vienumi. Mums ir jāizmanto vienkārŔākais variants MSBuild, tāpēc mēs atbildam kā ekrānuzņēmumā:

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Dosimies uz Visual Studio, kas liks mums atkārtoti ielādēt risinājumu, jo tam ir pievienots jauns projekts. Mēs atkārtoti ielādējam risinājumu un redzam, ka mums ir projekts būvēt kurā mūs interesē tikai viens fails - Build.cs

Mēs veidojam vienu spraudņa projektu ar kompilāciju dažādām Revit/AutoCAD versijām

Atveriet Å”o failu un uzrakstiet skriptu, lai izveidotu projektu visām konfigurācijām. Vai arÄ« izmantojiet manu skriptu, kuru varat rediģēt atbilstoÅ”i savām vajadzÄ«bām:

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

Mēs atgriežamies PowerShell logā un vēlreiz ierakstām komandu nuke, (varat uzrakstÄ«t komandu nuke, norādot nepiecieÅ”amo mērÄ·is. Bet mums ir viens mērÄ·is, kas darbojas pēc noklusējuma). Pēc Enter taustiņa nospieÅ”anas jutÄ«simies kā Ä«sti hakeri, jo, kā jau filmā, mÅ«su projekts tiks automātiski samontēts dažādām konfigurācijām.

Starp citu, jÅ«s varat izmantot PowerShell tieÅ”i no Visual Studio (izvēlne "ApskatÄ«tĀ»->Ā«Citi logiĀ»->Ā«PakeÅ”u pārvaldnieka konsole"), bet viss bÅ«s melnbalts, kas nav Ä«paÅ”i ērti.

Tas noslēdz manu rakstu. Esmu pārliecināts, ka jÅ«s pats varat izdomāt AutoCAD opciju. Ceru, ka Å”eit piedāvātais materiāls atradÄ«s savus ā€œklientusā€.

Š”ŠæŠ°ŃŠøŠ±Š¾ Š·Š° Š²Š½ŠøŠ¼Š°Š½ŠøŠµ!

Avots: www.habr.com

Pievieno komentāru