We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Bij het ontwikkelen van plug-ins voor CAD-toepassingen (in mijn geval dit zijn AutoCAD, Revit en Renga) na verloop van tijd verschijnt er één probleem: er worden nieuwe versies van programma's uitgebracht, hun API-wijzigingen en er moeten nieuwe versies van plug-ins worden gemaakt.

Wanneer u slechts één plug-in heeft of u bent nog een autodidactische beginner op dit gebied, kunt u eenvoudig een kopie van het project maken, de benodigde plaatsen daarin wijzigen en een nieuwe versie van de plug-in samenstellen. Dienovereenkomstig zullen latere wijzigingen in de code een meervoudige stijging van de arbeidskosten met zich meebrengen.

Naarmate u ervaring en kennis opdoet, zult u verschillende manieren vinden om dit proces te automatiseren. Ik heb dit pad bewandeld en ik wil je vertellen waar ik op uitkwam en hoe handig het is.

Laten we eerst eens kijken naar een methode die voor de hand ligt en die ik al heel lang gebruik.

Links naar projectbestanden

En om alles eenvoudig, visueel en begrijpelijk te maken, zal ik alles beschrijven aan de hand van een abstract voorbeeld van plug-inontwikkeling.

Laten we Visual Studio openen (ik heb de Community 2019-versie. En ja - in het Russisch) en een nieuwe oplossing maken. Laten we hem bellen MijnSuperPluginForRevit

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Voor de versies 2015-2020 gaan we een plugin maken voor Revit. Laten we daarom een ​​nieuw project in de oplossing maken (Net Framework Class Library) en dit aanroepen MijnSuperPluginForRevit_2015

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

We moeten links naar de Revit API toevoegen. Natuurlijk kunnen we links naar lokale bestanden toevoegen (we moeten alle benodigde SDK's of alle versies van Revit installeren), maar we zullen onmiddellijk het goede pad volgen en het NuGet-pakket verbinden. Je kunt een flink aantal pakketten vinden, maar ik zal mijn eigen pakketten gebruiken.

Nadat u het pakket hebt aangesloten, klikt u met de rechtermuisknop op het item “referenties" en selecteer het item "Verplaats pakketten.config naar PackageReference...»

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Als u op dit punt plotseling in paniek raakt, omdat er in het venster met pakketeigenschappen geen belangrijk item zal zijn “Kopieer lokaal", die we zeker op de waarde moeten instellen vals, raak dan niet in paniek - ga naar de map met het project, open het bestand met de .csproj-extensie in een voor u geschikte editor (ik gebruik Notepad++) en zoek daar een vermelding over ons pakket. Ze ziet er nu zo uit:

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

Voeg er een eigenschap aan toe looptijd. Het zal zo blijken:

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

Wanneer u nu een project bouwt, worden bestanden uit het pakket niet naar de uitvoermap gekopieerd.
Laten we verder gaan: laten we ons meteen voorstellen dat onze plug-in iets uit de Revit API zal gebruiken, die in de loop van de tijd is veranderd wanneer er nieuwe versies zijn uitgebracht. Nou ja, of we moeten gewoon iets in de code veranderen, afhankelijk van de versie van Revit waarvoor we de plug-in maken. Om dergelijke verschillen in code op te lossen, zullen we voorwaardelijke compilatiesymbolen gebruiken. Open de projecteigenschappen, ga naar het tabblad “montage"en in het veld"Voorwaardelijke compilatienotatie"laten we schrijven R2015.

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Houd er rekening mee dat het symbool moet worden toegevoegd voor zowel de Debug- als de Release-configuratie.

Welnu, terwijl we ons in het eigenschappenvenster bevinden, gaan we onmiddellijk naar het tabblad 'toepassing"en in het veld"Standaard naamruimte» verwijder het achtervoegsel _2015zodat onze naamruimte universeel is en onafhankelijk van de assemblagenaam:

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

In mijn geval worden in het eindproduct plug-ins van alle versies in één map geplaatst, dus mijn assembly-namen blijven met het achtervoegsel van het formulier _20хх. Maar u kunt het achtervoegsel ook uit de assembly-naam verwijderen als de bestanden zich in verschillende mappen moeten bevinden.

Laten we naar de bestandscode gaan Klasse1.cs en simuleer daar wat code, rekening houdend met verschillende versies van 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;
        }
    }
}

