Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Saat mengembangkan plugin untuk aplikasi CAD (dalam hal ini ini adalah AutoCAD, Revit dan Renga) seiring waktu, satu masalah muncul - versi program baru dirilis, perubahan API dan versi plugin baru perlu dibuat.

Ketika Anda hanya memiliki satu plugin atau Anda masih seorang pemula otodidak dalam hal ini, Anda cukup membuat salinan proyek, mengubah tempat yang diperlukan di dalamnya, dan merakit plugin versi baru. Oleh karena itu, perubahan selanjutnya pada kode etik ini akan menyebabkan peningkatan biaya tenaga kerja yang berlipat ganda.

Saat Anda memperoleh pengalaman dan pengetahuan, Anda akan menemukan beberapa cara untuk mengotomatiskan proses ini. Saya menempuh jalan ini dan saya ingin memberi tahu Anda apa yang saya dapatkan dan betapa nyamannya itu.

Pertama, mari kita lihat metode yang sudah jelas dan sudah lama saya gunakan.

Tautan ke file proyek

Dan untuk membuat semuanya sederhana, visual, dan mudah dipahami, saya akan menjelaskan semuanya menggunakan contoh abstrak pengembangan plugin.

Mari buka Visual Studio (Saya memiliki versi Komunitas 2019. Dan ya - dalam bahasa Rusia) dan buat solusi baru. Ayo telepon dia MySuperPluginForRevit

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Kami akan membuat plugin untuk Revit untuk versi 2015-2020. Oleh karena itu, mari buat proyek baru dalam solusi (Perpustakaan Kelas Net Framework) dan beri nama MySuperPluginForRevit_2015

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Kita perlu menambahkan tautan ke Revit API. Tentu saja, kami dapat menambahkan tautan ke file lokal (kami perlu menginstal semua SDK yang diperlukan atau semua versi Revit), tetapi kami akan segera mengikuti jalur yang benar dan menghubungkan paket NuGet. Anda dapat menemukan beberapa paket, tetapi saya akan menggunakan paket saya sendiri.

Setelah menghubungkan paket, klik kanan pada item “referensi" dan pilih barangnya "Pindahkan paket.config ke PackageReference...»

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Jika tiba-tiba saat ini Anda mulai panik, karena di jendela properti paket tidak akan ada item penting “Salin secara lokal", yang tentunya perlu kita atur nilainya palsu, maka jangan panik - buka folder dengan proyek, buka file dengan ekstensi .csproj di editor yang nyaman bagi Anda (saya menggunakan Notepad++) dan temukan entri tentang paket kami di sana. Dia terlihat seperti ini sekarang:

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

Tambahkan properti ke dalamnya waktu proses. Ini akan menjadi seperti ini:

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

Sekarang, ketika membangun sebuah proyek, file dari paket tidak akan disalin ke folder keluaran.
Mari melangkah lebih jauh - bayangkan saja plugin kita akan menggunakan sesuatu dari Revit API, yang telah berubah seiring waktu ketika versi baru dirilis. Ya, atau kita hanya perlu mengubah sesuatu pada kodenya tergantung pada versi Revit yang pluginnya kita buat. Untuk mengatasi perbedaan kode tersebut, kami akan menggunakan simbol kompilasi bersyarat. Buka properti proyek, buka tab “Majelis"dan di lapangan"Notasi kompilasi bersyarat"Mari menulis R2015.

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Perhatikan bahwa simbol harus ditambahkan untuk konfigurasi Debug dan Rilis.

Nah, selagi kita berada di jendela properti, kita langsung masuk ke tab “Web"dan di lapangan"Ruang nama bawaan» hapus akhiran _2015sehingga namespace kami bersifat universal dan independen dari nama Majelis:

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Dalam kasus saya, di produk akhir, plugin dari semua versi dimasukkan ke dalam satu folder, sehingga nama Majelis saya tetap dengan akhiran formulir _20хх. Namun Anda juga dapat menghapus akhiran dari nama rakitan jika file seharusnya ditempatkan di folder yang berbeda.

