Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Bei der Entwicklung von Plugins für CAD-Anwendungen (in meinem Fall Dies sind AutoCAD, Revit und Renga. Im Laufe der Zeit tritt ein Problem auf: Es werden neue Versionen von Programmen veröffentlicht, deren API-Änderungen und neue Versionen von Plugins müssen erstellt werden.

Wenn Sie nur ein Plugin haben oder in dieser Angelegenheit noch ein autodidaktischer Anfänger sind, können Sie einfach eine Kopie des Projekts erstellen, die erforderlichen Stellen darin ändern und eine neue Version des Plugins zusammenstellen. Dementsprechend führen nachträgliche Änderungen des Kodex zu einer mehrfachen Erhöhung der Arbeitskosten.

Je mehr Erfahrung und Wissen Sie sammeln, desto mehr Möglichkeiten finden Sie, diesen Prozess zu automatisieren. Ich bin diesen Weg gegangen und möchte Ihnen erzählen, was dabei herausgekommen ist und wie praktisch er ist.

Schauen wir uns zunächst eine Methode an, die offensichtlich ist und die ich schon lange verwende.

Links zu Projektdateien

Und um alles einfach, anschaulich und verständlich zu machen, beschreibe ich alles anhand eines abstrakten Beispiels der Plugin-Entwicklung.

Öffnen wir Visual Studio (ich habe die Community 2019-Version. Und ja – auf Russisch) und erstellen wir eine neue Lösung. Rufen wir ihn an MySuperPluginForRevit

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Wir werden ein Plugin für Revit für die Versionen 2015–2020 erstellen. Erstellen wir daher ein neues Projekt in der Lösung (Net Framework Class Library) und rufen Sie es auf MySuperPluginForRevit_2015

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Wir müssen Links zur Revit-API hinzufügen. Natürlich können wir Links zu lokalen Dateien hinzufügen (wir müssen alle erforderlichen SDKs oder alle Versionen von Revit installieren), aber wir werden sofort dem richtigen Weg folgen und das NuGet-Paket verbinden. Es gibt einige Pakete, aber ich werde mein eigenes verwenden.

Nachdem Sie das Paket verbunden haben, klicken Sie mit der rechten Maustaste auf den Punkt „Referenzen" und wählen Sie den Artikel aus "Verschieben Sie packets.config nach PackageReference...»

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Wenn Sie an diesem Punkt plötzlich in Panik geraten, weil im Fenster mit den Paketeigenschaften kein wichtiger Eintrag vorhanden ist.Lokal kopieren", den wir unbedingt auf den Wert setzen müssen falsch, dann geraten Sie nicht in Panik – gehen Sie in den Ordner mit dem Projekt, öffnen Sie die Datei mit der Erweiterung .csproj in einem für Sie geeigneten Editor (ich verwende Notepad++) und finden Sie dort einen Eintrag zu unserem Paket. Sie sieht jetzt so aus:

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

Fügen Sie eine Eigenschaft hinzu Laufzeit. Es wird so ausgehen:

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

Beim Erstellen eines Projekts werden nun Dateien aus dem Paket nicht in den Ausgabeordner kopiert.
Gehen wir noch einen Schritt weiter – stellen wir uns sofort vor, dass unser Plugin etwas aus der Revit-API verwenden wird, die sich im Laufe der Zeit geändert hat, als neue Versionen veröffentlicht wurden. Nun, oder wir müssen einfach etwas im Code ändern, abhängig von der Revit-Version, für die wir das Plugin erstellen. Um solche Unterschiede im Code aufzulösen, verwenden wir Symbole für die bedingte Kompilierung. Öffnen Sie die Projekteigenschaften und gehen Sie zur Registerkarte „Montage" und im Feld "Bedingte Kompilierungsnotation"Lass uns schreiben R2015.

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Beachten Sie, dass das Symbol sowohl für die Debug- als auch für die Release-Konfiguration hinzugefügt werden muss.

Nun, während wir uns im Eigenschaftenfenster befinden, gehen wir sofort zur Registerkarte „Anwendung" und im Feld "Standard-Namespace» Entfernen Sie das Suffix _2015damit unser Namespace universell und unabhängig vom Assemblynamen ist:

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

In meinem Fall werden im Endprodukt Plugins aller Versionen in einem Ordner abgelegt, sodass meine Assemblynamen beim Suffix des Formulars bleiben _20хх. Sie können das Suffix aber auch aus dem Assemblynamen entfernen, wenn die Dateien in verschiedenen Ordnern liegen sollen.

Gehen wir zum Dateicode Class1.cs und simulieren Sie dort Code unter Berücksichtigung verschiedener Revit-Versionen:

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

Ich habe sofort alle Versionen von Revit über Version 2015 (die zum Zeitpunkt des Schreibens verfügbar waren) berücksichtigt und sofort das Vorhandensein von Symbolen für die bedingte Kompilierung berücksichtigt, die mit derselben Vorlage erstellt werden.

Kommen wir zum Haupthighlight. Wir erstellen in unserer Lösung ein neues Projekt, nur für die Version des Plugins für Revit 2016. Wir wiederholen alle oben beschriebenen Schritte bzw. ersetzen die Zahl 2015 durch die Zahl 2016. Aber die Datei Class1.cs aus dem neuen Projekt löschen.

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Datei mit dem erforderlichen Code - Class1.cs – Wir haben es bereits und müssen nur noch einen Link dazu in ein neues Projekt einfügen. Es gibt zwei Möglichkeiten, Links einzufügen:

  1. Lang – Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie „hinzufügen"->"Vorhandenes Element", suchen Sie im sich öffnenden Fenster die gewünschte Datei und statt der Option "hinzufügen„Wählen Sie die Option“Als Verbindung hinzufügen»

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

  1. kurz – Wählen Sie direkt im Projektmappen-Explorer die gewünschte Datei (oder sogar Dateien, oder sogar ganze Ordner) aus und ziehen Sie sie bei gedrückter Alt-Taste in ein neues Projekt. Während Sie ziehen, werden Sie feststellen, dass sich der Mauszeiger durch Drücken der Alt-Taste von einem Pluszeichen in einen Pfeil ändert.
    UPD: Ich habe in diesem Absatz ein wenig Verwirrung gestiftet – um mehrere Dateien zu übertragen, sollte man gedrückt halten Umschalt + Alt!

Nach Durchführung des Vorgangs verfügen wir über eine Datei im zweiten Projekt Class1.cs mit dem entsprechenden Symbol (blauer Pfeil):

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Wenn Sie Code im Editorfenster bearbeiten, können Sie auch auswählen, in welchem ​​Projektkontext der Code angezeigt werden soll, sodass Sie sehen können, wie der Code unter verschiedenen Symbolen für die bedingte Kompilierung bearbeitet wird:

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Alle weiteren Projekte (2017-2020) erstellen wir nach diesem Schema. Life-Hack: Wenn Sie Dateien im Projektmappen-Explorer nicht aus dem Basisprojekt ziehen, sondern aus dem Projekt, in dem sie bereits als Link eingefügt sind, müssen Sie die Alt-Taste nicht gedrückt halten!

Die beschriebene Option ist bis zum Hinzufügen einer neuen Version des Plugins oder bis zum Hinzufügen neuer Dateien zum Projekt recht gut – das alles wird sehr mühsam. Und vor kurzem wurde mir plötzlich klar, wie ich alles mit einem Projekt regeln kann, und wir gehen zur zweiten Methode über

Die Magie der Konfigurationen

Nachdem Sie hier mit dem Lesen fertig sind, fragen Sie sich vielleicht: „Warum haben Sie die erste Methode beschrieben, wenn es in dem Artikel doch gleich um die zweite geht?!“ Und ich habe alles beschrieben, um klarer zu machen, warum wir Symbole für die bedingte Kompilierung benötigen und an welchen Stellen sich unsere Projekte unterscheiden. Und jetzt wird uns klarer, welche Unterschiede in den Projekten wir genau umsetzen müssen, sodass nur noch ein Projekt übrig bleibt.

Und um alles klarer zu machen, werden wir kein neues Projekt erstellen, sondern Änderungen an unserem aktuellen Projekt vornehmen, das auf die erste Weise erstellt wurde.

Daher entfernen wir zunächst alle Projekte aus der Projektmappe mit Ausnahme des Hauptprojekts (das die Dateien direkt enthält). Diese. Projekte für die Versionen 2016-2020. Öffnen Sie den Ordner mit der Lösung und löschen Sie dort die Ordner dieser Projekte.

Wir haben noch ein Projekt in unserer Entscheidung – MySuperPluginForRevit_2015. Öffnen Sie seine Eigenschaften und:

  1. Auf der Registerkarte „Anwendung„Entfernen Sie das Suffix aus dem Assemblynamen _2015 (Warum wird später klar werden)
  2. Auf der Registerkarte „Montage» Entfernen Sie das Symbol für die bedingte Kompilierung R2015 aus dem entsprechenden Feld

Hinweis: Die neueste Version von Visual Studio weist einen Fehler auf – Symbole für die bedingte Kompilierung werden im Projekteigenschaftenfenster nicht angezeigt, obwohl sie verfügbar sind. Wenn dieser Fehler auftritt, müssen Sie ihn manuell aus der .csproj-Datei entfernen. Allerdings müssen wir noch daran arbeiten, also lesen Sie weiter.

Benennen Sie das Projekt im Projektmappen-Explorer-Fenster um, indem Sie das Suffix entfernen _2015 und entfernen Sie dann das Projekt aus der Projektmappe. Dies ist notwendig, um die Ordnung und die Gefühle von Perfektionisten aufrechtzuerhalten! Wir öffnen den Ordner unserer Lösung, benennen dort den Projektordner auf die gleiche Weise um und laden das Projekt wieder in die Lösung.

Öffnen Sie den Konfigurationsmanager. US-Konfiguration Loslassen Im Prinzip wird es nicht benötigt, daher löschen wir es. Wir erstellen neue Konfigurationen mit Namen, die uns bereits bekannt sind R2015, R2016, ..., R2020. Beachten Sie, dass Sie keine Einstellungen aus anderen Konfigurationen kopieren und keine Projektkonfigurationen erstellen müssen:

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Gehen Sie in den Ordner mit dem Projekt und öffnen Sie die Datei mit der Erweiterung .csproj in einem für Sie geeigneten Editor. Sie können es übrigens auch in Visual Studio öffnen – Sie müssen das Projekt entladen und dann befindet sich der gewünschte Eintrag im Kontextmenü:

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Die Bearbeitung in Visual Studio ist sogar vorzuziehen, da der Editor sowohl ausrichtet als auch auffordert.

In der Datei sehen wir die Elemente PropertyGroup – ganz oben steht das Allgemeine, und dann kommen die Bedingungen. Diese Elemente legen die Eigenschaften des Projekts fest, wenn es erstellt wird. Das erste Element, das ohne Bedingungen ist, legt allgemeine Eigenschaften fest, und Elemente mit Bedingungen ändern dementsprechend einige Eigenschaften je nach Konfiguration.

Gehen Sie zum gemeinsamen (ersten) Element PropertyGroup und schauen Sie sich die Immobilie an Baugruppenname – Dies ist der Name der Assembly und wir sollten ihn ohne Suffix haben _2015. Wenn ein Suffix vorhanden ist, entfernen Sie es.

Ein Element mit einer Bedingung finden

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

Wir brauchen es nicht – wir löschen es.

Element mit Bedingung

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

wird benötigt, um in der Phase der Codeentwicklung und des Debuggens zu arbeiten. Sie können die Eigenschaften entsprechend Ihren Anforderungen ändern – unterschiedliche Ausgabepfade festlegen, Symbole für die bedingte Kompilierung ändern usw.

Jetzt erstellen wir neue Elemente PropertyGroup für unsere Konfigurationen. In diesen Elementen müssen wir lediglich vier Eigenschaften festlegen:

  • Ausgabepfad - Ausgabeordner. Ich habe den Standardwert festgelegt binR20xx
  • Konstanten definieren – Symbole für bedingte Kompilierung. Der Wert sollte angegeben werden TRACE;R20хх
  • TargetFrameworkVersion – Plattformversion. Für verschiedene Versionen der Revit-API müssen unterschiedliche Plattformen angegeben werden.
  • Baugruppenname – Assemblyname (d. h. Dateiname). Sie können den genauen Namen der Baugruppe eingeben, aus Gründen der Vielseitigkeit empfehle ich jedoch, den Wert anzugeben $(AssemblyName)_20хх. Zu diesem Zweck haben wir zuvor das Suffix aus dem Assemblynamen entfernt

Das wichtigste Merkmal all dieser Elemente ist, dass sie einfach in andere Projekte kopiert werden können, ohne sie überhaupt zu verändern. Später in diesem Artikel werde ich den gesamten Inhalt der .csproj-Datei anhängen.

Okay, wir haben die Eigenschaften des Projekts herausgefunden – es ist nicht schwierig. Aber was tun mit Plug-In-Bibliotheken (NuGet-Paketen)? Wenn wir weiter schauen, werden wir sehen, dass die enthaltenen Bibliotheken in den Elementen angegeben sind Artikelgruppe. Aber Pech gehabt – dieses Element verarbeitet die Bedingungen als Element falsch PropertyGroup. Möglicherweise ist dies sogar ein Visual Studio-Fehler, aber wenn Sie mehrere Elemente angeben Artikelgruppe mit Konfigurationsbedingungen und fügen Sie darin verschiedene Links zu NuGet-Paketen ein. Wenn Sie dann die Konfiguration ändern, werden alle angegebenen Pakete mit dem Projekt verbunden.

Das Element kommt uns zu Hilfe Auswählen , was nach unserer üblichen Logik funktioniert wenn-dann-sonst.

Element verwenden Auswählen , legen wir unterschiedliche NuGet-Pakete für unterschiedliche Konfigurationen fest:

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

Bitte beachten Sie, dass ich in einer der Bedingungen zwei Konfigurationen über angegeben habe ODER. Auf diese Weise wird das erforderliche Paket während der Konfiguration verbunden Debuggen.

Und hier haben wir fast alles perfekt. Wir laden das Projekt zurück, aktivieren die benötigte Konfiguration, rufen den Punkt „ im Kontextmenü der Lösung (nicht des Projekts) auf.Stellen Sie alle NuGet-Pakete wieder her„Und wir sehen, wie sich unsere Pakete verändern.

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Und zu diesem Zeitpunkt befand ich mich in einer Sackgasse – um alle Konfigurationen auf einmal zu sammeln, konnten wir die Stapelmontage verwenden (Menü „Montage"->"Batch-Build"), aber beim Wechseln der Konfigurationen werden Pakete nicht automatisch wiederhergestellt. Und beim Zusammenstellen des Projekts passiert dies auch nicht, obwohl es theoretisch so sein sollte. Ich habe mit Standardmitteln keine Lösung für dieses Problem gefunden. Und höchstwahrscheinlich ist dies auch ein Visual Studio-Fehler.

Daher entschied man sich für die Serienmontage für den Einsatz eines speziellen automatisierten Montagesystems Atombombe. Eigentlich wollte ich das nicht, weil ich es im Hinblick auf die Plugin-Entwicklung für übertrieben halte, aber im Moment sehe ich keine andere Lösung. Und auf die Frage „Warum Nuke?“ Die Antwort ist einfach: Wir nutzen es bei der Arbeit.

Gehen Sie also zum Ordner unserer Lösung (nicht zum Projekt) und halten Sie die Taste gedrückt Shift und klicken Sie mit der rechten Maustaste auf eine leere Stelle im Ordner – wählen Sie im Kontextmenü den Eintrag „Öffnen Sie hier das PowerShell-Fenster".

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Wenn Sie es nicht installiert haben Atombombe, dann schreiben Sie zuerst den Befehl

dotnet tool install Nuke.GlobalTool –global

Schreiben Sie nun den Befehl Atombombe und Sie werden zur Konfiguration aufgefordert Atombombe für das aktuelle Projekt. Ich weiß nicht, wie ich das richtiger auf Russisch schreiben soll – auf Englisch wird es geschrieben. Die .nuke-Datei konnte nicht gefunden werden. Möchten Sie einen Build einrichten? [j/n]

Drücken Sie die Y-Taste und es werden direkte Einstellungselemente angezeigt. Wir brauchen die einfachste Option mit MSBuild, also antworten wir wie im Screenshot:

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Gehen wir zu Visual Studio, das uns auffordert, die Lösung neu zu laden, da ihr ein neues Projekt hinzugefügt wurde. Wir laden die Lösung neu und sehen, dass wir ein Projekt haben bauen in dem wir nur an einer Datei interessiert sind - Build.cs

Wir erstellen ein Plugin-Projekt mit Kompilierung für verschiedene Versionen von Revit/AutoCAD

Öffnen Sie diese Datei und schreiben Sie ein Skript, um das Projekt für alle Konfigurationen zu erstellen. Oder nutzen Sie mein Skript, das Sie nach Ihren Wünschen bearbeiten können:

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

Wir kehren zum PowerShell-Fenster zurück und schreiben den Befehl erneut Atombombe (Sie können den Befehl schreiben Atombombe Angabe der erforderlichen Target. Aber wir haben eins Target, das standardmäßig ausgeführt wird). Nach dem Drücken der Eingabetaste werden wir uns wie echte Hacker fühlen, denn wie in einem Film wird unser Projekt automatisch für verschiedene Konfigurationen zusammengestellt.

Übrigens können Sie PowerShell direkt aus Visual Studio verwenden (Menü „Sehen"->"Andere Fenster"->"Paket-Manager-Konsole"), aber alles wird in Schwarzweiß sein, was nicht sehr praktisch ist.

Damit ist mein Artikel abgeschlossen. Ich bin sicher, dass Sie die Option für AutoCAD selbst herausfinden können. Ich hoffe, dass das hier präsentierte Material seine „Kunden“ findet.

Danke!

Source: habr.com

Kommentar hinzufügen