Ik heb meteen rekening gehouden met alle versies van Revit boven versie 2015 (die beschikbaar waren op het moment van schrijven) en meteen rekening gehouden met de aanwezigheid van voorwaardelijke compilatiesymbolen, die met dezelfde sjabloon zijn gemaakt.

Laten we verder gaan met het belangrijkste hoogtepunt. We maken een nieuw project in onze oplossing, alleen voor de versie van de plug-in voor Revit 2016. We herhalen alle hierboven beschreven stappen, waarbij we het nummer 2015 vervangen door het nummer 2016. Maar het bestand Klasse1.cs verwijderen uit het nieuwe project.

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Bestand met de vereiste code - Klasse1.cs – we hebben het al en we hoeven er alleen maar een link naar in te voegen in een nieuw project. Er zijn twee manieren om links in te voegen:

  1. Lang – klik met de rechtermuisknop op het project en selecteer “toevoegen»->«Bestaand element"Zoek in het geopende venster het gewenste bestand en in plaats van de optie "toevoegen"selecteer de optie"Toevoegen als verbinding»

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

  1. Короткий – selecteer rechtstreeks in de oplossingsverkenner het gewenste bestand (of zelfs bestanden, of zelfs hele mappen) en sleep het naar een nieuw project terwijl u de Alt-toets ingedrukt houdt. Terwijl u sleept, zult u zien dat wanneer u op de Alt-toets drukt, de muiscursor verandert van een plusteken in een pijl.
    UPD: Ik heb in deze paragraaf voor enige verwarring gezorgd: om meerdere bestanden over te zetten, moet je ingedrukt houden Shift + Alt!

Na het uitvoeren van de procedure hebben we een bestand in het tweede project Klasse1.cs met het bijbehorende pictogram (blauwe pijl):

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Wanneer u code bewerkt in het editorvenster, kunt u ook kiezen in welke projectcontext u de code wilt weergeven, zodat u kunt zien hoe de code wordt bewerkt onder verschillende voorwaardelijke compilatiesymbolen:

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

We maken alle andere projecten (2017-2020) met dit schema. Lifehack - als u bestanden in de Solution Explorer niet vanuit het basisproject sleept, maar vanuit het project waar ze al als link zijn ingevoegd, dan hoeft u de Alt-toets niet ingedrukt te houden!

De beschreven optie is redelijk goed tot het moment waarop een nieuwe versie van de plug-in wordt toegevoegd of tot het moment waarop nieuwe bestanden aan het project worden toegevoegd - dit alles wordt erg vervelend. En onlangs besefte ik plotseling hoe ik het allemaal met één project kon regelen en we gaan over naar de tweede methode

De magie van configuraties

Als je hier klaar bent met lezen, kun je uitroepen: “Waarom heb je de eerste methode beschreven, als het artikel meteen over de tweede gaat?!” En ik heb alles beschreven om duidelijker te maken waarom we voorwaardelijke compilatiesymbolen nodig hebben en op welke punten onze projecten verschillen. En nu wordt het ons duidelijker welke verschillen in projecten we precies moeten implementeren, waardoor er nog maar één project overblijft.

En om alles duidelijker te maken, zullen we geen nieuw project maken, maar wijzigingen aanbrengen in ons huidige project dat op de eerste manier is gemaakt.

Dus allereerst verwijderen we alle projecten uit de oplossing behalve het hoofdproject (dat de bestanden rechtstreeks bevat). Die. projecten voor versies 2016-2020. Open de map met de oplossing en verwijder daar de mappen van deze projecten.

We hebben nog één project over in onze beslissing - MijnSuperPluginForRevit_2015. Open de eigenschappen ervan en:

  1. Op het tabblad “toepassing"Verwijder het achtervoegsel uit de assemblagenaam _2015 (Waarom wordt later duidelijk)
  2. Op het tabblad “montage» verwijder het voorwaardelijke compilatiesymbool R2015 uit het overeenkomstige veld

