Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Kapag bumubuo ng mga plugin para sa mga CAD application (sa aking kaso ito ay AutoCAD, Revit at Renga) sa paglipas ng panahon, lumilitaw ang isang problema - ang mga bagong bersyon ng mga programa ay inilabas, ang kanilang mga pagbabago sa API at mga bagong bersyon ng mga plugin ay kailangang gawin.

Kapag mayroon ka lamang isang plugin o ikaw ay isang self-taught baguhan pa rin sa bagay na ito, maaari ka lamang gumawa ng isang kopya ng proyekto, baguhin ang mga kinakailangang lugar sa loob nito at mag-assemble ng isang bagong bersyon ng plugin. Alinsunod dito, ang mga kasunod na pagbabago sa code ay mangangailangan ng maraming pagtaas sa mga gastos sa paggawa.

Habang nakakuha ka ng karanasan at kaalaman, makakahanap ka ng ilang paraan para i-automate ang prosesong ito. Tinahak ko ang landas na ito at gusto kong sabihin sa iyo kung ano ang natapos ko at kung gaano ito kaginhawaan.

Una, tingnan natin ang isang paraan na halata at matagal ko nang ginagamit.

Mga link sa mga file ng proyekto

At para gawing simple, visual at naiintindihan ang lahat, ilalarawan ko ang lahat gamit ang abstract na halimbawa ng pag-develop ng plugin.

Buksan natin ang Visual Studio (Mayroon akong bersyon ng Community 2019. At oo - sa Russian) at lumikha ng bagong solusyon. Tawagan natin siya MySuperPluginForRevit

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Gagawa kami ng plugin para sa Revit para sa mga bersyon 2015-2020. Samakatuwid, gumawa tayo ng bagong proyekto sa solusyon (Net Framework Class Library) at tawagan ito MySuperPluginForRevit_2015

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Kailangan naming magdagdag ng mga link sa Revit API. Siyempre, maaari kaming magdagdag ng mga link sa mga lokal na file (kakailanganin naming i-install ang lahat ng kinakailangang SDK o lahat ng bersyon ng Revit), ngunit agad naming susundin ang tamang landas at ikonekta ang NuGet package. Makakahanap ka ng ilang pakete, ngunit gagamitin ko ang sarili ko.

Pagkatapos ikonekta ang package, mag-right click sa item na "sanggunian"at piliin ang item"Ilipat ang packages.config sa PackageReference...Β»

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Kung biglang sa puntong ito ay nagsimula kang mag-panic, dahil sa window ng mga katangian ng package ay walang mahalagang item "Kopyahin nang lokal", na talagang kailangan nating itakda sa halaga hindi totoo, pagkatapos ay huwag mag-panic - pumunta sa folder na may proyekto, buksan ang file na may extension na .csproj sa isang editor na maginhawa para sa iyo (gumagamit ako ng Notepad++) at maghanap ng entry tungkol sa aming package doon. Ganito siya ngayon:

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

Magdagdag ng property dito runtime. Ito ay magiging ganito:

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

Ngayon, kapag nagtatayo ng isang proyekto, ang mga file mula sa package ay hindi makokopya sa output folder.
Pumunta pa tayo - isipin agad natin na ang ating plugin ay gagamit ng isang bagay mula sa Revit API, na nagbago sa paglipas ng panahon kapag ang mga bagong bersyon ay inilabas. Well, o kailangan lang naming baguhin ang isang bagay sa code depende sa bersyon ng Revit kung saan kami gumagawa ng plugin. Upang malutas ang mga naturang pagkakaiba sa code, gagamit kami ng mga conditional compilation na simbolo. Buksan ang mga katangian ng proyekto, pumunta sa tab na "Assembly"at sa bukid"Kondisyon na compilation notation"magsulat tayo R2015.

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Tandaan na ang simbolo ay dapat idagdag para sa mga configuration ng Debug at Release.

