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



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


Wenn Sie nur ein Plugin haben oder noch ein Autodidakt sind, können Sie einfach eine Kopie des Projekts erstellen, die erforderlichen Stellen darin ändern und eine neue Version des Plugins erstellen. Dementsprechend führen spätere Änderungen des Kodex zu einer mehrfachen Erhöhung der Arbeitskosten.


Wenn Sie Erfahrung und Wissen sammeln, finden Sie verschiedene Möglichkeiten, diesen Prozess zu automatisieren. Ich bin diesen Weg gegangen und möchte Ihnen sagen, wozu ich am Ende gekommen bin und wie praktisch es ist.


Betrachten Sie zunächst eine Methode, die offensichtlich ist und die ich seit langer Zeit verwende


Links zu Projektdateien


Und um alles einfach, klar und verständlich zu machen, beschreibe ich alles anhand eines abstrakten Beispiels für die Plug-In-Entwicklung.


Öffnen Sie Visual Studio (ich habe die Community 2019-Version. Und ja - auf Russisch) und erstellen Sie eine neue Lösung. Nennen wir es MySuperPluginForRevit


image1

Wir werden ein Plugin für Revit für die Versionen 2015-2020 erstellen. Daher erstellen wir ein neues Projekt in der Lösung (Net Framework Class Library) und nennen es MySuperPluginForRevit_2015


image2

Wir müssen Links zur Revit-API hinzufügen. Natürlich können wir Links zu lokalen Dateien hinzufügen (Sie müssen alle erforderlichen SDKs oder alle Versionen von Revit installieren), aber wir gehen den richtigen Weg und verbinden das NuGet-Paket. Sie können nicht eine kleine Anzahl von Paketen finden, aber ich werde meine eigenen verwenden.


Klicken Sie nach dem Verbinden des Pakets mit der rechten Maustaste auf den Eintrag " Links " und wählen Sie im Menü " Pakete.config nach PackageReference übertragen ... "


image3

Wenn Sie an dieser Stelle plötzlich in Panik geraten, weil das Eigenschaftenfenster des Pakets nicht den wichtigen Punkt " Lokal kopieren " enthält, den wir definitiv auf " Falsch" setzen müssen , sollten Sie nicht in Panik geraten. Gehen Sie zum Projektordner und öffnen Sie die Datei mit der Erweiterung. csproj in einem bequemen Editor (ich benutze Notepad ++) und wir finden dort eine Aufzeichnung über unser Paket. Es sieht jetzt so aus:


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

Fügen Sie die Eigenschaft <ExcludeAssets> Runtime </ ExcludeAssets> hinzu . Es stellt sich so heraus:


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

Wenn Sie jetzt ein Projekt erstellen, werden Dateien aus dem Paket nicht in den Ausgabeordner kopiert.
Wir gehen weiter - stellen Sie sich sofort vor, dass unser Plugin etwas von der Revit-API verwendet, die sich mit der Veröffentlichung neuer Versionen geändert hat. Nun, oder einfach, wir müssen etwas am Code ändern, abhängig von der Version von Revit, für die wir das Plugin erstellen. Um solche Unterschiede im Code zu beheben, werden bedingte Kompilierungssymbole verwendet. Öffnen Sie die Projekteigenschaften, wechseln Sie zur Registerkarte " Baugruppe " und schreiben Sie in das Feld " Bedingte Kompilierungssymbole " R2015 .


image4

Beachten Sie, dass das Symbol sowohl für die Debug-Konfiguration 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 löschen im Feld " Standard-Namespace " das Suffix _2015, so dass unser Namespace universell und unabhängig vom Assemblynamen ist:


image5

In meinem Fall werden im Endprodukt Plugins aller Versionen in einem Ordner abgelegt, sodass meine Assembly-Namen mit dem Suffix der Form _20xx verbleiben . Sie können das Suffix jedoch auch aus dem Assemblynamen entfernen, wenn der Speicherort der Dateien in verschiedenen Ordnern angenommen wird.


Wir übergeben den Code der Datei Class1.cs und simulieren dort einen 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 Revit-Versionen über der Version 2015 (die zum Zeitpunkt des Schreibens vorlagen) berücksichtigt und sofort das Vorhandensein bedingter Kompilierungssymbole berücksichtigt, die ich mit derselben Vorlage erstelle.