Mari kita pergi ke kode file Kelas1.cs dan simulasikan beberapa kode di sana, dengan mempertimbangkan versi Revit yang berbeda:

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 memperhitungkan semua versi Revit di atas versi 2015 (yang tersedia pada saat penulisan) dan segera memperhitungkan keberadaan simbol kompilasi bersyarat, yang dibuat menggunakan template yang sama.

Mari beralih ke sorotan utama. Kami membuat proyek baru dalam solusi kami, hanya untuk versi plugin untuk Revit 2016. Kami mengulangi semua langkah yang dijelaskan di atas, masing-masing, mengganti nomor 2015 dengan nomor 2016. Tapi file Kelas1.cs hapus dari proyek baru.

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

File dengan kode yang diperlukan - Kelas1.cs – kami sudah memilikinya dan kami hanya perlu memasukkan tautan ke sana di proyek baru. Ada dua cara untuk menyisipkan tautan:

  1. Panjang – klik kanan pada proyek dan pilih “Menambahkan"->"Elemen yang ada", di jendela yang terbuka, temukan file yang diperlukan dan alih-alih opsi"Menambahkan" pilih opsi "Tambahkan sebagai koneksi»

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

  1. Pendek – langsung di penjelajah solusi, pilih file yang diinginkan (atau bahkan file, atau bahkan seluruh folder) dan seret ke proyek baru sambil menahan tombol Alt. Saat Anda menyeret, Anda akan melihat bahwa ketika Anda menekan tombol Alt, kursor mouse akan berubah dari tanda tambah menjadi panah.
    UPD: Saya membuat sedikit kebingungan dalam paragraf ini - untuk mentransfer beberapa file Anda harus menahan Shift + Alt!

Setelah melakukan prosedur, kita akan memiliki file di proyek kedua Kelas1.cs dengan ikon yang sesuai (panah biru):

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Saat mengedit kode di jendela editor, Anda juga dapat memilih konteks proyek mana yang akan menampilkan kode, yang memungkinkan Anda melihat kode sedang diedit di bawah simbol kompilasi bersyarat yang berbeda:

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Kami membuat semua proyek lainnya (2017-2020) menggunakan skema ini. Peretasan seumur hidup - jika Anda menyeret file ke Solution Explorer bukan dari proyek dasar, tetapi dari proyek yang sudah disisipkan sebagai tautan, maka Anda tidak perlu menahan tombol Alt!

Opsi yang dijelaskan cukup bagus hingga saat menambahkan versi baru plugin atau hingga saat menambahkan file baru ke proyek - semua ini menjadi sangat membosankan. Dan baru-baru ini saya tiba-tiba menyadari bagaimana menyelesaikan semuanya dengan satu proyek dan kami beralih ke metode kedua

Keajaiban konfigurasi

Setelah selesai membaca di sini, Anda mungkin berseru, “Mengapa Anda menjelaskan cara pertama, jika artikelnya langsung membahas cara kedua?!” Dan saya menjelaskan semuanya untuk memperjelas mengapa kita memerlukan simbol kompilasi bersyarat dan di mana perbedaan proyek kita. Dan sekarang menjadi jelas bagi kami perbedaan proyek apa yang perlu kami laksanakan, sehingga hanya menyisakan satu proyek.

Dan untuk memperjelas semuanya, kami tidak akan membuat proyek baru, tetapi akan membuat perubahan pada proyek kami saat ini yang dibuat dengan cara pertama.

Jadi, pertama-tama, kami menghapus semua proyek dari solusi kecuali proyek utama (berisi file secara langsung). Itu. proyek untuk versi 2016-2020. Buka folder dengan solusi dan hapus folder proyek ini di sana.

Kami memiliki satu proyek tersisa dalam keputusan kami - MySuperPluginForRevit_2015. Buka propertinya dan:

  1. Pada tab “Web"hapus akhiran dari nama Majelis _2015 (akan menjadi jelas alasannya nanti)
  2. Pada tab “Majelis» hapus simbol kompilasi bersyarat R2015 dari bidang yang sesuai

Catatan: versi terbaru Visual Studio memiliki bug - simbol kompilasi bersyarat tidak ditampilkan di jendela properti proyek, meskipun tersedia. Jika Anda mengalami kesalahan ini, Anda perlu menghapusnya secara manual dari file .csproj. Namun, kami masih harus mengerjakannya, jadi baca terus.