Buweno, habang kami ay nasa window ng mga katangian, agad kaming pumunta sa tab na "App"at sa bukid"Default na namespaceΒ» alisin ang panlapi _2015upang ang aming namespace ay pangkalahatan at independiyente sa pangalan ng pagpupulong:

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Sa aking kaso, sa huling produkto, ang mga plugin ng lahat ng mga bersyon ay inilalagay sa isang folder, kaya ang aking mga pangalan ng pagpupulong ay nananatili sa suffix ng form _20Ρ…Ρ…. Ngunit maaari mo ring alisin ang suffix mula sa pangalan ng pagpupulong kung ang mga file ay dapat na matatagpuan sa iba't ibang mga folder.

Pumunta tayo sa file code Class1.cs at gayahin ang ilang code doon, isinasaalang-alang ang iba't ibang bersyon ng 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;
        }
    }
}

Kaagad kong isinasaalang-alang ang lahat ng mga bersyon ng Revit sa itaas na bersyon 2015 (na magagamit sa oras ng pagsulat) at agad na isinasaalang-alang ang pagkakaroon ng mga kondisyong simbolo ng compilation, na nilikha gamit ang parehong template.

Lumipat tayo sa pangunahing highlight. Lumilikha kami ng isang bagong proyekto sa aming solusyon, para lamang sa bersyon ng plugin para sa Revit 2016. Inuulit namin ang lahat ng mga hakbang na inilarawan sa itaas, ayon sa pagkakabanggit, pinapalitan ang numerong 2015 sa numerong 2016. Ngunit ang file Class1.cs tanggalin mula sa bagong proyekto.

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

File na may kinakailangang code - Class1.cs – mayroon na tayo nito at kailangan lang nating maglagay ng link dito sa isang bagong proyekto. Mayroong dalawang paraan upang magpasok ng mga link:

  1. Mahaba – i-right click sa proyekto at piliin ang β€œMagdagdagΒ»->Β«Umiiral na elemento", sa window na bubukas, hanapin ang kinakailangang file at sa halip na ang opsyon "Magdagdag"piliin ang opsyon"Idagdag bilang koneksyonΒ»

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

  1. Maikli – direkta sa solution explorer, piliin ang nais na file (o kahit na mga file, o kahit buong folder) at i-drag ito sa isang bagong proyekto habang pinipigilan ang Alt key. Habang nagda-drag ka, makikita mo na kapag pinindot mo ang Alt key, ang cursor ng mouse ay magbabago mula sa isang plus sign patungo sa isang arrow.
    UPS: Gumawa ako ng kaunting pagkalito sa talatang ito - upang maglipat ng ilang mga file na dapat mong hawakan Shift + Alt!

Matapos isagawa ang pamamaraan, magkakaroon kami ng isang file sa pangalawang proyekto Class1.cs na may kaukulang icon (asul na arrow):

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Kapag nag-e-edit ng code sa window ng editor, maaari mo ring piliin kung saang konteksto ng proyekto ipapakita ang code, na magbibigay-daan sa iyong makita ang code na ini-edit sa ilalim ng iba't ibang mga conditional na simbolo ng compilation:

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Ginagawa namin ang lahat ng iba pang proyekto (2017-2020) gamit ang scheme na ito. Life hack - kung nag-drag ka ng mga file sa Solution Explorer hindi mula sa base project, ngunit mula sa proyekto kung saan naipasok na ang mga ito bilang isang link, hindi mo na kailangang pindutin nang matagal ang Alt key!

Ang inilarawan na opsyon ay medyo mabuti hanggang sa sandali ng pagdaragdag ng isang bagong bersyon ng plugin o hanggang sa sandali ng pagdaragdag ng mga bagong file sa proyekto - lahat ng ito ay nagiging lubhang nakakapagod. At kamakailan ay bigla kong napagtanto kung paano ayusin ang lahat ng ito sa isang proyekto at kami ay lumipat sa pangalawang paraan

