
Kur zhvillimin e plugjave pĂ«r aplikacionet CAD ( Ă«shtĂ« AutoCAD, Revit dhe Renga) me kalimin e kohĂ«s shfaqet njĂ« problem â dalin versione tĂ« reja tĂ« programeve, ndryshon API i tyre dhe ne duhet tĂ« bĂ«jmĂ« versione tĂ« reja tĂ« plugjave.
Kur keni vetëm një plug dhe jeni akoma fillestar në këtë fushë, mund ta bëni thjesht një kopje të projektit, të ndryshoni vendet e nevojshme dhe të krijoni një version të ri të plugut. Së bashku, çdo ndryshim në kod do të sjellë një rritje të konsiderueshme të shpërndarjes së punës.
Me rritjen e përvojës dhe njohurive do të gjeni disa mënyra për ta automatizuar këtë proces. Unë kalova këtë rrugë dhe dua t'ju them çfarë arrita dhe sa e lehtë është kjo.
Fillimisht, le të shqyrtojmë metodën që është e dukshme dhe e cila e kam përdorur për një kohë të gjatë.
Lidhjet për skedarët e projektit
Dhe për ta bërë gjithçka të thjeshtë, vizuale dhe të qartë, do të përshkruaj gjithçka në një shembull abstrakt të zhvillimit të plugut.
Hapim Visual Studio (kam versionin Community 2019. Dhe po â nĂ« gjuhĂ«n ruse) dhe krijojmĂ« njĂ« zgjidhje tĂ« re. Do ta quajmĂ« MySuperPluginForRevit

Ne do të bëjmë një plug për Revit për versionet 2015-2020. Prandaj do të krijoj një projekt të ri në zgjidhje (Bibliotekë klasash Net Framework) dhe do ta quaj MySuperPluginForRevit_2015

Na nevojitet të shtojmë lidhje për API-në e Revit. Sigurisht, mund të shtojmë lidhje për skedarët lokalë (do të duhet të instalojmë të gjitha SDK-të e nevojshme ose të gjitha versionet e Revit), por ne do të shkojmë direkt në rrugën e duhur dhe do të lidhim paketën NuGet. Mund të gjeni një numër të konsiderueshëm paketash, por unë do të përdor ato të mia.
Pas lidhjes sĂ« paketĂ«s, kliko me klik tĂ« djathtĂ« mbi "Linket" dhe zgjidh nĂ« menu opsionin "Shkalo packages.config nĂ« PackageReferenceâŠÂ»

NĂ«se ndodhi tĂ« filloni panik, sepse nĂ« dritaren e pronave tĂ« paketĂ«s nuk ka njĂ« pikĂ« tĂ« rĂ«ndĂ«sishme "Kopjo lokalisht", e cila Ă«shtĂ« e nevojshme tĂ« vendoset nĂ« vlerĂ«n false, nuk ka nevojĂ« tĂ« panicni â shkojmĂ« nĂ« dosjen e projektit, hapim skedarin me zgjerimin .csproj nĂ« ndonjĂ« editor tĂ« pĂ«rshtatshĂ«m pĂ«r ju (unĂ« pĂ«rdor Notepad++) dhe gjejmĂ« atje shprehjen pĂ«r paketĂ«n tonĂ«. Duke e parĂ« tani kĂ«shtu:
1.0.0Atij i shtojmë pronën runtime. Do të duket kështu:
1.0.0
runtimeTani tani, projekti juaj do të përdorë skedarët nga paketa dhe nuk do t'i kopjojë ato në dosjen e daljes.
TĂ« vazhdojmĂ« - le tĂ« paramendojmĂ« se plUGINI ynĂ« do tĂ« pĂ«rdorĂ« diçka nga Revit API, e cila ka ndryshuar me kalimin e kohĂ«s me daljen e versioneve tĂ« reja. Ose ndoshta na nevojitet tĂ« bĂ«jmĂ« ndonjĂ« ndryshim nĂ« kod nĂ« varĂ«si tĂ« versionit tĂ« Revit pĂ«r tĂ« cilin po krijojmĂ« plUGININ. PĂ«r tĂ« zgjidhur kĂ«to dallime nĂ« kod, do tĂ« pĂ«rdorim simbolet e kompilimit tĂ« kushteve. Hapim pronat e projektit, kalojmĂ« nĂ« tabin âNdĂ«rtimiâ dhe nĂ« fushĂ«n âSimbolet e kompilimit tĂ« kushteveâ do tĂ« shkruajmĂ« R2015.

