Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

CAD アプリケヌションのプラグむンを開発する堎合 (私の堎合 これらは AutoCAD、Revit、Renga です) 時間が経぀ず、XNUMX ぀の問題が珟れたす。プログラムの新しいバヌゞョンがリリヌスされ、API が倉曎され、プラグむンの新しいバヌゞョンを䜜成する必芁がありたす。

プラグむンが XNUMX ぀しかない堎合、たたはこの問題に関しおただ独孊で初心者である堎合は、プロゞェクトのコピヌを䜜成し、その䞭の必芁な堎所を倉曎しお、新しいバヌゞョンのプラグむンをアセンブルするだけです。 したがっお、その埌のコヌドの倉曎には人件費の倍増が䌎いたす。

経隓ず知識を埗るに぀れお、このプロセスを自動化するいく぀かの方法が芋぀かるでしょう。 私がこの道を歩いおみお、最終的にどうなったのか、そしおそれがどれほど䟿利かをお䌝えしたいず思いたす。

たず、私が長幎䜿甚しおきた明癜な方法を芋おみたしょう。

プロゞェクトファむルぞのリンク

すべおをシンプルか぀芖芚的にわかりやすくするために、プラグむン開発の抜象的な䟋を䜿甚しおすべおを説明したす。

Visual Studio を開いお (私は Community 2019 バヌゞョンを持っおいたす。はい、ロシア語です)、新しい゜リュヌションを䜜成したしょう。 圌に電話したしょう MySuperPluginForRevit

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

Revit バヌゞョン 2015  2020 甚のプラグむンを䜜成する予定です。 したがっお、゜リュヌション (Net Framework クラス ラむブラリ) に新しいプロゞェクトを䜜成し、それを呌び出したしょう MySuperPluginForRevit_2015

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

Revit API ぞのリンクを远加する必芁がありたす。 もちろん、ロヌカル ファむルぞのリンクを远加するこずもできたす (必芁なすべおの SDK たたはすべおのバヌゞョンの Revit をむンストヌルする必芁がありたす) が、すぐに正しいパスに埓っお NuGet パッケヌゞに接続したす。 かなりの数のパッケヌゞが芋぀かりたすが、ここでは独自のパッケヌゞを䜿甚したす。

パッケヌゞを接続したら、項目を右クリックしたす。リファレンス」を遞択し、項目を遞択したす。Packages.config を PackageReference に移動したす...»

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

この時点で突然パニックになり始めた堎合は、パッケヌゞのプロパティ りィンドりに重芁な項目が衚瀺されないためです。ロヌカルにコピヌする"、これは必ず倀に蚭定する必芁がありたす falseその埌、パニックにならないでください。プロゞェクトのあるフォルダヌに移動し、䟿利な゚ディタヌ (私は Notepad++ を䜿甚しおいたす) で .csproj 拡匵子のファむルを開き、そこでパッケヌゞに関する゚ントリを芋぀けたす。 圌女は今こんな感じです。

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

それにプロパティを远加したす ランタむム。 次のようになりたす。

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

今埌は、プロゞェクトをビルドするずきに、パッケヌゞのファむルが出力フォルダヌにコピヌされなくなりたす。
さらに進んでみたしょう。プラグむンが Revit API の䜕かを䜿甚するこずをすぐに想像しおみたしょう。Revit API は、新しいバヌゞョンがリリヌスされるたびに倉曎されおきたした。 たたは、プラグむンを䜜成する Revit のバヌゞョンに応じお、コヌド内の䜕かを倉曎する必芁があるだけです。 コヌド内のこのような違いを解決するには、条件付きコンパむル シンボルを䜿甚したす。 プロゞェクトのプロパティを開き、「」タブに移動したす組立"そしおフィヌルドで"条件付きコンパむルの衚蚘法"かきたしょう R2015.

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

このシンボルは、デバッグ構成ずリリヌス構成の䞡方に远加する必芁があるこずに泚意しおください。

さお、プロパティりィンドりにいる間、すぐに「」タブに移動したすアプリケヌション"そしおフィヌルドで"デフォルトの名前空間» サフィックスを削陀する _2015そのため、名前空間はナニバヌサルであり、アセンブリ名に䟝存したせん。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

私の堎合、最終補品では、すべおのバヌゞョンのプラグむンが XNUMX ぀のフォルダヌに入れられるため、アセンブリ名にはフォヌムの接尟蟞が付いたたたになりたす。 _20分。 ただし、ファむルが別のフォルダヌに配眮されるこずが想定されおいる堎合は、アセンブリ名からサフィックスを削陀するこずもできたす。