Ang mahika ng mga pagsasaayos

Matapos mong basahin dito, maaari mong ibulalas, "Bakit mo inilarawan ang unang paraan, kung ang artikulo ay kaagad tungkol sa pangalawa?!" At inilarawan ko ang lahat para gawing mas malinaw kung bakit kailangan namin ng mga conditional compilation na simbolo at sa kung anong mga lugar ang aming mga proyekto ay naiiba. At ngayon ay nagiging mas malinaw sa atin kung ano mismo ang mga pagkakaiba sa mga proyekto na kailangan nating ipatupad, na nag-iiwan lamang ng isang proyekto.

At upang gawing mas malinaw ang lahat, hindi kami gagawa ng bagong proyekto, ngunit gagawa ng mga pagbabago sa aming kasalukuyang proyekto na ginawa sa unang paraan.

Kaya, una sa lahat, tinanggal namin ang lahat ng mga proyekto mula sa solusyon maliban sa pangunahing isa (na naglalaman ng mga file nang direkta). Yung. mga proyekto para sa mga bersyon 2016-2020. Buksan ang folder na may solusyon at tanggalin ang mga folder ng mga proyektong ito doon.

Mayroon kaming isang proyekto na natitira sa aming desisyon - MySuperPluginForRevit_2015. Buksan ang mga katangian nito at:

  1. Sa tab na "App"alisin ang suffix sa pangalan ng assembly _2015 (ito ay magiging malinaw kung bakit mamaya)
  2. Sa tab na "AssemblyΒ» alisin ang conditional compilation symbol R2015 mula sa kaukulang larangan

Tandaan: ang pinakabagong bersyon ng Visual Studio ay may bug - hindi ipinapakita ang mga conditional compilation na simbolo sa window ng project properties, bagama't available ang mga ito. Kung nararanasan mo ang glitch na ito, kailangan mong manu-manong alisin ang mga ito mula sa .csproj file. Gayunpaman, kailangan pa rin nating pagsikapan ito, kaya magbasa pa.

Palitan ang pangalan ng proyekto sa window ng Solution Explorer sa pamamagitan ng pag-alis ng suffix _2015 at pagkatapos ay alisin ang proyekto mula sa solusyon. Ito ay kinakailangan upang mapanatili ang kaayusan at damdamin ng mga perfectionist! Binuksan namin ang folder ng aming solusyon, palitan ang pangalan ng folder ng proyekto doon sa parehong paraan at i-load ang proyekto pabalik sa solusyon.

Buksan ang configuration manager. configuration ng US Bitawan sa prinsipyo, hindi ito kakailanganin, kaya tinanggal namin ito. Gumagawa kami ng mga bagong configuration na may mga pangalan na pamilyar na sa amin R2015, R2016,…, R2020. Tandaan na hindi mo kailangang kopyahin ang mga setting mula sa iba pang mga configuration at hindi mo kailangang gumawa ng mga configuration ng proyekto:

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Pumunta sa folder na may proyekto at buksan ang file na may extension na .csproj sa isang editor na maginhawa para sa iyo. Sa pamamagitan ng paraan, maaari mo ring buksan ito sa Visual Studio - kailangan mong i-unload ang proyekto at pagkatapos ay ang nais na item ay nasa menu ng konteksto:

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Ang pag-edit sa Visual Studio ay mas kanais-nais, dahil ang editor ay parehong nakahanay at nag-uudyok.

Sa file makikita natin ang mga elemento PropertyGroup – sa pinakatuktok ay ang pangkalahatan, at pagkatapos ay darating ang mga kundisyon. Ang mga elementong ito ay nagtatakda ng mga katangian ng proyekto kapag ito ay binuo. Ang unang elemento, na walang kundisyon, ay nagtatakda ng mga pangkalahatang katangian, at mga elementong may mga kundisyon, nang naaayon, nagbabago ng ilang katangian depende sa mga pagsasaayos.

