Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Kur zhvilloni shtojca për aplikacionet CAD (në rastin tim këto janë AutoCAD, Revit dhe Renga) me kalimin e kohës, shfaqet një problem - lëshohen versione të reja të programeve, ndryshimet e tyre në API dhe duhet të bëhen versione të reja të shtojcave.

Kur keni vetëm një shtojcë ose jeni ende një fillestar i vetë-mësuar në këtë çështje, thjesht mund të bëni një kopje të projektit, të ndryshoni vendet e nevojshme në të dhe të montoni një version të ri të shtojcës. Prandaj, ndryshimet e mëvonshme në kod do të sjellin një rritje të shumëfishtë të kostove të punës.

Ndërsa fitoni përvojë dhe njohuri, do të gjeni disa mënyra për të automatizuar këtë proces. Kam ecur në këtë rrugë dhe dua t'ju tregoj se me çfarë përfundova dhe sa i përshtatshëm është.

Së pari, le të shohim një metodë që është e dukshme dhe që unë e kam përdorur për një kohë të gjatë.

Lidhje me skedarët e projektit

Dhe për ta bërë gjithçka të thjeshtë, vizuale dhe të kuptueshme, unë do të përshkruaj gjithçka duke përdorur një shembull abstrakt të zhvillimit të shtojcave.

Le të hapim Visual Studio (kam versionin e Komunitetit 2019. Dhe po - në Rusisht) dhe të krijojmë një zgjidhje të re. Le ta thërrasim atë MySuperPluginForRevit

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Ne do të bëjmë një shtojcë për Revit për versionet 2015-2020. Prandaj, le të krijojmë një projekt të ri në zgjidhje (Net Framework Class Library) dhe ta quajmë atë MySuperPluginForRevit_2015

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Ne duhet të shtojmë lidhje në Revit API. Sigurisht, ne mund të shtojmë lidhje në skedarët lokalë (do të duhet të instalojmë të gjitha SDK-të e nevojshme ose të gjitha versionet e Revit), por menjëherë do të ndjekim rrugën e duhur dhe do të lidhim paketën NuGet. Ju mund të gjeni mjaft paketa, por unë do të përdor të miat.

Pas lidhjes së paketës, kliko me të djathtën mbi artikullin "Referencat"dhe zgjidhni artikullin"Zhvendos packages.config te PackageReference...»

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Nëse papritmas në këtë pikë filloni të frikësoheni, sepse në dritaren e vetive të paketës nuk do të ketë asnjë artikull të rëndësishëm "Kopjo në vend", të cilën patjetër duhet t'i vendosim në vlerë i rremë, atëherë mos u frikësoni - shkoni te dosja me projektin, hapni skedarin me shtesën .csproj në një redaktues të përshtatshëm për ju (Unë përdor Notepad++) dhe gjeni një hyrje në lidhje me paketën tonë atje. Ajo tani duket kështu:

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

Shtoni një pronë në të koha e ekzekutimit. Do të dalë kështu:

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

Tani, kur ndërtoni një projekt, skedarët nga paketa nuk do të kopjohen në dosjen e daljes.
Le të shkojmë më tej - le të imagjinojmë menjëherë se shtojca jonë do të përdorë diçka nga Revit API, e cila ka ndryshuar me kalimin e kohës kur versionet e reja janë lëshuar. Epo, ose thjesht duhet të ndryshojmë diçka në kod në varësi të versionit të Revit për të cilin po bëjmë shtojcën. Për të zgjidhur ndryshime të tilla në kod, ne do të përdorim simbolet e kompilimit të kushtëzuar. Hapni vetitë e projektit, shkoni te skeda "asamble"dhe në fushë"Shënimi i përpilimit të kushtëzuar"Le të shkruajmë R2015.

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Vini re se simboli duhet të shtohet si për konfigurimin e "Debug" dhe "Release".

Epo, ndërsa jemi në dritaren e vetive, menjëherë shkojmë në skedën "Aplikim"dhe në fushë"Hapësira e paracaktuar e emrave» hiq prapashtesën _2015kështu që hapësira jonë e emrave është universale dhe e pavarur nga emri i asamblesë:

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Në rastin tim, në produktin përfundimtar, shtojcat e të gjitha versioneve futen në një dosje, kështu që emrat e mi të asamblesë mbeten me prapashtesën e formularit _20хх. Por ju gjithashtu mund të hiqni prapashtesën nga emri i asamblesë nëse skedarët supozohet të jenë të vendosura në dosje të ndryshme.

Le të shkojmë te kodi i skedarit Klasa 1.cs dhe simuloni disa kode atje, duke marrë parasysh versione të 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", "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;
        }
    }
}