Vini re se simbolet duhet të shtohen për konfigurimin Debug dhe për konfigurimin Release.
Dhe ndĂ«rsa jemi nĂ« dritaren e pronave, kalojmĂ« menjĂ«herĂ« nĂ« tabin âAplikacioniâ dhe nĂ« fushĂ«n âHapesira e emrit pĂ«r defaultâ dhe heqim sufiksin _2015, pĂ«r t'i dhĂ«nĂ« hapĂ«sirĂ«s sĂ« emrit universale dhe tĂ« pavarur nga emri i paketĂ«s:

Në rastin tim, në produktin përfundimtar, plUGIns e të gjitha versioneve grumbullohen në një dosje, prandaj emrat e paketës mbeten me sufiksin e tipit _20xx. Por ju mund ta hiqni sufiksin dhe nga emri i paketës, nëse parashikohet vendosja e skedarëve në dosje të ndryshme.
Tani kalojmë në kodin e skedarit Class1.cs dhe imitojmë atje një kod duke marrë parasysh versionet e ndryshme të 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", "Përshëndetje Revit 2015");
#elif R2016
TaskDialog.Show("ModPlus", "Përshëndetje Revit 2016");
#elif R2017
TaskDialog.Show("ModPlus", "Përshëndetje Revit 2017");
#elif R2018
TaskDialog.Show("ModPlus", "Përshëndetje Revit 2018");
#elif R2019
TaskDialog.Show("ModPlus", "Përshëndetje Revit 2019");
#elif R2020
TaskDialog.Show("ModPlus", "Përshëndetje Revit 2020");
#endif
return Result.Succeeded;
}
}
}Unë menjëherë kam marrë parasysh të gjitha versionet e Revit mbi versionin 2015 (të cilat ishin në momentin e shkruarjes së artikullit) dhe kam marrë parasysh prani e simboleve të kompilimit të kushteve, të cilat krijohen sipas një modeli të njëjtë.
Tani kalojmë në thelbin e projektit. Krijojmë një projekt të ri në zgjidhjen tonë, por tani për versionin e plUGINIT për Revit 2016. Përsërisim të gjitha hapat e përshkruar më sipër, përkatësisht, duke zëvendësuar numrin 2015 me numrin 2016. Por skedari Class1.cs nga projekti i ri do ta fshini.

Skedari me kodin e nevojshĂ«m - Class1.cs â tashmĂ« e kemi dhe na nevojitet thjesht tĂ« bĂ«jmĂ« njĂ« lidhje pĂ«r tĂ« nĂ« projektin e ri. Ka dy mĂ«nyra pĂ«r tĂ« shtuar lidhje:
- E gjatĂ« â klikojmĂ« me tĂ« djathtĂ«n mbi projektin, zgjidhni opsionin «Shto» -> «Elementi ekzistues», nĂ« dritaren qĂ« hapet gjejmĂ« skedarin e nevojshĂ«m dhe nĂ« vend tĂ« opsionit «Shto» zgjidhim opsionin «Shto si lidhje»

- I shkurtĂ«r â drejtpĂ«rdrejt nĂ« shfletuesin e zgjidhjeve zgjidhim skedarin e nevojshĂ«m (ose madje skedarĂ«. Mund tĂ« transferojmĂ« edhe tĂ«rĂ« dosjet) dhe i tĂ«rheqim nĂ« projektin e ri duke mbajtur tĂ« shtypur çelĂ«sin Alt. GjatĂ« tĂ«rheqjes, do tĂ« shihni se kur mbani çelĂ«sin Alt, kursori nĂ« mi Ă«shtĂ« duke u ndryshuar nga shenjĂ« plusi nĂ« njĂ« shenjĂ« shigjete.
UPD: Kam bĂ«rĂ« pak trazira nĂ« kĂ«tĂ« paragraf â pĂ«r tĂ« transferuar disa skedarĂ« duhet tĂ« mbani tĂ« shtypur Shift+Alt!
Pas përfundimit të procedurës, do të kemi në projektin e dytë skedarin Class1.cs me ikonën përkatëse (shigjeta blu):