Pumunta sa karaniwang (unang) elemento PropertyGroup at tumingin sa ari-arian AssemblyName – ito ang pangalan ng kapulungan at dapat ay mayroon tayo nito nang walang panlapi _2015. Kung may panlapi, pagkatapos ay alisin ito.

Paghahanap ng elementong may kundisyon

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

Hindi namin ito kailangan - tinatanggal namin ito.

Elemento na may kondisyon

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

ay kinakailangan upang gumana sa yugto ng pagbuo ng code at pag-debug. Maaari mong baguhin ang mga katangian nito upang umangkop sa iyong mga pangangailangan - magtakda ng iba't ibang mga path ng output, baguhin ang mga simbolo ng conditional compilation, atbp.

Ngayon gumawa tayo ng mga bagong elemento PropertyGroup para sa aming mga pagsasaayos. Sa mga elementong ito kailangan lang nating magtakda ng apat na katangian:

  • Output path - folder ng output. Itinakda ko ang default na halaga binR20xx
  • DefineConstants – kondisyonal na mga simbolo ng compilation. Dapat tukuyin ang halaga TRACE;R20Ρ…Ρ…
  • TargetFrameworkVersion – bersyon ng platform. Ang iba't ibang bersyon ng Revit API ay nangangailangan ng iba't ibang platform upang matukoy.
  • AssemblyName – pangalan ng pagpupulong (i.e. pangalan ng file). Maaari mong isulat ang eksaktong pangalan ng pagpupulong, ngunit para sa versatility inirerekumenda kong isulat ang halaga $(AssemblyName)_20Ρ…Ρ…. Upang gawin ito, inalis namin dati ang suffix mula sa pangalan ng pagpupulong

Ang pinakamahalagang tampok ng lahat ng mga elementong ito ay ang mga ito ay maaaring kopyahin lamang sa iba pang mga proyekto nang hindi binabago ang mga ito. Mamaya sa artikulo ay ilakip ko ang lahat ng nilalaman ng .csproj file.

Okay, nalaman namin ang mga katangian ng proyekto - hindi ito mahirap. Ngunit ano ang gagawin sa mga plug-in na aklatan (NuGet packages). Kung titingnan pa natin, makikita natin na ang mga kasamang aklatan ay tinukoy sa mga elemento ItemGroup. Ngunit malas - ang elementong ito ay hindi wastong nagpoproseso ng mga kundisyon bilang isang elemento PropertyGroup. Marahil ito ay kahit na isang Visual Studio glitch, ngunit kung tinukoy mo ang ilang mga elemento ItemGroup na may mga kundisyon ng pagsasaayos, at magpasok ng iba't ibang mga link sa mga pakete ng NuGet sa loob, pagkatapos kapag binago mo ang pagsasaayos, lahat ng tinukoy na mga pakete ay konektado sa proyekto.

Ang elemento ay tumulong sa atin Piliin, na gumagana ayon sa aming karaniwang lohika kung sakali ay.

Gamit ang elemento Piliin, nagtakda kami ng iba't ibang NuGet package para sa iba't ibang configuration:

Lahat ng nilalaman 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>

Pakitandaan na sa isa sa mga kundisyon ay tinukoy ko ang dalawang configuration sa pamamagitan ng O. Sa ganitong paraan ang kinakailangang pakete ay ikokonekta sa panahon ng pagsasaayos Mag-alis ng mga insekto.

At dito mayroon kaming halos lahat ay perpekto. I-load namin ang proyekto pabalik, paganahin ang pagsasaayos na kailangan namin, tawagan ang item " sa menu ng konteksto ng solusyon (hindi ang proyekto)Ibalik ang lahat ng mga pakete ng NuGet"at nakikita namin kung paano nagbabago ang aming mga pakete.

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