Ganti nama proyek di jendela Solution Explorer dengan menghapus akhiran _2015 dan kemudian menghapus proyek dari solusi. Hal ini diperlukan untuk menjaga ketertiban dan perasaan perfeksionis! Buka folder solusi kami, ganti nama folder proyek di sana dengan cara yang sama dan muat proyek kembali ke dalam solusi.

Buka manajer konfigurasi. Konfigurasi AS Lepaskan pada prinsipnya tidak diperlukan, jadi kami hapus. Kami membuat konfigurasi baru dengan nama yang sudah tidak asing lagi bagi kami R2015, R2016, ..., R2020. Perhatikan bahwa Anda tidak perlu menyalin pengaturan dari konfigurasi lain dan Anda tidak perlu membuat konfigurasi proyek:

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Buka folder dengan proyek dan buka file dengan ekstensi .csproj di editor yang nyaman bagi Anda. Omong-omong, Anda juga dapat membukanya di Visual Studio - Anda perlu membongkar proyek dan kemudian item yang diinginkan akan ada di menu konteks:

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Mengedit di Visual Studio bahkan lebih disukai, karena editor menyelaraskan dan meminta.

Di dalam file kita akan melihat elemennya Grup Properti – di bagian paling atas adalah yang umum, dan kemudian muncul kondisinya. Elemen-elemen ini mengatur properti proyek saat dibangun. Elemen pertama, yang tanpa syarat, menetapkan properti umum, dan elemen dengan kondisi, karenanya, mengubah beberapa properti bergantung pada konfigurasinya.

Pergi ke elemen umum (pertama). Grup Properti dan lihat propertinya Nama Majelis – ini adalah nama majelis dan kita harus memilikinya tanpa akhiran _2015. Jika ada akhiran, hapus saja.

Menemukan elemen dengan suatu kondisi

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

Kami tidak membutuhkannya - kami menghapusnya.

Elemen dengan kondisi

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

akan diperlukan untuk bekerja pada tahap pengembangan kode dan debugging. Anda dapat mengubah propertinya sesuai kebutuhan Anda - mengatur jalur keluaran yang berbeda, mengubah simbol kompilasi bersyarat, dll.

Sekarang mari kita buat elemen baru Grup Properti untuk konfigurasi kami. Dalam elemen ini kita hanya perlu mengatur empat properti:

  • Jalur keluaran – folder keluaran. Saya menetapkan nilai default binR20xx
  • Tentukan Konstanta – simbol kompilasi bersyarat. Nilainya harus ditentukan JEJAK;R20хх
  • Versi Kerangka Target – versi platform. Versi Revit API yang berbeda memerlukan platform yang berbeda untuk ditentukan.
  • Nama Majelis – nama perakitan (yaitu nama file). Anda dapat menulis nama pasti dari rakitan tersebut, tetapi untuk keserbagunaan saya sarankan untuk menulis nilainya $(Nama Majelis)_20хх. Untuk melakukan ini, kami sebelumnya menghapus akhiran dari nama Majelis

Fitur terpenting dari semua elemen ini adalah elemen tersebut dapat dengan mudah disalin ke proyek lain tanpa mengubahnya sama sekali. Nanti di artikel saya akan melampirkan seluruh isi file .csproj.

Oke, kami telah mengetahui properti proyek - itu tidak sulit. Tapi apa yang harus dilakukan dengan perpustakaan plug-in (paket NuGet). Jika kita melihat lebih jauh, kita akan melihat bahwa perpustakaan yang disertakan ditentukan dalam elemen Grup Barang. Tapi sialnya - elemen ini salah memproses kondisi sebagai elemen Grup Properti. Mungkin ini bahkan kesalahan Visual Studio, tetapi jika Anda menentukan beberapa elemen Grup Barang dengan kondisi konfigurasi, dan masukkan tautan berbeda ke paket NuGet di dalamnya, lalu ketika Anda mengubah konfigurasi, semua paket yang ditentukan akan terhubung ke proyek.