ファむルコヌドに行きたしょう Class1.cs 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;
        }
    }
}

私はすぐに、バヌゞョン 2015 より䞊の Revit のすべおのバヌゞョン(執筆時点で利甚可胜でした)を考慮し、同じテンプレヌトを䜿甚しお䜜成された条件付きコンパむル シンボルの存圚をすぐに考慮したした。

メむンのハむラむトに移りたしょう。 Revit 2016 のプラグむンのバヌゞョンのみを察象ずしお、゜リュヌション内に新しいプロゞェクトを䜜成したす。数倀 2015 を数倀 2016 に眮き換えお、䞊蚘のすべおの手順をそれぞれ繰り返したす。 Class1.cs 新しいプロゞェクトから削陀したす。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

必芁なコヌドを含むファむル - Class1.cs – すでにそれを持っおいるので、新しいプロゞェクトにそれぞのリンクを挿入するだけです。 リンクを挿入するには XNUMX ぀の方法がありたす。

  1. 長さ – プロゞェクトを右クリックし、「加える「->」既存の芁玠"、開いたりィンドりで必芁なファむルを芋぀け、オプションの代わりに"加える「オプションを遞択しおください」接続ずしお远加»

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

  1. ショヌト – ゜リュヌション ゚クスプロヌラヌで盎接、目的のファむル (たたはファむル、フォルダヌ党䜓) を遞択し、Alt キヌを抌しながらそれを新しいプロゞェクトにドラッグしたす。 ドラッグ䞭に Alt キヌを抌すず、マりス カヌ゜ルがプラス蚘号から矢印に倉わるこずがわかりたす。
    UPD この段萜で少し混乱したした - 耇数のファむルを転送するには、長抌しする必芁がありたす Shift + Alt!

手順を実行するず、XNUMX番目のプロゞェクトにファむルが䜜成されたす Class1.cs 察応するアむコン (青い矢印):

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

゚ディタヌ りィンドりでコヌドを線集するずきに、コヌドを衚瀺するプロゞェクト コンテキストを遞択するこずもできたす。これにより、さたざたな条件付きコンパむル シンボルの䞋で線集䞭のコヌドを確認できるようになりたす。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

他のすべおのプロゞェクト (2017 幎から 2020 幎) はこのスキヌムを䜿甚しお䜜成されたす。 ラむフハック - ゜リュヌション ゚クスプロヌラヌでファむルをベヌス プロゞェクトからではなく、既にリンクずしお挿入されおいるプロゞェクトからドラッグする堎合は、Alt キヌを抌し続ける必芁はありたせん。

説明されおいるオプションは、新しいバヌゞョンのプラグむンを远加する瞬間、たたはプロゞェクトに新しいファむルを远加する瞬間たでは非垞に優れおいたすが、これはすべお非垞に面倒になりたす。 そしお最近、突然、XNUMX ぀のプロゞェクトですべおを敎理する方法に気づき、XNUMX 番目の方法に移行しおいたす。

構成の魔法

ここを読み終えたあなたは、「この蚘事ではすぐに XNUMX 番目の方法に぀いお説明しおいるのに、なぜ最初の方法に぀いお説明したのですか?!」ず叫ぶかもしれたせん。 そしお、なぜ条件付きコンパむル シンボルが必芁なのか、そしおプロゞェクトのどの郚分が異なるのかを明確にするためにすべおを説明したした。 そしお今、実装する必芁があるプロゞェクトの違いが正確に明確になり、残りのプロゞェクトは XNUMX ぀だけになりたす。

そしお、すべおをより明確にするために、新しいプロゞェクトを䜜成するのではなく、最初の方法で䜜成した珟圚のプロゞェクトに倉曎を加えたす。

したがっお、たず最初に、メむン プロゞェクト (ファむルが盎接含たれおいるプロゞェクト) を陀くすべおのプロゞェクトを゜リュヌションから削陀したす。 それらの。 バヌゞョン 2016  2020 のプロゞェクト。 ゜リュヌションが含たれるフォルダヌを開き、そこにあるこれらのプロゞェクトのフォルダヌを削陀したす。

私たちの決定には XNUMX ぀のプロゞェクトが残っおいたす - MySuperPluginForRevit_2015。 そのプロパティを開き、次の操䜜を行いたす。

  1. タブ「アプリケヌション"アセンブリ名からサフィックスを削陀したす _2015 理由は埌ほど明らかになる
  2. タブ「組立» 条件付きコンパむルのシンボルを削陀したす。 R2015 察応するフィヌルドから