Në redaktorin e kodit, gjithashtu mund të zgjidhni në kontekstin e cilit projekt të shfaqni kodin, kjo do t'ju lejojë të shihni dhe të redaktoni kodin gjatë simboleve të ndryshueshmërisë kushtore:

Pas kĂ«saj skeme krijojmĂ« tĂ« gjitha projektet e tjera (2017-2020). NjĂ« tip â nĂ«se tĂ«rhiqni skedarĂ« nĂ« shfletuesin e zgjidhjeve jo nga projekti bazĂ«, por nga projekti ku ata janĂ« tashmĂ« tĂ« futur si lidhje, nuk Ă«shtĂ« e nevojshme tĂ« mbani tĂ« shtypur çelĂ«sin Alt!
MundĂ«sia e pĂ«rshkruar Ă«shtĂ« shumĂ« e mirĂ« deri nĂ« momentin e shtimit tĂ« njĂ« versioni tĂ« ri tĂ« plugin-it ose deri nĂ« shtimin e skedarĂ«ve tĂ« rinj nĂ« projekt â e gjithĂ« kjo bĂ«het shumĂ« e bezdisshme. Dhe sĂ« fundmi, papritmas kuptova se si ta zgjidh çdo gjĂ« me njĂ« projekt dhe tani kalojmĂ« nĂ« mĂ«nyrĂ«n e dytĂ«
Magjia e konfigurimeve
Kur keni lexuar deri këtu, mund të thoni: «Pse e përshkrove mënyrën e parë, nëse artikulli menjëherë flet për të dytën?!». E kam përshkruar të gjithë këtë për të qenë më e qartë se për çfarë na nevojiten simbolet e ndryshueshmërisë kushtore dhe në cilat vende projeketet tona ndryshojnë. Tani është më e qartë se cilat ndryshime të veçanta duhet të realizojmë, duke lënë vetëm një projekt.
Dhe që gjithçka të jetë më e dukshme, nuk do të krijojmë një projekt të ri, por do të bëjmë ndryshime në projektin tonë aktual, të krijuar me mënyrën e parë.
Së pari, hiqni të gjithë projektet nga zgjidhja përveç atij kryesorit (që përmban skedarët konkretë). Domethënë, projektet për versionet 2016-2020. Hapni dosjen me zgjidhjen dhe hiqni aty dosjet e këtyre projekteve.
Na ka mbetur njĂ« projekt nĂ« zgjidhje â MySuperPluginForRevit_2015. Hapni pronĂ«sitĂ« e tij dhe:
- Në skedën «Aplikacioni» hiqni sufixin nga emri i ndërtimit _2015 (më vonë do të bëhet e qartë pse)
- Në skedën «Ndërtimi» heqim simbolin e përkompilimit R2015 nga fusha përkatëse
VĂ«rejtje: nĂ« versionin e fundit tĂ« Visual Studio ka njĂ« defekt â simbolet e pĂ«rkompilimit nuk shfaqen nĂ« dritaren e pronĂ«s sĂ« projektit, ndonĂ«se ato janĂ« aty. NĂ«se e vĂ«reni kĂ«tĂ« defekt, duhet t'i hiqni ato manualisht nga faili .csproj. SidoqoftĂ«, na nevojitet tĂ« punojmĂ« me tĂ«, pra, le tĂ« lexojmĂ« mĂ« tutje.
Rinovojmë projektin në dritaren e shfletuesit të zgjidhjeve duke hequr sufixin _2015 dhe pastaj e heqim projektin nga zgjidhja. Kjo është e nevojshme për të mbajtur rendin dhe ndjenjat e perfeksionistëve! Hapim dosjen tonë të zgjidhjes, e rinovojmë në të njëjtën mënyrë dosjen e projektit dhe e ngarkojmë përsëri projektin në zgjidhje.
Hapim menaxherin e konfigurimeve. Na nevojitet konfigurimi Release nĂ« parim nuk do tĂ« na duhet, kĂ«shtu qĂ« e heqim. KrijojmĂ« konfigurime tĂ« reja me emrat tanĂ« tĂ« njohur R2015, R2016, âŠ, R2020. Vini re se nuk Ă«shtĂ« e nevojshme tĂ« kopjoni parametrat nga konfigurime tĂ« tjera dhe nuk Ă«shtĂ« e nevojshme tĂ« krijoni konfigurime projekti:

Shkoni nĂ« dosjen me projektin dhe hapni skedarin me zgjerim .csproj nĂ« redaktorin qĂ« preferoni. Duke e pĂ«rmendur kĂ«tĂ«, mund ta hapni edhe nĂ« Visual Studio â duhet tĂ« shkarkoni projektin dhe pastaj nĂ« menunĂ« kontekstuale do tĂ« jetĂ« opsioni i nevojshĂ«m:

Edyj në Visual Studio madje është më e preferueshme, pasi redaktori e rregullon dhe jep sugjerime.
NĂ« skedarin do tĂ« shohim elementĂ«t â nĂ« krye Ă«shtĂ« e pĂ«rbashkĂ«t, dhe mĂ« pas vijnĂ« ato me kushte. KĂ«ta elementĂ« vendosin pronat e projektit gjatĂ« ndĂ«rtimit tĂ« tij. Elementi i parĂ«, i cili Ă«shtĂ« pa kushte, vendos pronat e pĂ«rbashkĂ«ta, ndĂ«rsa elementĂ«t me kushte, pĂ«rkatĂ«sisht, ndryshojnĂ« disa prona nĂ« varĂ«si tĂ« konfigurimve.
Kalohet nĂ« elementin e pĂ«rbashkĂ«t (tĂ« parĂ«) PropertyGroup dhe shohim pronĂ«n AssemblyName â kjo Ă«shtĂ« emri i mbledhjes dhe duhet tĂ« jetĂ« pa sufix _2015. NĂ«se ka sufix, atĂ«herĂ« hiqeni atĂ«.
Gjej elementin me kushte
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">Kjo nuk na nevojitet â e heqim atĂ«.
Elementi me kushte
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">do tĂ« na nevojitet pĂ«r punĂ«n nĂ« fazĂ«n e zhvillimit dhe debugs tĂ« kodit. Mund ta ndryshoni pronĂ«n sipas nevojave tuaja â tĂ« vendosni rrugĂ« tĂ« ndryshme tĂ« daljes, tĂ« ndryshoni simbolet e pĂ«rkompilimit etj.
Tani krijojmë elemente të reja PropertyGroup për konfigurimet tona. Në këto elemente na mjafton të vendosim katër prona:
- OutputPath â dosja e daljes. UnĂ« vendos njĂ« vlerĂ« standarde binR20xx
- DefineConstants â simbolet e kompilimit tĂ« kushtĂ«zuar. Duhet tĂ« caktohet vlera TRACE;R20xx
- TargetFrameworkVersion â versioni i platformĂ«s. PĂ«r versione tĂ« ndryshme tĂ« Revit API duhet tĂ« caktohen platforma tĂ« ndryshme.
- AssemblyName â emri i mbledhjes (dmth emri i skedarit). Mund tĂ« shkruani emrin e drejtpĂ«rdrejtĂ« tĂ« mbledhjes, por pĂ«r universalitetin e saj, ju rekomandoj tĂ« shkruani vlerĂ«n $(AssemblyName)_20xx. PĂ«r kĂ«tĂ«, ne mĂ« parĂ« e hiqnim sufixin nga emri i mbledhjes
Tipari më i rëndësishëm i gjithë këtyre elementeve është që ato mund të kopjohen thjesht në projekte të tjera pa e ndryshuar fare. Më poshtë në artikull do të përfshij përmbajtjen e skedarit .csproj.
MirĂ«, u merremi me pronat e projektit â nuk Ă«shtĂ« e vĂ«shtirĂ«. Por çfarĂ« tĂ« bĂ«jmĂ« me bibliotekat e lidhura (paketave NuGet). NĂ«se shikoni mĂ« tej, do tĂ« shihni se bibliotekat e lidhura caktohen nĂ« elementet . Por kĂ«tu Ă«shtĂ« njĂ« problem â ky element e pĂ«rpunon gabim kushtet, siç e bĂ«n elementi PropertyGroup. Ndoshta kjo Ă«shtĂ« njĂ« defekt nĂ« Visual Studio, por nĂ«se caktoni disa elemente ItemGroup me kushtet e konfigurimeve, dhe brenda shtoni lidhje tĂ« ndryshme nĂ« paketat NuGet, atĂ«herĂ« gjatĂ« ndryshimit tĂ« konfigurimit tĂ« projektit, lidhin tĂ« gjitha paketat e caktuara.
Elementi na ndihmon , i cili funksionon sipas logjikës që na është njohur if-then-else.
Duke përdorur elementin Zgjidhni, caktojmë paketa të ndryshme NuGet për konfigura të ndryshme:
Të gjithë përmbajtjen csproj
Debug
AnyCPU
{5AD738D6-4122-4E76-B865-BE7CE0F6B3EB}
Library
Properties
MySuperPluginForRevit
MySuperPluginForRevit
v4.5
512
true
true
full
false
binDebug
DEBUG;R2015
prompt
4
binR2015
TRACE;R2015
v4.5
$(AssemblyName)_2015
binR2016
TRACE;R2016
v4.5
$(AssemblyName)_2016
binR2017
TRACE;R2017
v4.5.2
$(AssemblyName)_2017
binR2018
TRACE;R2018
v4.5.2
$(AssemblyName)_2018
binR2019
TRACE;R2019
v4.7
$(AssemblyName)_2019
binR2020
TRACE;R2020
v4.7
$(AssemblyName)_2020
1.0.0
runtime
1.0.0
runtime
1.0.0
runtime
1.0.0
runtime
1.0.0
runtime
1.0.0
runtimeVini re nga një nga kushtet e mia përmenda dy konfigura përmes OSE (Or). Kështu do të lidhim paketën e nevojshme gjatë konfigurimit Debug.
Dhe këtu pothuajse gjithçka është në rregull. Ngarko përsëri projektin, aktivizo konfigurimin e nevojshëm, thirri në menusë kontekstuale të zgjidhjes (jo të projektit) opsionin «Rivendos të gjitha paketat NuGet» dhe shohim si na ndryshojnë paketat.