Opmerking: de nieuwste versie van Visual Studio heeft een bug: voorwaardelijke compilatiesymbolen worden niet weergegeven in het venster met projecteigenschappen, hoewel ze wel beschikbaar zijn. Als u deze storing ervaart, moet u deze handmatig uit het .csproj-bestand verwijderen. We moeten er echter nog aan werken, dus lees verder.

Hernoem het project in het Solution Explorer-venster door het achtervoegsel te verwijderen _2015 en verwijder vervolgens het project uit de oplossing. Dit is nodig om de orde en gevoelens van perfectionisten te behouden! We openen de map van onze oplossing, hernoemen de projectmap daar op dezelfde manier en laden het project terug in de oplossing.

Open de configuratiemanager. Amerikaanse configuratie Sinds in principe is het niet nodig, dus verwijderen we het. We creëren nieuwe configuraties met namen die ons al bekend zijn R2015, R2016, ... R2020. Houd er rekening mee dat u geen instellingen uit andere configuraties hoeft te kopiëren en dat u geen projectconfiguraties hoeft te maken:

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Ga naar de map met het project en open het bestand met de extensie .csproj in een voor u geschikte editor. Je kunt het trouwens ook in Visual Studio openen - je moet het project uitladen en dan staat het gewenste item in het contextmenu:

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Bewerken in Visual Studio verdient zelfs de voorkeur, omdat de editor zowel uitlijnt als prompts geeft.

In het bestand zullen we de elementen zien PropertyGroep – helemaal bovenaan staat de algemene, en dan komen de voorwaarden. Deze elementen bepalen de eigenschappen van het project wanneer het wordt gebouwd. Het eerste element, dat geen voorwaarden heeft, stelt algemene eigenschappen in, en elementen met voorwaarden veranderen dienovereenkomstig enkele eigenschappen, afhankelijk van de configuraties.

Ga naar het gemeenschappelijke (eerste) element PropertyGroep en bekijk het pand Montagenaam – dit is de naam van de vergadering en deze zou zonder achtervoegsel moeten zijn _2015. Als er een achtervoegsel is, verwijder dit dan.

Een element met een voorwaarde zoeken

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

We hebben het niet nodig - we verwijderen het.

Element met voorwaarde

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

zal nodig zijn om te werken in de fase van codeontwikkeling en foutopsporing. U kunt de eigenschappen ervan aanpassen aan uw behoeften - verschillende uitvoerpaden instellen, voorwaardelijke compilatiesymbolen wijzigen, enz.

Laten we nu nieuwe elementen maken PropertyGroep voor onze configuraties. In deze elementen hoeven we slechts vier eigenschappen in te stellen:

  • Uitvoerpad – uitvoermap. Ik heb de standaardwaarde ingesteld binR20xx
  • Definieer constanten – voorwaardelijke compilatiesymbolen. De waarde moet worden opgegeven TRACE;R20хх
  • DoelFrameworkVersie – platformversie. Verschillende versies van de Revit API vereisen dat verschillende platforms worden gespecificeerd.
  • Montagenaam – assembly-naam (d.w.z. bestandsnaam). U kunt de exacte naam van de assembly schrijven, maar voor veelzijdigheid raad ik aan de waarde te schrijven $(AssemblyName)_20хх. Om dit te doen, hebben we eerder het achtervoegsel uit de assembly-naam verwijderd

Het belangrijkste kenmerk van al deze elementen is dat ze eenvoudig naar andere projecten kunnen worden gekopieerd, zonder dat ze iets hoeven te veranderen. Verderop in het artikel zal ik de volledige inhoud van het .csproj-bestand bijvoegen.

Oké, we hebben de eigenschappen van het project ontdekt - het is niet moeilijk. Maar wat te doen met plug-inbibliotheken (NuGet-pakketten). Als we verder kijken, zullen we zien dat de opgenomen bibliotheken gespecificeerd zijn in de elementen Artikelgroep. Maar pech: dit element verwerkt de voorwaarden verkeerd als een element PropertyGroep. Misschien is dit zelfs een fout in Visual Studio, maar als u meerdere elementen opgeeft Artikelgroep met configuratievoorwaarden en voeg verschillende links naar NuGet-pakketten in, en wanneer u de configuratie wijzigt, zijn alle opgegeven pakketten verbonden met het project.