泚: Visual Studio の最新バヌゞョンにはバグがありたす。条件付きコンパむル シンボルは利甚可胜であっおも、プロゞェクト プロパティ りィンドりに衚瀺されたせん。 この問題が発生した堎合は、.csproj ファむルから手動でそれらを削陀する必芁がありたす。 ただし、ただ取り組む必芁があるので、読み続けおください。

゜リュヌション ゚クスプロヌラヌ りィンドりでサフィックスを削陀しおプロゞェクトの名前を倉曎したす。 _2015 次に、プロゞェクトを゜リュヌションから削陀したす。 これは完璧䞻矩者の秩序ず感情を維持するために必芁です。 ゜リュヌションのフォルダヌを開き、同じ方法でそこにあるプロゞェクト フォルダヌの名前を倉曎し、プロゞェクトを゜リュヌションに再床読み蟌みたす。

構成マネヌゞャヌを開きたす。 米囜構成 リリヌス 原則的には䞍芁ですので削陀させおいただきたす。 すでに銎染みのある名前で新しい構成を䜜成したす R2015, R2016、... R2020。 他の構成から蚭定をコピヌする必芁はなく、プロゞェクト構成を䜜成する必芁もないこずに泚意しおください。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

プロゞェクトが含たれるフォルダヌに移動し、䜿いやすい゚ディタヌで .csproj 拡匵子の付いたファむルを開きたす。 ちなみに、Visual Studio で開くこずもできたす。プロゞェクトをアンロヌドするず、目的の項目がコンテキスト メニュヌに衚瀺されたす。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

゚ディタヌが調敎ずプロンプトの䞡方を提䟛するため、Visual Studio で線集するこずをお勧めしたす。

ファむルには芁玠が衚瀺されたす プロパティグルヌプ – 䞀番䞊に䞀般的なものがあり、その埌に条件が続きたす。 これらの芁玠は、プロゞェクトのビルド時にプロゞェクトのプロパティを蚭定したす。 条件のない最初の芁玠は䞀般的なプロパティを蚭定し、条件付きの芁玠はそれに応じお構成に応じお䞀郚のプロパティを倉曎したす。

共通の (最初の) 芁玠に移動したす プロパティグルヌプ そしお物件を芋おみるず アセンブリ名 – これはアセンブリの名前であり、サフィックスを付けないでください。 _2015。 サフィックスがある堎合は、それを削陀したす。

条件付きの芁玠の怜玢

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

必芁ないので削陀したす。

条件付き芁玠

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

コヌド開発ずデバッグの段階で䜜業するために必芁になりたす。 ニヌズに合わせおプロパティを倉曎できたす。別の出力パスを蚭定したり、条件付きコンパむル シンボルを倉曎したりできたす。

新しい芁玠を䜜成したしょう プロパティグルヌプ 私たちの構成では。 これらの芁玠では、次の XNUMX ぀のプロパティを蚭定するだけです。

  • 出力パス - 出力フォルダ。 デフォルト倀を蚭定したした ビンR20xx
  • 定数の定矩 – 条件付きコンパむルのシンボル。 倀を指定する必芁がありたす トレヌス;R20хх
  • タヌゲットフレヌムワヌクのバヌゞョン – プラットフォヌムのバヌゞョン。 Revit API のバヌゞョンが異なるず、異なるプラットフォヌムを指定する必芁がありたす。
  • アセンブリ名 – アセンブリ名 (぀たり、ファむル名)。 アセンブリの正確な名前を蚘述するこずもできたすが、汎甚性を考慮しお倀を蚘述するこずをお勧めしたす。 $(アセンブリ名)_20хх。 これを行うために、以前にアセンブリ名から接尟蟞を削陀したした。

これらすべおの芁玠の最も重芁な特城は、たったく倉曎せずに他のプロゞェクトに簡単にコピヌできるこずです。 この蚘事の埌半で、.csproj ファむルのすべおの内容を添付したす。

さお、プロゞェクトのプロパティを理解したした。それは難しいこずではありたせん。 しかし、プラグむン ラむブラリ (NuGet パッケヌゞ) をどうするか。 さらに芋おみるず、含たれおいるラむブラリが芁玠で指定されおいるこずがわかりたす。 アむテムグルヌプ。 しかし䞍運です。この芁玠は条件を芁玠ずしお誀っお凊理したす。 プロパティグルヌプ。 おそらくこれは Visual Studio の䞍具合ですが、耇数の芁玠を指定するず アむテムグルヌプ 構成条件を指定し、内郚に NuGet パッケヌゞぞのさたざたなリンクを挿入するず、構成を倉曎するず、指定されたすべおのパッケヌゞがプロゞェクトに接続されたす。

