Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Apabila membangunkan pemalam untuk aplikasi CAD (dalam kes saya ini adalah AutoCAD, Revit dan Renga) dari semasa ke semasa, satu masalah muncul - versi program baharu dikeluarkan, perubahan API mereka dan versi pemalam baharu perlu dibuat.

Apabila anda hanya mempunyai satu pemalam atau anda masih pemula belajar sendiri dalam perkara ini, anda hanya boleh membuat salinan projek, menukar tempat yang diperlukan di dalamnya dan memasang versi baharu pemalam tersebut. Sehubungan itu, perubahan seterusnya kepada kod akan melibatkan peningkatan berganda dalam kos buruh.

Apabila anda memperoleh pengalaman dan pengetahuan, anda akan menemui beberapa cara untuk mengautomasikan proses ini. Saya berjalan di laluan ini dan saya ingin memberitahu anda apa yang telah saya lalui dan betapa mudahnya ia.

Pertama, mari kita lihat kaedah yang jelas dan telah saya gunakan untuk masa yang lama.

Pautan ke fail projek

Dan untuk menjadikan segala-galanya mudah, visual dan boleh difahami, saya akan menerangkan segala-galanya menggunakan contoh abstrak pembangunan pemalam.

Mari buka Visual Studio (Saya mempunyai versi Komuniti 2019. Dan ya - dalam bahasa Rusia) dan buat penyelesaian baharu. Jom panggil dia MySuperPluginForRevit

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Kami akan membuat pemalam untuk Revit untuk versi 2015-2020. Oleh itu, mari kita cipta projek baharu dalam penyelesaian (Perpustakaan Kelas Rangka Kerja Bersih) dan panggilnya MySuperPluginForRevit_2015

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Kami perlu menambah pautan ke API Revit. Sudah tentu, kami boleh menambah pautan ke fail setempat (kami perlu memasang semua SDK yang diperlukan atau semua versi Revit), tetapi kami akan segera mengikut laluan yang betul dan menyambungkan pakej NuGet. Anda boleh menemui beberapa pakej, tetapi saya akan menggunakan pakej saya sendiri.

Selepas menyambungkan pakej, klik kanan pada item "rujukan"dan pilih item"Alihkan packages.config ke PackageReference...Β»

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Jika tiba-tiba pada ketika ini anda mula panik, kerana dalam tetingkap sifat pakej tidak akan ada item penting "Salin secara tempatan", yang pasti kita perlu tetapkan kepada nilai palsu, kemudian jangan panik - pergi ke folder dengan projek itu, buka fail dengan sambungan .csproj dalam editor yang sesuai untuk anda (saya menggunakan Notepad++) dan cari entri tentang pakej kami di sana. Dia kelihatan seperti ini sekarang:

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

Tambahkan sifat padanya masa jalan. Ia akan menjadi seperti ini:

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

Sekarang, apabila membina projek, fail daripada pakej tidak akan disalin ke folder output.
Mari pergi lebih jauh - mari segera bayangkan bahawa pemalam kami akan menggunakan sesuatu daripada API Revit, yang telah berubah dari semasa ke semasa apabila versi baharu telah dikeluarkan. Nah, atau kami hanya perlu menukar sesuatu dalam kod bergantung pada versi Revit yang kami buat pemalam. Untuk menyelesaikan perbezaan kod tersebut, kami akan menggunakan simbol kompilasi bersyarat. Buka sifat projek, pergi ke tab "Perhimpunan"dan di padang"Notasi kompilasi bersyarat"Mari menulis R2015.

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Ambil perhatian bahawa simbol mesti ditambah untuk kedua-dua konfigurasi Nyahpepijat dan Keluaran.

Nah, semasa kami berada dalam tetingkap sifat, kami segera pergi ke tab "Permohonan"dan di padang"Ruang nama lalaiΒ» keluarkan akhiran _2015supaya ruang nama kami adalah universal dan bebas daripada nama perhimpunan:

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Dalam kes saya, dalam produk akhir, pemalam semua versi dimasukkan ke dalam satu folder, jadi nama pemasangan saya kekal dengan akhiran borang _20Ρ…Ρ…. Tetapi anda juga boleh mengalih keluar akhiran daripada nama pemasangan jika fail sepatutnya terletak dalam folder yang berbeza.

Mari pergi ke kod fail Kelas1.cs dan simulasikan beberapa kod di sana, dengan mengambil kira versi Revit yang berbeza:

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