Unë menjëherë mora parasysh të gjitha versionet e Revit mbi versionin 2015 (të cilat ishin të disponueshme në kohën e shkrimit) dhe menjëherë mora parasysh praninë e simboleve të përpilimit të kushtëzuar, të cilat krijohen duke përdorur të njëjtin shabllon.

Le të kalojmë te pika kryesore. Ne krijojmë një projekt të ri në zgjidhjen tonë, vetëm për versionin e plugin-it për Revit 2016. Përsëritim të gjitha hapat e përshkruar më sipër, respektivisht, duke zëvendësuar numrin 2015 me numrin 2016. Por skedari Klasa 1.cs fshini nga projekti i ri.

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Skedari me kodin e kërkuar - Klasa 1.cs – e kemi tashmë dhe na duhet vetëm të fusim një lidhje me të në një projekt të ri. Ka dy mënyra për të futur lidhje:

  1. E gjatë – klikoni me të djathtën mbi projektin dhe zgjidhni “Shtoj»->«Elementi ekzistues", në dritaren që hapet, gjeni skedarin e kërkuar dhe në vend të opsionit "Shtoj"zgjidh opsionin"Shto si lidhje»

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

  1. Короткий – direkt në eksploruesin e zgjidhjeve, zgjidhni skedarin e dëshiruar (ose edhe skedarë, apo edhe dosje të tëra) dhe tërhiqeni atë në një projekt të ri duke mbajtur të shtypur tastin Alt. Ndërsa zvarriteni, do të shihni se kur shtypni tastin Alt, kursori i miut do të ndryshojë nga një shenjë plus në një shigjetë.
    UPD: Kam bërë një konfuzion të vogël në këtë paragraf - për të transferuar disa skedarë duhet të mbani shtypur Shift + Alt!

Pas kryerjes së procedurës do të kemi një dosje në projektin e dytë Klasa 1.cs me ikonën përkatëse (shigjeta blu):

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Kur redaktoni kodin në dritaren e redaktuesit, mund të zgjidhni gjithashtu se në cilin kontekst të projektit do të shfaqet kodi, i cili do t'ju lejojë të shihni kodin që redaktohet nën simbole të ndryshme të përpilimit të kushtëzuar:

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Ne krijojmë të gjitha projektet e tjera (2017-2020) duke përdorur këtë skemë. Life hack - nëse i tërhiqni skedarët në Solution Explorer jo nga projekti bazë, por nga projekti ku ato janë futur tashmë si lidhje, atëherë nuk keni pse të mbani të shtypur tastin Alt!

Opsioni i përshkruar është mjaft i mirë deri në momentin e shtimit të një versioni të ri të shtojcës ose deri në momentin e shtimit të skedarëve të rinj në projekt - e gjithë kjo bëhet shumë e lodhshme. Dhe kohët e fundit papritmas kuptova se si t'i zgjidhja të gjitha me një projekt dhe ne po kalojmë në metodën e dytë

Magjia e konfigurimeve

Pasi të keni mbaruar së lexuari këtu, mund të bërtisni: "Pse e përshkruani metodën e parë, nëse artikulli ka të bëjë menjëherë me të dytën?" Dhe përshkrova gjithçka për ta bërë më të qartë pse na duhen simbolet e përpilimit të kushtëzuar dhe në cilat vende ndryshojnë projektet tona. Dhe tani na bëhet më e qartë se çfarë dallimesh në projekte duhet të zbatojmë, duke lënë vetëm një projekt.

Dhe për ta bërë gjithçka më të dukshme, ne nuk do të krijojmë një projekt të ri, por do të bëjmë ndryshime në projektin tonë aktual të krijuar në mënyrën e parë.

Pra, para së gjithash, ne heqim të gjitha projektet nga zgjidhja, përveç atij kryesor (që përmban skedarët drejtpërdrejt). Ato. projektet për versionet 2016-2020. Hapni dosjen me zgjidhjen dhe fshini dosjet e këtyre projekteve atje.

Ne kemi një projekt të mbetur në vendimin tonë - MySuperPluginForRevit_2015. Hapni vetitë e tij dhe:

  1. në skedën "Aplikim"Hiq prapashtesën nga emri i asamblesë _2015 (do të bëhet e qartë pse më vonë)
  2. në skedën "asamble» hiqni simbolin e përpilimit të kushtëzuar R2015 nga fusha përkatëse