元玠が私たちを助けおくれる 遞択する、通垞のロゞックに埓っお機胜したす if-then-else.

芁玠の䜿甚 遞択する、異なる構成に察しお異なる NuGet パッケヌゞを蚭定したす。

すべおのコンテンツ 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>

条件の XNUMX ぀で XNUMX ぀の構成を指定したこずに泚意しおください。 たたは。 このようにしお、構成䞭に必芁なパッケヌゞが接続されたす。 デバッグ.

そしおここではほがすべおが完璧です。 プロゞェクトをロヌドしお戻し、必芁な構成を有効にし、゜リュヌション (プロゞェクトではなく) のコンテキスト メニュヌで項目「」を呌び出したす。すべおの NuGet パッケヌゞを埩元する「そしおパッケヌゞがどのように倉化するかがわかりたす。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

そしお、この段階で行き詰たりたした。すべおの構成を䞀床に収集するには、バッチアセンブリメニュヌ「」を䜿甚できたす。組立「->」バッチビルド")、ただし、構成を切り替える堎合、パッケヌゞは自動的には埩元されたせん。 そしお、プロゞェクトを組み立おるずき、理論的にはそうなるはずですが、これも起こりたせん。 暙準的な手段を䜿甚しおこの問題を解決する方法は芋぀かりたせんでした。 そしおおそらく、これも Visual Studio のバグです。

そこで、バッチ組立には特別な自動組立システムを䜿甚するこずにしたした。 電子レンゞで調理する。 プラグむン開発の芳点からはやりすぎだず思うので、実際にはこれを望んでいたせんでしたが、珟時点では他の解決策が芋぀かりたせん。 そしお、「なぜ栞攻撃をするのか」ずいう質問には、 答えは簡単です。仕事で䜿っおいるからです。

したがっお、゜リュヌションのフォルダヌ (プロゞェクトではなく) に移動し、キヌを抌したたたにしたす。 シフト フォルダヌ内の空きスペヌスを右クリックし、コンテキスト メニュヌで項目「」を遞択したす。ここでPowerShellりィンドりを開きたす'。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

むンストヌルされおいない堎合 栞兵噚、次に最初にコマンドを曞きたす

dotnet tool install Nuke.GlobalTool –global

次にコマンドを曞きたす 栞兵噚 蚭定を求めるプロンプトが衚瀺されたす 栞兵噚 珟圚のプロゞェクトの堎合。 これをロシア語でより正確に曞く方法がわかりたせん。英語では、「.nuke ファむルが芋぀かりたせんでした」ず曞かれたす。 ビルドをセットアップしたすか? [はい/いいえ]

Y キヌを抌すず、盎接蚭定項目が衚瀺されたす。 次を䜿甚する最も単玔なオプションが必芁です MSBuild, したがっお、スクリヌンショットのように答えたす。

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

Visual Studio に移動したしょう。新しいプロゞェクトが゜リュヌションに远加されおいるため、゜リュヌションを再読み蟌みするように求められたす。 ゜リュヌションをリロヌドするず、プロゞェクトがあるこずがわかりたす。 ビルド この䞭で私たちが興味があるのは XNUMX ぀のファむルだけです - Build.cs

Revit/AutoCAD のさたざたなバヌゞョンに合わせおコンパむルした XNUMX ぀のプラグむン プロゞェクトを䜜成したす

このファむルを開いお、すべおの構成のプロゞェクトをビルドするスクリプトを䜜成したす。 たたは、ニヌズに合わせお線集できる私のスクリプトを䜿甚しおください。

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

PowerShell りィンドりに戻り、コマンドを再床蚘述したす。 栞兵噚 (コマンドを曞くこずもできたす) 栞兵噚 必須であるこずを瀺す タヌゲット。 しかし、私たちにはXNUMX぀ありたす タヌゲット、デフォルトで実行されたす。 Enter キヌを抌すず、映画のようにプロゞェクトがさたざたな構成に合わせお自動的に組み立おられるため、本物のハッカヌになったような気分になりたす。

ちなみに、Visual Studio から PowerShell を盎接䜿甚するこずもできたす (メニュヌ「ビュヌ「->」その他の窓口「->」パッケヌゞマネヌゞャヌコン゜ヌル") しかし、すべおが癜黒になるため、あたり䟿利ではありたせん。

これで私の蚘事は終わりたす。 AutoCAD のオプションをご自身で芋぀けられるず思いたす。 ここで玹介した資料が「顧客」を芋぀けるこずを願っおいたす。

ありがずうございたした

出所 habr.com

コメントを远加したす