Dhe nĂ« kĂ«tĂ« fazĂ« u binda se isha nĂ« njĂ« rrugĂ« pa dalje â pĂ«r tĂ« ndĂ«rtuar tĂ« gjitha konfiguratat menjĂ«herĂ«, ne mund tĂ« pĂ«rdorim ndĂ«rtimin me grup (menunĂ« «NdĂ«rtimi» -> «NdĂ«rtim i grupit»), por gjatĂ« kalimit tĂ« konfigurimeve nuk ndodhi rikuperimi automatik i paketave. Dhe as gjatĂ« ndĂ«rtimit tĂ« projektit nuk ndodhi, edhe pse, nĂ« teorinĂ«, duhet tĂ« ndodhte. Nuk gjetĂ«m zgjidhje standarde pĂ«r kĂ«tĂ« problem. ĂshtĂ« shumĂ« e mundshme qĂ« kjo tĂ« jetĂ« gjithashtu njĂ« defekt i Visual Studio.
Prandaj, pĂ«r ndĂ«rtimin me grup, u vendos tĂ« pĂ«rdoret njĂ« sistem i veçantĂ« i ndĂ«rtimit tĂ« automatizuar . NĂ« tĂ« vĂ«rtetĂ«, unĂ« nuk e doja kĂ«tĂ«, pasi e shoh si tĂ« tepruar nĂ« kuadĂ«r tĂ« zhvillimit tĂ« pluginĂ«ve, por pĂ«r momentin nuk shoh zgjidhje tjetĂ«r. Dhe pĂ«r pyetjen «Pse Nuke?» pĂ«rgjigja Ă«shtĂ« e thjeshtĂ« â e pĂ«rdorim nĂ« punĂ«.
Pra, kalojmĂ« nĂ« dosjen e zgjidhjes sonĂ« (jo tĂ« projektit), mbajmĂ« tĂ« shtypur tastin Shift dhe klikojmĂ« me butonin e djathtĂ« tĂ« mouse-it mbi njĂ« vend tĂ« lirĂ« nĂ« dosje â nĂ« menusĂ« kontekstuale zgjedhim opsionin «Hap dritaren PowerShell kĂ«tu».