Elemen ini membantu kami Pilih, yang bekerja sesuai dengan logika kita yang biasa jika-maka-lagi.

Menggunakan elemen Pilih, kami menetapkan paket NuGet berbeda untuk konfigurasi berbeda:

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

Harap dicatat bahwa dalam salah satu kondisi saya menentukan dua konfigurasi melalui ATAU. Dengan cara ini paket yang diperlukan akan terhubung selama konfigurasi Debug.

Dan di sini kita memiliki hampir semuanya sempurna. Kami memuat kembali proyek, mengaktifkan konfigurasi yang kami perlukan, memanggil item “ di menu konteks solusi (bukan proyek)Pulihkan semua paket NuGet"dan kami melihat bagaimana paket kami berubah.

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Dan pada tahap ini saya menemui jalan buntu - untuk mengumpulkan semua konfigurasi sekaligus, kita dapat menggunakan perakitan batch (menu "Majelis"->"Pembuatan batch"), tetapi saat berpindah konfigurasi, paket tidak dipulihkan secara otomatis. Dan ketika menyusun sebuah proyek, hal ini juga tidak terjadi, meskipun secara teori memang seharusnya demikian. Saya belum menemukan solusi untuk masalah ini dengan menggunakan cara standar. Dan kemungkinan besar ini juga merupakan bug Visual Studio.

Oleh karena itu, untuk perakitan batch, diputuskan untuk menggunakan sistem perakitan otomatis khusus Senjata nuklir. Saya sebenarnya tidak menginginkan ini karena menurut saya ini berlebihan dalam hal pengembangan plugin, tetapi saat ini saya tidak melihat solusi lain. Dan untuk pertanyaan “Mengapa Nuke?” Jawabannya sederhana - kami menggunakannya di tempat kerja.

Jadi, buka folder solusi kami (bukan proyek), tahan tombolnya perubahan dan klik kanan pada ruang kosong di folder - di menu konteks pilih item “Buka jendela PowerShell di sini'.

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Jika Anda belum menginstalnya nuklir, lalu tulis perintahnya terlebih dahulu

dotnet tool install Nuke.GlobalTool –global

Sekarang tulis perintahnya nuklir dan Anda akan diminta untuk mengkonfigurasi nuklir untuk proyek saat ini. Saya tidak tahu cara menulis ini dengan lebih benar dalam bahasa Rusia - dalam bahasa Inggris akan tertulis Tidak dapat menemukan file .nuke. Apakah Anda ingin menyiapkan build? [y/n]

Tekan tombol Y dan kemudian akan ada item pengaturan langsung. Kami membutuhkan opsi penggunaan yang paling sederhana MSBuild, jadi kita jawab seperti di screenshot :

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Mari kita pergi ke Visual Studio, yang akan meminta kita memuat ulang solusinya, karena proyek baru telah ditambahkan ke dalamnya. Kami memuat ulang solusinya dan melihat bahwa kami memiliki proyek membangun di mana kami hanya tertarik pada satu file - Bangun.cs

Kami membuat satu proyek plugin dengan kompilasi untuk berbagai versi Revit/AutoCAD

Buka file ini dan tulis skrip untuk membangun proyek untuk semua konfigurasi. Atau gunakan skrip saya, yang dapat Anda edit sesuai kebutuhan 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 jendela PowerShell dan menulis perintah lagi nuklir (Anda dapat menulis perintah nuklir menunjukkan yang diperlukan target. Tapi kami punya satu target, yang berjalan secara default). Setelah menekan tombol Enter, kita akan merasa seperti hacker sungguhan, karena seperti di film, proyek kita akan secara otomatis dirakit untuk konfigurasi yang berbeda.

Omong-omong, Anda bisa menggunakan PowerShell langsung dari Visual Studio (menu "Melihat"->"Jendela lainnya"->"Konsol Manajer Paket"), tetapi semuanya akan berwarna hitam dan putih, yang sangat tidak nyaman.

Ini menyimpulkan artikel saya. Saya yakin Anda dapat mengetahui sendiri opsi untuk AutoCAD. Saya berharap materi yang disajikan di sini dapat menemukan “kliennya”.

Terima kasih!

Sumber: www.habr.com

Tambah komentar