Shënim: versioni më i fundit i Visual Studio ka një gabim - simbolet e kompilimit të kushtëzuar nuk shfaqen në dritaren e vetive të projektit, megjithëse ato janë të disponueshme. Nëse e përjetoni këtë defekt, atëherë duhet t'i hiqni ato manualisht nga skedari .csproj. Sidoqoftë, ne ende duhet të punojmë në të, kështu që lexoni më tej.

Riemërtoni projektin në dritaren e Solution Explorer duke hequr prapashtesën _2015 dhe pastaj hiqni projektin nga zgjidhja. Kjo është e nevojshme për të ruajtur rendin dhe ndjenjat e perfeksionistëve! Ne hapim dosjen e zgjidhjes sonë, riemërtojmë dosjen e projektit atje në të njëjtën mënyrë dhe e ngarkojmë projektin përsëri në zgjidhje.

Hapni menaxherin e konfigurimit. Konfigurimi i SHBA Lirimin në parim, nuk do të jetë e nevojshme, kështu që ne e fshijmë atë. Ne krijojmë konfigurime të reja me emra që janë tashmë të njohur për ne R2015, R2016,, R2020. Vini re se nuk keni nevojë të kopjoni cilësimet nga konfigurimet e tjera dhe nuk keni nevojë të krijoni konfigurime të projektit:

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Shkoni te dosja me projektin dhe hapni skedarin me shtesën .csproj në një redaktues të përshtatshëm për ju. Nga rruga, ju gjithashtu mund ta hapni atë në Visual Studio - ju duhet të shkarkoni projektin dhe më pas artikulli i dëshiruar do të jetë në menunë e kontekstit:

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Editimi në Visual Studio është madje i preferueshëm, pasi redaktori njëkohësisht rreshton dhe kërkon.

Në skedar do të shohim elementet PropertyGroup – në krye është ai i përgjithshëm dhe më pas vijnë kushtet. Këta elementë vendosin vetitë e projektit kur ai ndërtohet. Elementi i parë, i cili është pa kushte, vendos vetitë e përgjithshme, dhe elementët me kushte, në përputhje me rrethanat, ndryshojnë disa veti në varësi të konfigurimeve.

Shkoni te elementi i përbashkët (i parë). PropertyGroup dhe shikoni pronën Emri i Kuvendit – kështu quhet kuvendi dhe duhet ta kemi pa prapashtesë _2015. Nëse ka një prapashtesë, atëherë hiqeni atë.

Gjetja e një elementi me një kusht

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

Nuk na duhet - e fshijmë.

Element me gjendje

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

do të nevojiten për të punuar në fazën e zhvillimit të kodit dhe korrigjimit. Ju mund t'i ndryshoni vetitë e tij për t'iu përshtatur nevojave tuaja - vendosni shtigje të ndryshme daljeje, ndryshoni simbolet e kompilimit të kushtëzuar, etj.

Tani le të krijojmë elementë të rinj PropertyGroup për konfigurimet tona. Në këto elemente na duhet vetëm të vendosim katër veti:

  • Rruga e daljes – dosja e daljes. Vendosa vlerën e paracaktuar binR20xx
  • Përcaktoni konstantet – simbolet e përpilimit të kushtëzuar. Vlera duhet të specifikohet GJURMË;R20хх
  • TargetFramework Version – versioni i platformës. Versione të ndryshme të Revit API kërkojnë që të specifikohen platforma të ndryshme.
  • Emri i Kuvendit – emri i asamblesë (d.m.th. emri i skedarit). Ju mund të shkruani emrin e saktë të asamblesë, por për shkathtësi unë rekomandoj të shkruani vlerën $(AssemblyName)_20хх. Për ta bërë këtë, ne hoqëm më parë prapashtesën nga emri i asamblesë

Tipari më i rëndësishëm i të gjithë këtyre elementeve është se ato thjesht mund të kopjohen në projekte të tjera pa i ndryshuar fare. Më vonë në artikull do të bashkëngjit të gjithë përmbajtjen e skedarit .csproj.

Mirë, ne kemi kuptuar vetitë e projektit - nuk është e vështirë. Por çfarë të bëjmë me bibliotekat e shtojcave (paketat NuGet). Nëse shikojmë më tej, do të shohim se bibliotekat e përfshira janë të specifikuara në elemente Grupi i artikujve. Por fati i keq - ky element i përpunon gabimisht kushtet si element PropertyGroup. Ndoshta kjo është edhe një defekt i Visual Studio, por nëse specifikoni disa elementë Grupi i artikujve me kushtet e konfigurimit dhe futni lidhje të ndryshme me paketat NuGet brenda, atëherë kur ndryshoni konfigurimin, të gjitha paketat e specifikuara lidhen me projektin.