Saya segera mengambil kira semua versi Revit di atas versi 2015 (yang tersedia pada masa penulisan) dan segera mengambil kira kehadiran simbol kompilasi bersyarat, yang dibuat menggunakan templat yang sama.

Mari kita beralih ke sorotan utama. Kami mencipta projek baharu dalam penyelesaian kami, hanya untuk versi pemalam untuk Revit 2016. Kami mengulangi semua langkah yang diterangkan di atas, masing-masing, menggantikan nombor 2015 dengan nombor 2016. Tetapi fail Kelas1.cs padam daripada projek baharu.

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Fail dengan kod yang diperlukan - Kelas1.cs – kami sudah memilikinya dan kami hanya perlu memasukkan pautan kepadanya dalam projek baharu. Terdapat dua cara untuk memasukkan pautan:

  1. Panjang – klik kanan pada projek dan pilih β€œTambahΒ»->Β«Elemen sedia ada", dalam tetingkap yang terbuka, cari fail yang diperlukan dan bukannya pilihan "Tambah"pilih pilihan"Tambah sebagai sambunganΒ»

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

  1. Pendek – terus dalam peneroka penyelesaian, pilih fail yang diingini (atau malah fail, atau malah keseluruhan folder) dan seretnya ke dalam projek baharu sambil menahan kekunci Alt. Semasa anda menyeret, anda akan melihat bahawa apabila anda menekan kekunci Alt, kursor tetikus akan berubah daripada tanda tambah kepada anak panah.
    UPD: Saya membuat sedikit kekeliruan dalam perenggan ini - untuk memindahkan beberapa fail anda harus tahan Shift + Alt!

Selepas menjalankan prosedur, kami akan mempunyai fail dalam projek kedua Kelas1.cs dengan ikon yang sepadan (anak panah biru):

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Apabila mengedit kod dalam tetingkap editor, anda juga boleh memilih konteks projek untuk memaparkan kod itu, yang akan membolehkan anda melihat kod diedit di bawah simbol kompilasi bersyarat yang berbeza:

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Kami mencipta semua projek lain (2017-2020) menggunakan skim ini. Penggodaman hayat - jika anda menyeret fail dalam Penjelajah Penyelesaian bukan dari projek asas, tetapi dari projek yang telah dimasukkan sebagai pautan, maka anda tidak perlu menahan kekunci Alt!

Pilihan yang diterangkan agak baik sehingga saat menambah versi baharu pemalam atau sehingga saat menambah fail baharu pada projek - semua ini menjadi sangat membosankan. Dan baru-baru ini tiba-tiba saya tiba-tiba menyedari bagaimana untuk menyusun semuanya dengan satu projek dan kami beralih ke kaedah kedua

Keajaiban konfigurasi

Setelah selesai membaca di sini, anda boleh berseru, "Mengapa anda menerangkan kaedah pertama, jika artikel itu serta-merta mengenai yang kedua?!" Dan saya menerangkan segala-galanya untuk menjelaskan dengan lebih jelas mengapa kita memerlukan simbol kompilasi bersyarat dan di tempat mana projek kita berbeza. Dan kini menjadi lebih jelas kepada kita apa perbezaan dalam projek yang perlu kita laksanakan, hanya meninggalkan satu projek.

Dan untuk menjadikan semuanya lebih jelas, kami tidak akan membuat projek baharu, tetapi akan membuat perubahan pada projek semasa kami yang dibuat dengan cara pertama.

Jadi, pertama sekali, kami mengalih keluar semua projek daripada penyelesaian kecuali yang utama (mengandungi fail secara langsung). Itu. projek untuk versi 2016-2020. Buka folder dengan penyelesaian dan padamkan folder projek ini di sana.

Kami mempunyai satu projek lagi dalam keputusan kami - MySuperPluginForRevit_2015. Buka sifatnya dan:

  1. Pada tab β€œPermohonan"buang akhiran daripada nama perhimpunan _2015 (ia akan menjadi jelas mengapa kemudian)
  2. Pada tab β€œPerhimpunanΒ» alih keluar simbol kompilasi bersyarat R2015 daripada medan yang sepadan