At sa yugtong ito ay nakarating ako sa isang dead end - upang mangolekta ng lahat ng mga pagsasaayos nang sabay-sabay, maaari naming gamitin ang batch assembly (menu "AssemblyΒ»->Β«Batch build"), ngunit kapag nagpapalit ng mga configuration, ang mga package ay hindi awtomatikong naibabalik. At kapag nagtitipon ng proyekto, hindi rin ito nangyayari, bagaman, sa teorya, dapat ito. Wala akong nakitang solusyon sa problemang ito gamit ang karaniwang paraan. At malamang na isa rin itong Visual Studio bug.

Samakatuwid, para sa batch assembly, napagpasyahan na gumamit ng isang espesyal na awtomatikong sistema ng pagpupulong Nuke. Sa totoo lang ay hindi ko ito ginusto dahil sa tingin ko ito ay overkill sa mga tuntunin ng pag-develop ng plugin, ngunit sa ngayon ay wala akong nakikitang ibang solusyon. At sa tanong na "Bakit Nuke?" Ang sagot ay simple - ginagamit namin ito sa trabaho.

Kaya, pumunta sa folder ng aming solusyon (hindi ang proyekto), pindutin nang matagal ang susi Ilipat at i-right-click sa isang walang laman na puwang sa folder - sa menu ng konteksto piliin ang item na "Buksan ang PowerShell window dito'.

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Kung hindi mo ito na-install nuke, pagkatapos ay isulat muna ang utos

dotnet tool install Nuke.GlobalTool –global

Ngayon isulat ang utos nuke at sasabihan kang mag-configure nuke para sa kasalukuyang proyekto. Hindi ko alam kung paano ito isulat nang mas tama sa Russian - sa English ito ay isusulat Could not find .nuke file. Gusto mo bang mag-set up ng build? [y/n]

Pindutin ang Y key at pagkatapos ay magkakaroon ng mga direktang item sa mga setting. Kailangan namin ang pinakasimpleng opsyon gamit MSBuild, kaya sumagot kami tulad ng sa screenshot:

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Pumunta tayo sa Visual Studio, na mag-uudyok sa atin na i-reload ang solusyon, dahil may naidagdag na bagong proyekto dito. Nire-reload namin ang solusyon at nakita namin na mayroon kaming proyekto magtayo kung saan kami ay interesado sa isang file lamang - Build.cs

Gumagawa kami ng isang proyekto ng plugin na may compilation para sa iba't ibang bersyon ng Revit/AutoCAD

Buksan ang file na ito at magsulat ng script para buuin ang proyekto para sa lahat ng configuration. Well, o gamitin ang aking script, na maaari mong i-edit upang umangkop sa iyong mga pangangailangan:

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

Bumalik kami sa PowerShell window at muling isulat ang command nuke (maaari mong isulat ang utos nuke na nagpapahiwatig ng kinakailangan Target. Ngunit mayroon kaming isa Target, na tumatakbo bilang default). Pagkatapos pindutin ang Enter key, mararamdaman namin na kami ay tunay na mga hacker, dahil, tulad ng sa isang pelikula, ang aming proyekto ay awtomatikong mabubuo para sa iba't ibang mga pagsasaayos.

Sa pamamagitan ng paraan, maaari mong gamitin ang PowerShell nang direkta mula sa Visual Studio (menu "TingnanΒ»->Β«Iba pang mga bintanaΒ»->Β«Package Manager Console"), ngunit ang lahat ay magiging itim at puti, na hindi masyadong maginhawa.

Ito ang nagtatapos sa aking artikulo. Sigurado ako na maaari mong malaman ang pagpipilian para sa AutoCAD sa iyong sarili. Umaasa ako na ang materyal na ipinakita dito ay makakahanap ng "mga kliyente" nito.

Salamat sa iyo!

Pinagmulan: www.habr.com

Magdagdag ng komento