Nëse nuk e keni instaluar nuke, atëherë së pari shkruani komandën
dotnet tool install Nuke.GlobalTool âglobalTani shkruani komandĂ«n nuke dhe do t'ju propozohet tĂ« konfiguroni nuke pĂ«r projektin aktual. Nuk e di si ta shkruaj mĂ« mirĂ« kĂ«tĂ« nĂ« shqip â nĂ« anglisht do tĂ« shkruhet Could not find .nuke file. Do you want to setup a build? [y/n]
Shtypni tastin Y dhe më pas do të jenë piketat e konfigurimit. Na nevojitet opsioni më i thjeshtë duke përdorur MSBuild, prandaj përgjigjemi siç është në screenshot:

TĂ« kalojmĂ« nĂ« Visual Studio, e cila do tĂ« na ofrojĂ« tĂ« rindezim zgjidhjen, pasi u shtuam njĂ« projekt tĂ« ri. Rindizim zgjidhjen dhe shohim se na ka dalĂ« projekti build ku na intereson vetĂ«m njĂ« skedar â Build.cs

Hapim këtë skedar dhe shkruajmë skriptin për ndërtimin e projektit për të gjitha konfiguratat. Ose përdorim skriptin tim, të cilin mund ta redaktoni sipas nevojës tuaj:
duke System.IO;
duke Nuke.Common;
duke Nuke.Common.Execution;
duke Nuke.Common.ProjectModel;
duke Nuke.Common.Tools.MSBuild;
duke static Nuke.Common.Tools.MSBuild.MSBuildTasks;
[CheckBuildProjectConfigurations]
[UnsetVisualStudioEnvironmentVariables]
klasa Build : NukeBuild
{
publik static int Main () => Execute(x => x.Compile);
[Solution] readonly Solution Solution;
// Nëse emri i zgjidhjes dhe emri i projektit (plugin) janë të ndryshëm, atëherë tregoni emrin e projektit (plugin) këtu
string PluginName => Solution.Name;
Target Compile => _ => _
.Executes(() =>
{
var project = Solution.GetProject(PluginName);
if (project == null)
throw new FileNotFoundException("Nuk u gjet!");
var build = new List();
foreach (var (_, c) in project.Configurations)
{
var configuration = c.Split("|")[0];
if (configuration == "Debug" || build.Contains(configuration))
continue;
Logger.Normal($"Konfigurimi: {configuration}");
build.Add(configuration);
MSBuild(_ => _
.SetProjectFile(project.Path)
.SetConfiguration(configuration)
.SetTargets("Restore"));
MSBuild(_ => _
.SetProjectFile(project.Path)
.SetConfiguration(configuration)
.SetTargets("Rebuild"));
}
});
}Kthehemi në dritaren PowerShell dhe sërish shkruajmë komandën nuke (mund të shkruani komandën nuke duke specifikuar atë të nevojshme Objektivi. Por ne kemi një Objektivi, që ekzekutohet automatikisht). Pas shtypjes së çelësit Enter, do ta ndiejmë veten si hakerë të vërtetë, sepse ashtu si në film do të ndodhë ndërtimi automatik i projektit tonë për konfigurata të ndryshme.
Pershendetje, mund të përdorni PowerShell direkt nga Visual Studio (menuja "Pamja» -> «Dritare të tjera» -> «Konsola e menaxherit të paketave"), por atje gjithçka do të jetë në bardh e zi, që nuk është shumë e përshtatshme.
Me këtë, artikulli im përfundon. Jam i sigurt se do të mund të kuptoni versionin për AutoCAD vetë. Shpresoj që materiali i paraqitur këtu do të gjejë "klientët" e tij.
Faleminderit për vëmendjen!
Burimi: habr.com