Nota: versi terkini Visual Studio mempunyai pepijat - simbol kompilasi bersyarat tidak dipaparkan dalam tetingkap sifat projek, walaupun ia tersedia. Jika anda mengalami gangguan ini, maka anda perlu mengalih keluarnya secara manual daripada fail .csproj. Walau bagaimanapun, kita masih perlu bekerja di dalamnya, jadi teruskan membaca.

Namakan semula projek dalam tetingkap Solution Explorer dengan mengalih keluar akhiran _2015 dan kemudian keluarkan projek daripada penyelesaian. Ini adalah perlu untuk mengekalkan ketenteraman dan perasaan perfeksionis! Kami membuka folder penyelesaian kami, menamakan semula folder projek di sana dengan cara yang sama dan memuatkan semula projek ke dalam penyelesaian.

Buka pengurus konfigurasi. Konfigurasi AS Lepaskan pada dasarnya, ia tidak akan diperlukan, jadi kami memadamkannya. Kami mencipta konfigurasi baharu dengan nama yang sudah biasa kepada kami R2015, R2016,…, R2020. Ambil perhatian bahawa anda tidak perlu menyalin tetapan daripada konfigurasi lain dan anda tidak perlu membuat konfigurasi projek:

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Pergi ke folder dengan projek dan buka fail dengan sambungan .csproj dalam editor yang sesuai untuk anda. Dengan cara ini, anda juga boleh membukanya dalam Visual Studio - anda perlu memunggah projek dan kemudian item yang dikehendaki akan berada dalam menu konteks:

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Mengedit dalam Visual Studio adalah lebih baik, kerana editor kedua-dua menjajarkan dan menggesa.

Dalam fail kita akan melihat elemen PropertyGroup – di bahagian paling atas adalah yang umum, dan kemudian datang syaratnya. Elemen ini menetapkan sifat projek apabila ia dibina. Elemen pertama, yang tanpa syarat, menetapkan sifat umum, dan elemen dengan syarat, dengan itu, menukar beberapa sifat bergantung pada konfigurasi.

Pergi ke elemen biasa (pertama). PropertyGroup dan lihat harta itu Nama Perhimpunan – ini adalah nama perhimpunan dan kita sepatutnya memilikinya tanpa akhiran _2015. Jika terdapat imbuhan, maka keluarkannya.

Mencari unsur dengan keadaan

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

Kami tidak memerlukannya - kami memadamkannya.

Unsur dengan keadaan

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

akan diperlukan untuk bekerja pada peringkat pembangunan kod dan penyahpepijatan. Anda boleh menukar sifatnya mengikut keperluan anda - tetapkan laluan keluaran yang berbeza, tukar simbol kompilasi bersyarat, dsb.

Sekarang mari kita cipta elemen baharu PropertyGroup untuk konfigurasi kami. Dalam elemen ini kita hanya perlu menetapkan empat sifat:

  • OutputPath – folder keluaran. Saya menetapkan nilai lalai binR20xx
  • DefineConstants – simbol kompilasi bersyarat. Nilai harus dinyatakan TRACE;R20Ρ…Ρ…
  • TargetFrameworkVersion – versi platform. Versi API Revit yang berbeza memerlukan platform yang berbeza untuk ditentukan.
  • Nama Perhimpunan – nama perhimpunan (iaitu nama fail). Anda boleh menulis nama sebenar perhimpunan, tetapi untuk serba boleh saya cadangkan menulis nilai $(AssemblyName)_20Ρ…Ρ…. Untuk melakukan ini, kami sebelum ini mengalih keluar akhiran daripada nama perhimpunan

Ciri yang paling penting dari semua elemen ini ialah ia boleh disalin ke dalam projek lain tanpa mengubahnya sama sekali. Kemudian dalam artikel saya akan melampirkan semua kandungan fail .csproj.

Okey, kami telah mengetahui sifat projek itu - ia tidak sukar. Tetapi apa yang perlu dilakukan dengan perpustakaan pemalam (pakej NuGet). Jika kita melihat lebih jauh, kita akan melihat bahawa perpustakaan yang disertakan dinyatakan dalam elemen ItemGroup. Tetapi nasib malang - elemen ini salah memproses syarat sebagai elemen PropertyGroup. Mungkin ini adalah gangguan Visual Studio, tetapi jika anda menentukan beberapa elemen ItemGroup dengan syarat konfigurasi, dan masukkan pautan berbeza ke pakej NuGet di dalam, kemudian apabila anda menukar konfigurasi, semua pakej yang ditentukan disambungkan kepada projek.

