Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Cum plugins developing applications CAD (in causa mea hae sunt AutoCAD, Revit et Renga) per tempus, unum problema apparet - novae programmatum versiones emittuntur, eorum API mutationes et novae versiones plugins faciendae sunt.

Cum unum tantum plugin habes vel in hac re initium sui edoctus es, simpliciter exemplar propositi facere potes, loca necessaria in eo muta et novam versionem plugin congrega. Ideoque sequentes mutationes in codice multiplicem impensarum laboris incrementum sequent.

Cum experientiam et scientiam nancisceris, multipliciter invenies hunc processum automate. Hanc viam ambulavi et volo tibi dicere quid finivi et quam commodum sit.

Prius inspiciamus rationem manifestam et qua diu usus sum.

Links ut proiciamus files

Et ut omnia simplicia, visiva et intelligibilia faciamus, omnia utentes exemplo plugin evolutionis abstracto describam.

Aperiamus Studio Visual (Communitatem MMXIX versionem habeo. Et sic - in Russian) et novam solutionem crea. Vocemus eum MySuperPluginForRevit

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Plugin Faciemus pro Revit pro versions 2015-2020. Ergo novum propositum in solutione (Net Framework Class Library) faciamus et appellant MySuperPluginForRevit_2015

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Nexus ad Revit API addere opus est. Certe nexus localium imaginum addere possumus (necesse erit nos omnes SDKs vel omnes Revit versiones necessarias instituere), sed recta semita statim sequemur et sarcina NuGet coniungemus. Paucis fasciculis potes invenire, sed meo utar.

Post connectens in sarcina, item in dextra click "References"Et eligere item"Movere packages.config ad PackageReference ...»

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Si subito in hoc loco expavescere incipis, quia in fenestra proprietatum sarcinarum nullae magni momenti erunt "Effingo localiter", quam certum est ad valorem proficisci falsum,, noli expavescere - vade ad folder cum incepto, aperi tabella cum .csproj extensione in editore convenienti tibi (uti Nota +) et ingressum in sarcina nostra ibi invenies. Spectat hoc modo:

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

Addere proprietatem runtime. Eveniet sic:

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

Nunc, cum struis consilium, fasciculi e sarcina non transcribendum ad output folder.
Amplius eamus - statim cogitemus nostrum plugin ex Revit API aliquo usu fore, quod tempore mutatum est cum novae versiones dimissae sunt. Bene, vel solum necesse est aliquid mutare in codice secundum versionem Revit pro qua plugin facimus. Ad huiusmodi differentias in codice componendas, symbolis compilationalibus condicionalibus utemur. Aperi proprietates project, vade ad "tabconventus" et in agro "Conditionalis compilatio notatio"Scribe" R2015.

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Nota symbolum addendum esse tam debug quam de configurationibus dimittendis.

Bene, dum in fenestra proprietatum sumus, statim ad tabapplication" et in agro "Default spatio nominali»Quin removere _2015ita ut nomen nostrum universale et extra conventum nominis sit;

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

In casu finali, pluginae omnium versionum in unum folder ponuntur, ideo nomina conventus mei manent cum suffixo formae. _20хх. Sed suffixum e nomine conventus removere potes, si tabellae in diversis folder ponendae existimantur.

Eamus in tabella codice Class1.cs et simulant ibi aliquem codicem, inspecta uaria 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;
        }
    }
}

Statim in omnibus versionibus Revit supra versionis 2015 (quae tempore scriptionis praesto erant) consideravi et statim inspexi coram symbolis conditionalibus compilation, quae creantur utendo eodem exemplo.

Let's move on to the main highlight. Novum propositum in solutione nostra creamus, solum ad versionem plugin pro Revit 2016. Repeamus omnes gradus supra descriptos, respective, numerum MMXV numero 2015. Sed tabella reponens. Class1.cs delere de novo project.

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

File cum codice requiritur - Class1.cs - iam eam habemus et mox opus est ut vinculum cum illo in novo incepto inseramus. Dupliciter inserendi nexus:

  1. Long - right-click in project et eligere "addere» ->«Existens elementum", in fenestra aperiens, tabellam quaesitam inveniat et pro optione"addere" eligere optionem "Addere ut nexum»

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

  1. brevis - directe in solutione exploratoris, tabellam desideratam (vel etiam fasciculos, vel etiam folders integras) elige et in novum project trahe dum Altam clavem tenens. Ut trahis, videbis quod cum Alt key premes, murem cursorem a plus signo ad sagittam mutabit.
    UPD: Parum posui confusionem in hac paragrapho - varias transferre fasciculos, quos tenere debes Alt Amoveo +!