Het element komt ons te hulp Kies, die werkt volgens onze gebruikelijke logica als dan anders.

Element gebruiken Kies, hebben we verschillende NuGet-pakketten ingesteld voor verschillende configuraties:

Alle inhoud 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>

Houd er rekening mee dat ik in een van de voorwaarden twee configuraties heb opgegeven via OF. Op deze manier wordt het benodigde pakket tijdens de configuratie gekoppeld Debug.

En hier hebben we bijna alles perfect. We laden het project terug, schakelen de configuratie in die we nodig hebben, noemen het item “in het contextmenu van de oplossing (niet het project)Herstel alle NuGet-pakketten"en we zien hoe onze pakketten veranderen.

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

En in dit stadium liep ik dood - om alle configuraties in één keer te verzamelen, konden we batch-assemblage gebruiken (menu "montage»->«Batch-opbouw"), maar bij het wisselen van configuratie worden pakketten niet automatisch hersteld. En bij het samenstellen van het project gebeurt dit ook niet, hoewel dit in theorie wel zou moeten gebeuren. Ik heb geen oplossing voor dit probleem gevonden met behulp van standaardmiddelen. En hoogstwaarschijnlijk is dit ook een Visual Studio-bug.

Daarom werd er voor de batchassemblage gekozen voor een speciaal geautomatiseerd assemblagesysteem Atoombom. Ik wilde dit eigenlijk niet omdat ik het overdreven vind qua plugin-ontwikkeling, maar op dit moment zie ik geen andere oplossing. En op de vraag “Waarom kernwapens?” Het antwoord is simpel: we gebruiken het op het werk.

Ga dus naar de map van onze oplossing (niet het project), houd de toets ingedrukt Shift en klik met de rechtermuisknop op een lege ruimte in de map - selecteer in het contextmenu het item “Open hier het PowerShell-venster.

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Als je het niet hebt geïnstalleerd atoombomen schrijf vervolgens eerst de opdracht

dotnet tool install Nuke.GlobalTool –global

Schrijf nu het commando atoombom en u wordt gevraagd om te configureren atoombom voor het huidige project. Ik weet niet hoe ik dit correcter in het Russisch moet schrijven - in het Engels zal het worden geschreven. Kan het .nuke-bestand niet vinden. Wilt u een build opzetten? [j/n]

Druk op de Y-toets en er zijn directe instellingenitems. We hebben de eenvoudigste optie nodig om te gebruiken MSBuild, dus we antwoorden zoals in de schermafbeelding:

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Laten we naar Visual Studio gaan, die ons zal vragen de oplossing opnieuw te laden, omdat er een nieuw project aan is toegevoegd. We laden de oplossing opnieuw en zien dat we een project hebben bouw waarin we slechts in één bestand geïnteresseerd zijn - Bouw.cs

We maken één plugin-project met compilatie voor verschillende versies van Revit/AutoCAD

Open dit bestand en schrijf een script om het project voor alle configuraties te bouwen. Nou, of gebruik mijn script, dat je naar eigen wens kunt bewerken:

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

We keren terug naar het PowerShell-venster en schrijven de opdracht opnieuw atoombom (je kunt het commando schrijven atoombom het vereiste aangeven doelwit. Maar wij hebben er één doelwit, die standaard wordt uitgevoerd). Nadat we op de Enter-toets hebben gedrukt, voelen we ons echte hackers, omdat ons project, net als in een film, automatisch wordt samengesteld voor verschillende configuraties.

Je kunt PowerShell overigens rechtstreeks vanuit Visual Studio gebruiken (menu "Zien»->«Andere ramen»->«Pakketbeheerconsole"), maar alles zal in zwart-wit zijn, wat niet erg handig is.

Hiermee wordt mijn artikel afgesloten. Ik weet zeker dat je de optie voor AutoCAD zelf kunt uitzoeken. Ik hoop dat het hier gepresenteerde materiaal zijn “klanten” zal vinden.

Dank je wel!

Bron: www.habr.com

Voeg een reactie