Wir kommen zum Haupthighlight. Wir erstellen ein neues Projekt in unserer Lösung, nur für die Plugin-Version für Revit 2016. Wir wiederholen alle oben beschriebenen Schritte bzw. ersetzen die Nummer 2015 durch die Nummer 2016. Wir löschen jedoch die Datei Class1.cs aus dem neuen Projekt.


image6

Die Datei mit dem gewünschten Code - Class1.cs - haben wir bereits und müssen nur noch einen Link in das neue Projekt einfügen. Es gibt zwei Möglichkeiten, Links einzufügen:


  1. Langes Anklicken des Projekts mit der rechten Maustaste, Auswahl des Punktes " Hinzufügen " -> " Vorhandenes Element ", im sich öffnenden Fenster die gewünschte Datei suchen und anstelle der Option " Hinzufügen " die Option " Als Link hinzufügen " auswählen

image7

  1. Kurz - Wählen Sie rechts im Projektmappen-Explorer die gewünschte Datei (oder sogar Dateien oder sogar ganze Ordner) aus und ziehen Sie sie mit gedrückter Alt-Taste in das neue Projekt. Beim Ziehen sehen Sie, dass sich der Mauszeiger beim Drücken der Alt-Taste von einem Pluszeichen in einen Pfeil ändert.
    UPD: Ich habe in diesem Abschnitt ein wenig Verwirrung gestiftet. Um mehrere Dateien zu übertragen, halten Sie die Tastenkombination Umschalt + Alt gedrückt.

Nach dem Vorgang sehen wir im zweiten Projekt die Datei Class1.cs mit dem entsprechenden Symbol (blauer Pfeil):


image8

Beim Bearbeiten des Codes im Editorfenster können Sie auch auswählen, in welchem ​​Projekt der Code angezeigt werden soll. Auf diese Weise können Sie sehen, wie der Code mit verschiedenen Symbolen für die bedingte Kompilierung bearbeitet wird:


image9

Nach diesem Schema erstellen wir alle anderen Projekte (2017-2020). Life Hack - Wenn Sie Dateien im Solution Explorer nicht aus dem Basisprojekt ziehen und ablegen, sondern aus dem Projekt, in dem sie bereits als Link eingefügt sind, können Sie die Alt-Taste nicht gedrückt halten!


Die beschriebene Option ist ziemlich gut, bis die neue Version des Plugins hinzugefügt wird oder bis die neuen Dateien zum Projekt hinzugefügt werden - all dies wird sehr trostlos. Und vor kurzem wurde mir plötzlich klar, wie das alles mit einem Projekt gelöst werden kann, und wir gehen zur zweiten Methode über


Konfigurationszauber


Nachdem Sie hier gelesen haben, können Sie ausrufen: "Was zum Teufel haben Sie die erste Methode beschrieben, wenn es in dem Artikel sofort um die zweite geht?!" Und ich habe alles beschrieben, um zu verdeutlichen, warum wir bedingte Kompilierungssymbole benötigen und an welchen Stellen sich unsere Projekte unterscheiden. Und jetzt wird uns klarer, welche spezifischen Projektunterschiede wir implementieren müssen, sodass nur noch ein Projekt übrig bleibt.


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


Zuallererst entfernen wir alle Projekte aus der Projektmappe, mit Ausnahme des Hauptprojekts (das die Dateien direkt enthält). Das heißt Projekte für die Versionen 2016-2020. Öffnen Sie den Lösungsordner und löschen Sie dort die Ordner dieser Projekte.


Wir haben noch eine Lösung in der Lösung - MySuperPluginForRevit_2015 . Wir öffnen seine Eigenschaften und:


  1. Entfernen Sie auf der Registerkarte Anwendung das Suffix _2015 aus dem Assemblynamen (es wird klar, warum).
  2. Löschen Sie auf der Registerkarte " Assembly " das Symbol für die bedingte R2015- Kompilierung aus dem entsprechenden Feld

Hinweis: In der neuesten Version von Visual Studio ist ein Fehler aufgetreten. Bedingte Kompilierungssymbole werden im Fenster mit den Projekteigenschaften nicht angezeigt, obwohl sie vorhanden sind. Wenn Sie diese Panne haben, müssen Sie sie manuell aus der .csproj-Datei entfernen. Wir arbeiten jedoch immer noch daran, also lesen Sie weiter.

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


Öffnen Sie den Konfigurationsmanager. Wir werden die Release- Konfiguration im Prinzip nicht benötigen, also löschen wir sie. Wir erstellen neue Konfigurationen mit den uns bereits bekannten Namen R2015 , R2016 , ..., R2020 . Bitte beachten Sie, dass Sie keine Parameter aus anderen Konfigurationen kopieren und keine Projektkonfigurationen erstellen müssen:


image10

Wir gehen in den Projektordner und öffnen die Datei mit der Endung .csproj in einem praktischen Editor. Übrigens kann es auch in Visual Studio geöffnet werden - Sie müssen das Projekt entladen und dann befindet sich das richtige Element im Kontextmenü:


image11

Das Bearbeiten in Visual Studio ist sogar vorzuziehen, da der Editor sowohl ausgerichtet als auch aufgefordert wird.


In der Datei sehen wir die PropertyGroup- Elemente - ganz oben das allgemeine und dann die Bedingungen. Diese Elemente legen die Eigenschaften des Projekts während seiner Montage fest. Das erste Element, das ohne Bedingungen allgemeine Eigenschaften festlegt, und Elemente mit Bedingungen ändern je nach Konfiguration einige Eigenschaften.


Wir gehen zum allgemeinen (ersten) Element der PropertyGroup und sehen uns die AssemblyName- Eigenschaft an - dies ist der Name der Assembly, und wir sollten sie ohne das Suffix _2015 haben . Wenn es ein Suffix gibt, löschen Sie es.


Wir finden ein Element mit der Bedingung


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

Wir brauchen es nicht - wir löschen es.


Bedingungsklausel


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

Es wird für die Arbeit in der Phase der Entwicklung und des Debuggens von Code erforderlich sein. Sie können die Eigenschaften an Ihre Anforderungen anpassen - verschiedene Ausgabepfade festlegen, bedingte Kompilierungssymbole ändern usw.


Erstellen Sie nun neue PropertyGroup- Elemente für unsere Konfigurationen. In diesen Elementen müssen nur vier Eigenschaften festgelegt werden:


  • OutputPath ist der Ausgabeordner. Ich habe den Standardwert bin \ R20xx eingestellt
  • DefineConstants - Bedingte Kompilierungssymbole. Stellen Sie TRACE; R20xx ein
  • TargetFrameworkVersion - Version der Plattform. Für verschiedene Versionen der Revit-API müssen verschiedene Plattformen definiert werden.
  • AssemblyName - Assemblyname (d. H. Dateiname). Sie können den gewünschten Assemblynamen direkt eingeben . Aus Gründen der Universalität empfehle ich jedoch, den Wert $ (AssemblyName) _20xx einzugeben . 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 zu ändern. Später im Artikel werde ich den gesamten Inhalt der .csproj-Datei anhängen.


Nun, wir haben die Projekteigenschaften herausgefunden - es ist nicht schwierig. Was aber mit Plug-In-Bibliotheken (NuGet-Paketen) zu tun ist. Wenn wir weiter schauen, werden wir sehen, dass die Plug-in-Bibliotheken durch ItemGroup- Elemente definiert sind. Aber hier ist das Pech - dieses Element verarbeitet Bedingungen falsch, wie ein PropertyGroup- Element. Möglicherweise ist dies sogar ein Fehler in Visual Studio. Wenn Sie jedoch mehrere ItemGroup- Elemente mit Konfigurationsbedingungen festlegen und verschiedene Links zu NuGet-Paketen einfügen, werden beim Ändern der Konfiguration alle angegebenen Pakete mit dem Projekt verbunden.


Das Choose- Element hilft uns dabei, das nach der üblichen Wenn-Dann-Sonst- Logik funktioniert.


Mit dem Choose- Element definieren wir verschiedene NuGet-Pakete für verschiedene Konfigurationen:


Alle Inhalte von csproj
 <?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">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>bin\Debug\</OutputPath> <DefineConstants>DEBUG;R2015</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2015|AnyCPU' "> <OutputPath>bin\R2015\</OutputPath> <DefineConstants>TRACE;R2015</DefineConstants> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <AssemblyName>$(AssemblyName)_2015</AssemblyName> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2016|AnyCPU' "> <OutputPath>bin\R2016\</OutputPath> <DefineConstants>TRACE;R2016</DefineConstants> <TargetFrameworkVersion>v4.5</TargetFrameworkVersion> <AssemblyName>$(AssemblyName)_2016</AssemblyName> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2017|AnyCPU' "> <OutputPath>bin\R2017\</OutputPath> <DefineConstants>TRACE;R2017</DefineConstants> <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> <AssemblyName>$(AssemblyName)_2017</AssemblyName> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2018|AnyCPU' "> <OutputPath>bin\R2018\</OutputPath> <DefineConstants>TRACE;R2018</DefineConstants> <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> <AssemblyName>$(AssemblyName)_2018</AssemblyName> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2019|AnyCPU' "> <OutputPath>bin\R2019\</OutputPath> <DefineConstants>TRACE;R2019</DefineConstants> <TargetFrameworkVersion>v4.7</TargetFrameworkVersion> <AssemblyName>$(AssemblyName)_2019</AssemblyName> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'R2020|AnyCPU' "> <OutputPath>bin\R2020\</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="Properties\AssemblyInfo.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 OR (Or) angegeben habe . Somit wird das erforderliche Paket während der Debug- Konfiguration verbunden.