Post modum procedendi, tabellam habebimus in secundo proposito Class1.cs cum icone correspondente (sagitta caerulea);

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Cum codicem in fenestra editoris emendo, etiam eligere potes utra contextus contextus ad codicem exhibendum in quo codicem editum videre sinet sub diversis symbolis sub compilatione condicionis;

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Omnia alia incepta (2017-2020) hac ratione utentes creamus. Vita hack - si limas in Solutio Explorer trahis non ex basi incepti, sed ex incepto ubi iam inserta sunt ut nexum, tunc non tenes Alt key tenere!

Optio descripta satis bona est donec momentum novam versionem plugin addit vel usque ad momentum novos tabulas ad iniciendum addit - haec omnia nimis taedium evadunt. Et nuper subito subito intellexi omnia uno incepto exsistere et ad secundum modum moveri

Magica figurarum

Finita lectione hic dicas, "Quare primum modum describit, si articulus est statim de secundo?" Atque omnia descripsi ut clarius patefaceremus cur symbolorum conditionalium compilatione indigeamus et quibus in locis consilia nostra differant. Et nunc plane nobis clarius fit quantas differentias in inceptis ad efficiendum opus sit, uno tantum consilio relicto.

Et ut omnia manifestiora faciamus, novum consilium non creabimus, sed mutationes ad propositum nostrum primo modo creatum reddemus.

Primum igitur omnia incepta a solutione removemus praeter unum principale (linea directe continens). Illae. incepta pro versionibus 2016-2020. Aperi folder cum solutione et folders harum inceptorum ibi dele.

Unum consilium habemus in consilio nostro relicto - MySuperPluginForRevit_2015. Aperi proprietates ejus &;

  1. In tab "application"Quis removere ab ecclesia nomen _2015 (Quare postea patebit)
  2. In tab "conventus»Conscriptionis symbolum removere R2015 ex correspondentes agri

Nota: postrema versio Visual Studiorum cimex - conditionalis symbola compilation in fenestra proprietatum delineatarum non ostentantur, tametsi in promptu sunt. Si hoc glitch experiris, necesse est ut manually e fasciculo .csproj removeres. Sed adhuc habemus elaboraret ea, tantas legimus in per.

Rename Solutio in Solutio in fenestra Explorer subtrahendo suffixo _2015 et tunc ex solutione removere project. Hoc opus est ordinem et affectus perfectionistarum servare! Folder solutionis nostrae aperimus, renominant consilium folder eodem modo et projectum in solutionem oneramus.

Aperi configurationem procurator. US configuratione Release in principio, non erit opus, sic delemus. Novas figurationes cum nominibus creamus quae iam nobis nota sunt R2015, R2016, ... , R2020. Nota te non opus esse uncinis ex aliis conformationibus imitari et non opus esse ad figurationes projectas creandas;

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Vade ad folder cum incepto et aperi tabella cum .csproj extensione in editore convenienti tibi. Obiter eam in Studio Visuali aperire potes - opus exonerare inceptum ac deinde desideratum item in contextu menu erit:

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Recensere in Visual Studio etiam potior est, cum editor adsimilat et suggerat.

In tabella elementa videbimus PropertyGroup — In ipso summo est generalis, et deinde conditiones. Haec elementa constituunt proprietates rei cum conditur. Primum elementum, quod caret conditionibus, generales proprietates ponit, et elementa cum conditionibus, ideoque aliquas proprietates secundum figuras mutant.

Vade ad elementum commune PropertyGroup et videte rem ConventusName - hoc nomen conventus et illud sine suffixo habere debet _2015. Si suffixum est, removendum est.

Inveniens elementum cum conditione

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

Non opus est - delemus.

Element cum conditione

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

opus erit ad operandum in scaena codicis evolutionis et debugging. Mutare potes proprietates suas ad aptas necessitates tuas - pone vias varias output, symbola muta scribendarum conditionalium, etc.