Elemen itu datang untuk membantu kami Pilih, yang berfungsi mengikut logik biasa kami jika-kemudian-lain.

Menggunakan elemen Pilih, kami menetapkan pakej NuGet yang berbeza untuk konfigurasi yang berbeza:

Semua kandungan 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>

Sila ambil perhatian bahawa dalam salah satu syarat saya menyatakan dua konfigurasi melalui ATAU. Dengan cara ini pakej yang diperlukan akan disambungkan semasa konfigurasi Debug.

Dan di sini kita mempunyai hampir semuanya sempurna. Kami memuatkan semula projek, dayakan konfigurasi yang kami perlukan, panggil item " dalam menu konteks penyelesaian (bukan projek)Pulihkan semua pakej NuGet"dan kami melihat bagaimana pakej kami berubah.

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Dan pada peringkat ini saya menemui jalan buntu - untuk mengumpul semua konfigurasi sekaligus, kita boleh menggunakan perhimpunan batch (menu "PerhimpunanΒ»->Β«Binaan kelompok"), tetapi apabila menukar konfigurasi, pakej tidak dipulihkan secara automatik. Dan apabila memasang projek, ini juga tidak berlaku, walaupun, secara teori, ia sepatutnya. Saya tidak menemui penyelesaian kepada masalah ini menggunakan cara standard. Dan kemungkinan besar ini juga pepijat Visual Studio.

Oleh itu, untuk pemasangan kelompok, ia telah memutuskan untuk menggunakan sistem pemasangan automatik khas Nuke. Saya sebenarnya tidak mahu ini kerana saya fikir ia berlebihan dari segi pembangunan pemalam, tetapi pada masa ini saya tidak nampak penyelesaian lain. Dan kepada soalan "Mengapa Nuke?" Jawapannya mudah - kami menggunakannya di tempat kerja.

Jadi, pergi ke folder penyelesaian kami (bukan projek), tahan kekunci Beralih dan klik kanan pada ruang kosong dalam folder - dalam menu konteks pilih item "Buka tetingkap PowerShell di sini'.

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Jika anda tidak memasangnya nuke, kemudian mula-mula tulis arahan

dotnet tool install Nuke.GlobalTool –global

Sekarang tulis arahan nuke dan anda akan digesa untuk mengkonfigurasi nuke untuk projek semasa. Saya tidak tahu cara menulis ini dengan lebih betul dalam bahasa Rusia - dalam bahasa Inggeris ia akan ditulis Tidak dapat mencari fail .nuke. Adakah anda ingin menyediakan binaan? [y/n]

Tekan kekunci Y dan kemudian akan terdapat item tetapan langsung. Kami memerlukan pilihan paling mudah menggunakan MSBuild, jadi kami menjawab seperti dalam tangkapan skrin:

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Mari pergi ke Visual Studio, yang akan menggesa kami untuk memuatkan semula penyelesaian, memandangkan projek baharu telah ditambahkan padanya. Kami memuat semula penyelesaian dan melihat bahawa kami mempunyai projek membina di mana kami hanya berminat dengan satu fail - Build.cs

Kami membuat satu projek pemalam dengan kompilasi untuk versi berbeza Revit/AutoCAD

Buka fail ini dan tulis skrip untuk membina projek untuk semua konfigurasi. Nah, atau gunakan skrip saya, yang boleh anda edit untuk memenuhi keperluan anda:

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

Kami kembali ke tetingkap PowerShell dan tulis arahan itu semula nuke (anda boleh menulis arahan nuke menunjukkan yang diperlukan Sasaran. Tetapi kami mempunyai satu Sasaran, yang dijalankan secara lalai). Selepas menekan kekunci Enter, kami akan berasa seperti penggodam sebenar, kerana, seperti dalam filem, projek kami akan dipasang secara automatik untuk konfigurasi yang berbeza.

Dengan cara ini, anda boleh menggunakan PowerShell terus dari Visual Studio (menu "LihatΒ»->Β«Tingkap lainΒ»->Β«Konsol Pengurus Pakej"), tetapi semuanya akan menjadi hitam dan putih, yang tidak begitu mudah.

Ini menyimpulkan artikel saya. Saya pasti anda boleh memikirkan sendiri pilihan untuk AutoCAD. Saya berharap bahan yang dibentangkan di sini akan menemui "pelanggan"nya.

Thank you!

Sumber: www.habr.com

Tambah komen