Und hier haben wir fast alles perfekt. Wir laden das Projekt zurück, aktivieren die erforderliche Konfiguration, rufen den Punkt " Alle NuGet-Pakete wiederherstellen " im Kontextmenü der Lösung auf (nicht das Projekt) und sehen, wie sich die Pakete ändern.


image12

Und zu diesem Zeitpunkt kam ich zum Stillstand - um alle Konfigurationen auf einmal zu erfassen, konnten wir die Batch-Assembly (Menü " Assembly " -> " Batch-Assembly ") verwenden, aber beim Wechseln der Konfigurationen werden die Pakete nicht automatisch wiederhergestellt. Und wenn das Projekt zusammengestellt wird, passiert es auch nicht, obwohl es theoretisch so sein sollte. Ich habe keine Lösung für dieses Problem mit Standardmitteln gefunden. Und höchstwahrscheinlich ist dies auch ein Fehler von Visual Studio.


Aus diesem Grund wurde beschlossen, für die Serienmontage ein spezielles automatisiertes Nuke- Montagesystem zu verwenden. Eigentlich wollte ich das nicht, da ich es im Rahmen der Plug-In-Entwicklung für unnötig halte, aber im Moment sehe ich keine andere Lösung. Und die Frage „Warum genau Nuke?“ Die Antwort ist einfach - wir verwenden sie bei der Arbeit.


Wechseln Sie in den Ordner unserer Lösung (nicht in das Projekt), halten Sie die Umschalttaste gedrückt und klicken Sie mit der rechten Maustaste auf eine leere Stelle im Ordner. Wählen Sie im Kontextmenü den Eintrag „ PowerShell-Fenster hier öffnen “.


image13

Wenn Sie Nuke nicht installiert haben, schreiben Sie zuerst den Befehl


 dotnet tool install Nuke.GlobalTool –global 

Schreiben Sie nun den Befehl nuke und Sie werden aufgefordert, nuke für das aktuelle Projekt zu konfigurieren. Ich weiß nicht, wie ich es auf Russisch korrekter schreiben soll. Die .nuke-Datei wurde nicht auf Englisch geschrieben. Möchten Sie einen Build einrichten? [j / n]


Drücken Sie die Y-Taste, um die sofortigen Einstellungen vorzunehmen. Wir brauchen die einfachste Option mit MSBuild , also antworten wir wie im Screenshot:


image14

Fahren wir mit Visual Studio fort, in dem wir die Lösung neu laden können, da ein neues Projekt hinzugefügt wurde. Wir starten die Lösung neu und stellen fest, dass wir ein Build- Projekt haben , an dem wir nur an einer Datei interessiert sind - Build.cs


image15

Öffnen Sie diese Datei und schreiben Sie ein Skript, um das Projekt für alle Konfigurationen zu erstellen. Na ja, oder benutze mein Skript, das du selbst bearbeiten kannst:


 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 Nuke- Befehl erneut (Sie können den Nuke- Befehl mit dem gewünschten Ziel schreiben. Wir haben jedoch ein Ziel , das standardmäßig startet). Nach dem Drücken der Eingabetaste fühlen wir uns wie echte Hacker, da unser Projekt wie in einem Film automatisch für verschiedene Konfigurationen zusammengestellt wird.


Sie können PowerShell übrigens direkt in Visual Studio verwenden (Menü " Ansicht " -> " Andere Fenster " -> " Package Manager-Konsole "), aber alles wird in Schwarzweiß angezeigt, was nicht sehr praktisch ist.


Damit ist mein Artikel beendet. Ich bin sicher, dass Sie die Option für AutoCAD selbst herausfinden können. Ich hoffe, dass das hier vorgestellte Material seine "Kunden" finden wird.


Vielen Dank für Ihre Aufmerksamkeit!

Source: https://habr.com/ru/post/de482308/


All Articles