Nunc faciamus nova elementa PropertyGroup pro nostris conformationibus. In his elementis tantum opus est quattuor proprietates ponere;

  • OutputPath - output folder. Et posuit default valorem binR20xx
  • DefineConstants — symbola conditionalis compilatio. De valore debet esse certa VESTIGIUM: R20хх
  • TargetFrameworkVersion — versio suggestus. Variae Revit API versiones diversae tabulae ut specificatae requirunt.
  • ConventusName - nomen conventus (i.e. lima nomen). Scribere potes nomen synthesis, sed pro mobilitate suadeo scribendo valorem $(AsseblyName)_20хх. Ad hoc faciendum, nos antea suffixos e nomine conventus removimus

Potissimum omnium horum elementorum notum est quod in alia incepta simpliciter transcribi non possunt nisi omnino mutato. Postea in articulo omnia contenta fasciculi .csproj apponam.

Bene, proprietates rei figurasti - difficile non est. Sed quid agat de obturaculis in bibliothecis (NuGet fasciculis). Si ulterius inspiciamus, bibliothecas inclusas denominari in elementis videbimus ItemGroup. Sed mala fortuna - hoc elementum non recte procedit condiciones ut elementum PropertyGroup. Fortasse haec etiam visualis Studio glitch est, sed si plura elementa denotas ItemGroup cum conditionibus conformationis, et diversos nexus ad NuGet fasciculos intus inpone, tunc cum configurationem mutas, omnes certae fasciculi cum exerto connectuntur.

Elementum ad nostrum auxilium venit Eligequae secundum consuetudinem logicam operatur tunc, si aliud.

Uti elementum Eligevarias fasciculos NuGet pro diversis conformationibus constituimus;

Omnia contenta 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>

Quaeso note quod in una condicionum duarum figurarum per me specificatarum OR'. Hoc modo sarcina requiritur in configuratione coniungetur Notice.

Et hic fere omnia perfecta habemus. Retro consilium oneratis, da configurationem quam indigemus, item vocamus "in menu contextu solutionis (non documentum)Restitue omnia NuGet packages"et videmus quomodo fasciculi nostri mutentur.

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Hac in scaena ad finem mortuum veni - ut omnes schemata simul colligeremus, coetum batch uti potuimus.conventus» ->«Batch constructum"), sed cum configurationes mutandi, fasciculi automatice non restituuntur. Convenientibusque documentis hoc quoque non contingit, sed ratione habita. Solutio huius quaestionis per vexillum significat non inveni. Et hoc maxime probabile est etiam Visual Studio bug.

Ideo, ad batch conventus, placuit speciali automated systematis conventus uti nulla. Hoc vere nolui, quia overkillum puto secundum evolutionis plugin, sed momento aliam solutionem non video. Et ad interrogationem "Quare nulla?" Responsum est simplex, eo in opere utimur.

Ergo, vade ad folder solutionis nostrae (non propositum), clavem tene shift and right-click in vacuo spatio in folder - in contextu menu item lego "Patefacio PowerShell fenestra hic".

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Si non installed nullaErgo prius scribe imperium

dotnet tool install Nuke.GlobalTool –global

Nunc scribe imperium nulla et promptus ad configurare nulla ad hodiernam delineationem. Nescio quomodo haec rectius in Russian - Anglice scribetur ".nuke limam invenire non potuit". Vis aedificare aedificare? [y/n]

Preme Y key et tunc erunt directa occasus items. Non opus est simplicissima optio utens MSBuildsic respondemus sicut in screenshot:

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Eamus ad Studios Visual, quae nos suggeret ut solutionem reload, quia novum inceptum ei adiectum est. Nos solutionem reload et videamus nos habere consilium ædificem in quo intersunt tantum unum fasciculum - Build.cs

Unum plugin consilium facimus cum compilatione pro diversis versionibus Revit/AutoCAD

Aperi hanc fasciculum et scribe litteras ad omne schematum aedificandum. Bene, vel scripto utere meo, quod emendare potes ad usus tuos necessarios;

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

Redimus ad fenestram PowerShell et iterum scribimus imperium nulla (Potes scribere imperium nulla significans requiratur Target. Sed unum Targetqui per defaltam currit). Post pressionem Intra clavem, hackers reales sentiemus, quia, sicut in pellicula, consilium nostrum pro diversis conformationibus sponte congregabitur.

Obiter uti potes PowerShell directe ex Visual Studio (menu "View» ->«Aliae fenestrae» ->«Package Manager Console") sed omnia in albo et nigro erunt, quod minus convenit.

Hoc concluditur meum articulum. Certus sum te posse significare optionem pro AutoCAD te ipso. Spero materiam hic propositam inveniet suos "clientes".

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

Source: www.habr.com

Add a comment