Elementi na vjen në ndihmë Zgjedh, e cila funksionon sipas logjikës sonë të zakonshme nëse-atëherë-tjetër.

Përdorimi i elementit Zgjedh, ne vendosëm paketa të ndryshme NuGet për konfigurime të ndryshme:

Të gjitha përmbajtjet 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>

Ju lutemi vini re se në një nga kushtet unë specifikova dy konfigurime nëpërmjet OSE. Në këtë mënyrë paketa e kërkuar do të lidhet gjatë konfigurimit Rregulloj.

Dhe këtu kemi pothuajse gjithçka perfekte. Ne ngarkojmë përsëri projektin, aktivizojmë konfigurimin që na nevojitet, thërrasim artikullin " në menunë e kontekstit të zgjidhjes (jo projektin)Rivendos të gjitha paketat NuGet“dhe ne shohim se si ndryshojnë paketat tona.

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Dhe në këtë fazë arrita në një rrugë pa krye - për të mbledhur të gjitha konfigurimet menjëherë, ne mund të përdorim montimin e grupit (menu "asamble»->«Ndërtimi i grupit"), por kur ndërroni konfigurimet, paketat nuk rikthehen automatikisht. Dhe kur montoni projektin, kjo gjithashtu nuk ndodh, megjithëse, në teori, duhet. Unë nuk kam gjetur një zgjidhje për këtë problem duke përdorur mjete standarde. Dhe ka shumë të ngjarë që ky është gjithashtu një gabim i Visual Studio.

Prandaj, për montimin e grupeve, u vendos të përdoret një sistem i veçantë i automatizuar montimi Nuke. Në fakt nuk e doja këtë sepse mendoj se është e tepruar për sa i përket zhvillimit të shtojcave, por për momentin nuk shoh ndonjë zgjidhje tjetër. Dhe në pyetjen "Pse Nuke?" Përgjigja është e thjeshtë - ne e përdorim atë në punë.

Pra, shkoni te dosja e zgjidhjes sonë (jo projekti), mbani të shtypur tastin Ndryshim dhe kliko me të djathtën në një hapësirë ​​boshe në dosje - në menunë e kontekstit zgjidhni artikullin "Hapni dritaren e PowerShell këtu'.

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Nëse nuk e keni të instaluar nuke, pastaj fillimisht shkruani komandën

dotnet tool install Nuke.GlobalTool –global

Tani shkruani komandën nuke dhe do t'ju kërkohet të konfiguroni nuke për projektin aktual. Nuk di si ta shkruaj këtë më saktë në rusisht - në anglisht do të shkruhet Nuk mund ta gjej skedarin .nuke. Dëshiron të konfigurosh një ndërtim? [y/n]

Shtypni butonin Y dhe më pas do të ketë artikuj të drejtpërdrejtë të cilësimeve. Ne kemi nevojë për opsionin më të thjeshtë duke përdorur MSBuild, kështu që ne përgjigjemi si në pamjen e ekranit:

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Le të shkojmë te Visual Studio, e cila do të na shtyjë të rifreskojmë zgjidhjen, pasi i është shtuar një projekt i ri. Ne ringarkojmë zgjidhjen dhe shohim që kemi një projekt ndërtuar në të cilën ne jemi të interesuar vetëm për një skedar - Build.cs

Ne bëjmë një projekt plugin me përpilim për versione të ndryshme të Revit/AutoCAD

Hapeni këtë skedar dhe shkruani një skript për të ndërtuar projektin për të gjitha konfigurimet. Epo, ose përdorni skriptin tim, të cilin mund ta modifikoni për t'iu përshtatur nevojave tuaja:

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

Kthehemi në dritaren e PowerShell dhe shkruajmë përsëri komandën nuke (mund të shkruani komandën nuke duke treguar të nevojshme Objektiv. Por ne kemi një Objektiv, i cili funksionon si parazgjedhje). Pasi të shtypim tastin Enter, do të ndihemi si hakerë të vërtetë, sepse, si në një film, projekti ynë do të montohet automatikisht për konfigurime të ndryshme.

Nga rruga, ju mund të përdorni PowerShell direkt nga Visual Studio (menuja "Pamje»->«Dritare të tjera»->«Konsola e Menaxherit të Paketave"), por gjithçka do të jetë bardh e zi, gjë që nuk është shumë e përshtatshme.

Kjo përfundon artikullin tim. Jam i sigurt se mund ta kuptoni vetë opsionin për AutoCAD. Shpresoj që materiali i paraqitur këtu të gjejë "klientët" e tij.

Спасибо за внимание!

Burimi: www.habr.com

Shto një koment