เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

เมื่อพัฒนาปลั๊กอินสำหรับแอปพลิเคชัน CAD (ในกรณีของฉัน เหล่านี้คือ AutoCAD, Revit และ Renga) เมื่อเวลาผ่านไปปัญหาหนึ่งปรากฏขึ้น - โปรแกรมเวอร์ชันใหม่เปิดตัว การเปลี่ยนแปลง API และปลั๊กอินเวอร์ชันใหม่จำเป็นต้องทำ

เมื่อคุณมีปลั๊กอินเพียงตัวเดียวหรือคุณยังเป็นมือใหม่ในเรื่องนี้ คุณสามารถสร้างสำเนาของโปรเจ็กต์ เปลี่ยนตำแหน่งที่จำเป็นในนั้น และประกอบปลั๊กอินเวอร์ชันใหม่ได้ ดังนั้นการเปลี่ยนแปลงรหัสในภายหลังจะทำให้ต้นทุนค่าแรงเพิ่มขึ้นหลายเท่า

เมื่อคุณได้รับประสบการณ์และความรู้ คุณจะพบกับหลายวิธีในการทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ ฉันเดินไปตามเส้นทางนี้และอยากจะบอกคุณว่าฉันได้อะไรมาและสะดวกแค่ไหน

ก่อนอื่นเรามาดูวิธีการที่ชัดเจนและผมใช้มายาวนานกันดีกว่า

ลิงค์ไปยังไฟล์โครงการ

และเพื่อทำให้ทุกอย่างเรียบง่าย เป็นภาพ และเข้าใจได้ ฉันจะอธิบายทุกสิ่งโดยใช้ตัวอย่างเชิงนามธรรมของการพัฒนาปลั๊กอิน

มาเปิด Visual Studio กันเถอะ (ฉันมีเวอร์ชัน Community 2019 และใช่ - เป็นภาษารัสเซีย) และสร้างโซลูชันใหม่ ลองโทรหาเขาสิ MySuperPluginForRevit

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

เราจะสร้างปลั๊กอินสำหรับ Revit สำหรับเวอร์ชัน 2015-2020 ดังนั้นเรามาสร้างโปรเจ็กต์ใหม่ในโซลูชัน (Net Framework Class Library) แล้วเรียกมันว่า MySuperPluginForRevit_2015

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

เราจำเป็นต้องเพิ่มลิงก์ไปยัง Revit API แน่นอนว่าเราสามารถเพิ่มลิงก์ไปยังไฟล์ในเครื่องได้ (เราจะต้องติดตั้ง SDK ที่จำเป็นทั้งหมดหรือ Revit ทุกเวอร์ชัน) แต่เราจะปฏิบัติตามเส้นทางที่ถูกต้องทันทีและเชื่อมต่อแพ็คเกจ NuGet คุณสามารถหาแพ็คเกจได้ค่อนข้างน้อย แต่ฉันจะใช้แพ็คเกจของตัวเอง

หลังจากเชื่อมต่อแพ็คเกจแล้วให้คลิกขวาที่รายการ “การอ้างอิง" และเลือกรายการ "ย้าย packages.config ไปที่ PackageReference...»

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

หากถึงจุดนี้คุณเริ่มตื่นตระหนกเพราะในหน้าต่างคุณสมบัติแพ็คเกจจะไม่มีรายการสำคัญ”คัดลอกในเครื่อง" ซึ่งเราต้องตั้งค่าให้แน่นอน เท็จจากนั้นอย่าตกใจ - ไปที่โฟลเดอร์ที่มีโปรเจ็กต์ เปิดไฟล์ที่มีนามสกุล .csproj ในตัวแก้ไขที่สะดวกสำหรับคุณ (ฉันใช้ Notepad++) และค้นหารายการเกี่ยวกับแพ็คเกจของเราที่นั่น ตอนนี้เธอมีลักษณะเช่นนี้:

<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 ที่เรากำลังสร้างปลั๊กอิน เพื่อแก้ไขความแตกต่างในโค้ด เราจะใช้สัญลักษณ์การคอมไพล์แบบมีเงื่อนไข เปิดคุณสมบัติของโครงการ ไปที่แท็บ "การชุมนุม"และในสนาม"สัญกรณ์การรวบรวมแบบมีเงื่อนไข"มาเขียนกันเถอะ R2015.

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

โปรดทราบว่าต้องเพิ่มสัญลักษณ์สำหรับทั้งการกำหนดค่า Debug และ Release

ขณะที่เราอยู่ในหน้าต่างคุณสมบัติ เราก็ไปที่แท็บ " ทันทีใบสมัคร"และในสนาม"เนมสเปซเริ่มต้น» ลบส่วนต่อท้าย _2015เพื่อให้เนมสเปซของเราเป็นสากลและเป็นอิสระจากชื่อแอสเซมบลี:

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

ในกรณีของฉัน ในผลิตภัณฑ์ขั้นสุดท้าย ปลั๊กอินของทุกเวอร์ชันจะถูกรวมไว้ในโฟลเดอร์เดียว ดังนั้นชื่อแอสเซมบลีของฉันจึงยังคงอยู่ที่ส่วนต่อท้ายของแบบฟอร์ม _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;
        }
    }
}

ฉันคำนึงถึง Revit ทุกเวอร์ชันที่สูงกว่าเวอร์ชัน 2015 ทันที (ซึ่งมีให้บริการในขณะที่เขียน) และคำนึงถึงการมีอยู่ของสัญลักษณ์การคอมไพล์แบบมีเงื่อนไขซึ่งสร้างขึ้นโดยใช้เทมเพลตเดียวกันทันที

มาดูไฮไลท์หลักกันดีกว่า เราสร้างโครงการใหม่ในโซลูชันของเราเฉพาะสำหรับเวอร์ชันของปลั๊กอินสำหรับ Revit 2016 เท่านั้น เราทำซ้ำขั้นตอนทั้งหมดที่อธิบายไว้ข้างต้นตามลำดับโดยแทนที่หมายเลข 2015 ด้วยหมายเลข 2016 แต่ไฟล์ Class1.cs ลบออกจากโครงการใหม่

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

ไฟล์พร้อมรหัสที่ต้องการ - Class1.cs – เรามีมันอยู่แล้ว และเราเพียงแค่ต้องแทรกลิงก์ไปยังโปรเจ็กต์ใหม่ มีสองวิธีในการแทรกลิงก์:

  1. ยาว – คลิกขวาที่โครงการแล้วเลือก “เพิ่ม»->«องค์ประกอบที่มีอยู่"ในหน้าต่างที่เปิดขึ้น ให้ค้นหาไฟล์ที่ต้องการและแทนที่จะเลือกตัวเลือก "เพิ่ม" เลือกตัวเลือก "เพิ่มเป็นการเชื่อมต่อ»

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

  1. สั้น – โดยตรงในตัวสำรวจโซลูชัน ให้เลือกไฟล์ที่ต้องการ (หรือแม้แต่ไฟล์ หรือแม้แต่ทั้งโฟลเดอร์) แล้วลากไปยังโปรเจ็กต์ใหม่โดยกดปุ่ม Alt ค้างไว้ ขณะที่คุณลาก คุณจะเห็นว่าเมื่อคุณกดปุ่ม Alt เคอร์เซอร์ของเมาส์จะเปลี่ยนจากเครื่องหมายบวกเป็นลูกศร
    ยูพีเอส: ฉันสร้างความสับสนเล็กน้อยในย่อหน้านี้ - คุณควรกดค้างไว้เพื่อถ่ายโอนไฟล์หลายไฟล์ Shift + Alt!

หลังจากดำเนินการตามขั้นตอนแล้ว เราจะมีไฟล์ในโครงการที่สอง Class1.cs ด้วยไอคอนที่เกี่ยวข้อง (ลูกศรสีน้ำเงิน):

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

เมื่อแก้ไขโค้ดในหน้าต่างตัวแก้ไข คุณสามารถเลือกบริบทของโปรเจ็กต์ที่จะแสดงโค้ดได้ ซึ่งจะช่วยให้คุณเห็นโค้ดที่กำลังแก้ไขภายใต้สัญลักษณ์การคอมไพล์ตามเงื่อนไขต่างๆ:

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

เราสร้างโปรเจ็กต์อื่นๆ ทั้งหมด (2017-2020) โดยใช้โครงร่างนี้ Life Hack - หากคุณลากไฟล์ใน Solution Explorer ไม่ใช่จากโปรเจ็กต์พื้นฐาน แต่จากโปรเจ็กต์ที่มีการแทรกไฟล์เหล่านั้นเป็นลิงก์อยู่แล้ว คุณไม่จำเป็นต้องกดปุ่ม Alt ค้างไว้!

ตัวเลือกที่อธิบายไว้ค่อนข้างดีจนกระทั่งถึงช่วงเวลาของการเพิ่มปลั๊กอินเวอร์ชันใหม่หรือจนกระทั่งถึงช่วงเวลาของการเพิ่มไฟล์ใหม่ในโครงการ - ทั้งหมดนี้น่าเบื่อมาก และเมื่อไม่นานมานี้ จู่ๆ ฉันก็ตระหนักได้ว่าจะต้องจัดการทุกอย่างอย่างไรในโปรเจ็กต์เดียว และเรากำลังดำเนินการไปยังวิธีที่สอง

ความมหัศจรรย์ของการกำหนดค่า

เมื่ออ่านที่นี่จบแล้ว คุณอาจอุทานว่า “ทำไมคุณถึงอธิบายวิธีแรก ในเมื่อบทความนี้พูดถึงวิธีที่สองทันที!” และฉันได้อธิบายทุกอย่างเพื่อให้ชัดเจนยิ่งขึ้นว่าเหตุใดเราจึงต้องมีสัญลักษณ์การคอมไพล์แบบมีเงื่อนไข และจุดใดที่โปรเจ็กต์ของเราแตกต่าง และตอนนี้มันชัดเจนยิ่งขึ้นสำหรับเราว่าโครงการต่างๆ ที่เราจำเป็นต้องดำเนินการมีความแตกต่างกันอย่างไร เหลือเพียงโครงการเดียวเท่านั้น

และเพื่อให้ทุกอย่างชัดเจนยิ่งขึ้น เราจะไม่สร้างโปรเจ็กต์ใหม่ แต่จะทำการเปลี่ยนแปลงโปรเจ็กต์ปัจจุบันของเราที่สร้างขึ้นในวิธีแรก

ก่อนอื่น เราจะลบโปรเจ็กต์ทั้งหมดออกจากโซลูชัน ยกเว้นโปรเจ็กต์หลัก (ที่มีไฟล์โดยตรง) เหล่านั้น. โครงการสำหรับรุ่นปี 2016-2020 เปิดโฟลเดอร์ที่มีวิธีแก้ปัญหาและลบโฟลเดอร์ของโปรเจ็กต์เหล่านี้ที่นั่น

เรามีอีกหนึ่งโครงการที่เหลืออยู่ในการตัดสินใจของเรา - MySuperPluginForRevit_2015. เปิดคุณสมบัติและ:

  1. บนแท็บ “ใบสมัคร"ลบส่วนต่อท้ายออกจากชื่อชุดประกอบ _2015 (จะชัดเจนว่าทำไมในภายหลัง)
  2. บนแท็บ “การชุมนุม» ลบสัญลักษณ์การคอมไพล์แบบมีเงื่อนไข R2015 จากสาขาที่เกี่ยวข้อง

หมายเหตุ: Visual Studio เวอร์ชันล่าสุดมีข้อผิดพลาด - สัญลักษณ์การคอมไพล์แบบมีเงื่อนไขจะไม่แสดงในหน้าต่างคุณสมบัติของโปรเจ็กต์ แม้ว่าจะพร้อมใช้งานก็ตาม หากคุณประสบปัญหานี้ คุณจะต้องลบข้อผิดพลาดดังกล่าวออกจากไฟล์ .csproj ด้วยตนเอง อย่างไรก็ตาม เรายังต้องดำเนินการในส่วนนี้ ดังนั้นโปรดอ่านต่อ

เปลี่ยนชื่อโปรเจ็กต์ในหน้าต่าง Solution Explorer โดยการเอาส่วนต่อท้ายออก _2015 จากนั้นลบโปรเจ็กต์ออกจากโซลูชัน นี่เป็นสิ่งจำเป็นเพื่อรักษาความสงบเรียบร้อยและความรู้สึกของผู้ชอบความสมบูรณ์แบบ! เราเปิดโฟลเดอร์ของโซลูชันของเรา เปลี่ยนชื่อโฟลเดอร์โปรเจ็กต์ที่นั่นในลักษณะเดียวกัน และโหลดโปรเจ็กต์กลับเข้าไปในโซลูชัน

เปิดตัวจัดการการกำหนดค่า การกำหนดค่าของสหรัฐอเมริกา ปล่อย โดยหลักการแล้วไม่จำเป็นก็เลยลบทิ้งไป เราสร้างการกำหนดค่าใหม่ด้วยชื่อที่เราคุ้นเคยอยู่แล้ว R2015, R2016, ... , R2020. โปรดทราบว่าคุณไม่จำเป็นต้องคัดลอกการตั้งค่าจากการกำหนดค่าอื่น และคุณไม่จำเป็นต้องสร้างการกำหนดค่าโปรเจ็กต์:

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

ไปที่โฟลเดอร์ที่มีโปรเจ็กต์และเปิดไฟล์ที่มีนามสกุล .csproj ในตัวแก้ไขที่สะดวกสำหรับคุณ อย่างไรก็ตาม คุณยังสามารถเปิดได้ใน Visual Studio - คุณต้องยกเลิกการโหลดโปรเจ็กต์ จากนั้นรายการที่ต้องการจะอยู่ในเมนูบริบท:

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

การแก้ไขใน Visual Studio จะดีกว่า เนื่องจากตัวแก้ไขทั้งการจัดแนวและพร้อมท์

ในไฟล์เราจะเห็นองค์ประกอบต่างๆ กลุ่มอสังหาริมทรัพย์ – ที่ด้านบนสุดคือรายการทั่วไป และจากนั้นก็มาถึงเงื่อนไข องค์ประกอบเหล่านี้กำหนดคุณสมบัติของโครงการเมื่อมีการสร้าง องค์ประกอบแรกซึ่งไม่มีเงื่อนไข จะตั้งค่าคุณสมบัติทั่วไป และองค์ประกอบที่มีเงื่อนไขจะเปลี่ยนคุณสมบัติบางอย่างตามการกำหนดค่า

ไปที่องค์ประกอบทั่วไป (แรก) กลุ่มอสังหาริมทรัพย์ และดูทรัพย์สิน ชื่อการประกอบ – นี่คือชื่อของสภาและเราควรจะมีโดยไม่ต้องต่อท้าย _2015. ถ้ามีคำต่อท้ายให้ลบออก

การค้นหาองค์ประกอบที่มีเงื่อนไข

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

เราไม่ต้องการมัน - เราลบมัน

องค์ประกอบมีเงื่อนไข

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

จะต้องทำงานในขั้นตอนการพัฒนาโค้ดและการดีบัก คุณสามารถเปลี่ยนคุณสมบัติให้เหมาะกับความต้องการของคุณ - ตั้งค่าเส้นทางเอาต์พุตที่แตกต่างกัน เปลี่ยนสัญลักษณ์การคอมไพล์แบบมีเงื่อนไข ฯลฯ

ตอนนี้เรามาสร้างองค์ประกอบใหม่กันดีกว่า กลุ่มอสังหาริมทรัพย์ สำหรับการกำหนดค่าของเรา ในองค์ประกอบเหล่านี้ เราเพียงแค่ต้องตั้งค่าคุณสมบัติสี่ประการ:

  • เส้นทางขาออก – โฟลเดอร์เอาท์พุต ฉันตั้งค่าเริ่มต้น binR20xx
  • กำหนดค่าคงที่ – สัญลักษณ์การคอมไพล์แบบมีเงื่อนไข ควรระบุค่า TRACE;R20хх
  • TargetFrameworkVersion – เวอร์ชันแพลตฟอร์ม Revit API เวอร์ชันต่างๆ จำเป็นต้องระบุแพลตฟอร์มที่แตกต่างกัน
  • ชื่อการประกอบ – ชื่อแอสเซมบลี (เช่น ชื่อไฟล์) คุณสามารถเขียนชื่อแอสเซมบลีที่แน่นอนได้ แต่เพื่อความคล่องตัวฉันแนะนำให้เขียนค่า $(ชื่อการประกอบ)_20хх. เมื่อต้องการทำเช่นนี้ เราได้ลบคำต่อท้ายออกจากชื่อแอสเซมบลีก่อนหน้านี้

คุณสมบัติที่สำคัญที่สุดขององค์ประกอบทั้งหมดเหล่านี้คือสามารถคัดลอกไปยังโปรเจ็กต์อื่น ๆ ได้โดยไม่ต้องเปลี่ยนแปลงเลย ต่อไปในบทความ ฉันจะแนบเนื้อหาทั้งหมดของไฟล์ .csproj

เอาล่ะ เราทราบคุณสมบัติของโครงการแล้ว - ไม่ใช่เรื่องยาก แต่จะทำอย่างไรกับไลบรารีปลั๊กอิน (แพ็คเกจ NuGet) หากเรามองเพิ่มเติม เราจะเห็นว่าไลบรารีที่รวมไว้นั้นถูกระบุไว้ในองค์ประกอบ กลุ่มรายการ. แต่โชคร้าย - องค์ประกอบนี้ประมวลผลเงื่อนไขในฐานะองค์ประกอบอย่างไม่ถูกต้อง กลุ่มอสังหาริมทรัพย์. บางทีนี่อาจเป็นความผิดพลาดของ Visual Studio แต่ถ้าคุณระบุองค์ประกอบหลายอย่าง กลุ่มรายการ ด้วยเงื่อนไขการกำหนดค่า และแทรกลิงก์ต่างๆ ไปยังแพ็คเกจ NuGet ภายใน จากนั้นเมื่อคุณเปลี่ยนการกำหนดค่า แพ็คเกจที่ระบุทั้งหมดจะเชื่อมต่อกับโปรเจ็กต์

องค์ประกอบมาช่วยเรา Chooseซึ่งทำงานตามตรรกะปกติของเรา ถ้า - แล้ว - อื่น.

การใช้องค์ประกอบ Chooseเราตั้งค่าแพ็คเกจ 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>

โปรดทราบว่าในเงื่อนไขข้อใดข้อหนึ่ง ฉันระบุการกำหนดค่าสองรายการผ่าน หรือ. วิธีนี้จะทำให้แพ็คเกจที่จำเป็นเชื่อมต่อระหว่างการกำหนดค่า การแก้ปัญหา.

และที่นี่เรามีเกือบทุกอย่างที่สมบูรณ์แบบ เราโหลดโปรเจ็กต์กลับ เปิดใช้งานการกำหนดค่าที่เราต้องการ เรียกรายการ “ ในเมนูบริบทของโซลูชัน (ไม่ใช่โปรเจ็กต์)กู้คืนแพ็คเกจ NuGet ทั้งหมด“และเราจะได้เห็นว่าแพ็คเกจของเราเปลี่ยนแปลงไปอย่างไร

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

และในขั้นตอนนี้ฉันก็มาถึงทางตัน - เพื่อรวบรวมการกำหนดค่าทั้งหมดในคราวเดียวเราสามารถใช้ชุดประกอบแบบแบตช์ (เมนู "การชุมนุม»->«สร้างเป็นชุด") แต่เมื่อสลับการกำหนดค่า แพ็คเกจจะไม่ถูกกู้คืนโดยอัตโนมัติ และเมื่อประกอบโครงการสิ่งนี้จะไม่เกิดขึ้นแม้ว่าในทางทฤษฎีแล้วก็ตาม ฉันไม่พบวิธีแก้ไขปัญหานี้โดยใช้วิธีมาตรฐาน และเป็นไปได้มากว่านี่เป็นข้อบกพร่องของ Visual Studio ด้วย

ดังนั้นสำหรับการประกอบแบบเป็นชุดจึงตัดสินใจใช้ระบบการประกอบอัตโนมัติแบบพิเศษ เรือใต้น้ำปรมาณู. จริงๆ แล้วฉันไม่ต้องการสิ่งนี้เพราะฉันคิดว่ามันเกินความจำเป็นในแง่ของการพัฒนาปลั๊กอิน แต่ในขณะนี้ ฉันไม่เห็นวิธีแก้ปัญหาอื่นใด และสำหรับคำถามที่ว่า “ทำไมต้อง Nuke?” คำตอบนั้นง่ายมาก - เราใช้มันในที่ทำงาน

ไปที่โฟลเดอร์โซลูชันของเรา (ไม่ใช่โครงการ) กดปุ่มค้างไว้ เปลี่ยน และคลิกขวาบนพื้นที่ว่างในโฟลเดอร์ - ในเมนูบริบทเลือกรายการ “เปิดหน้าต่าง PowerShell ที่นี่'

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

หากคุณไม่ได้ติดตั้งไว้ เรือใต้น้ำปรมาณูจากนั้นจึงเขียนคำสั่งก่อน

dotnet tool install Nuke.GlobalTool –global

ตอนนี้เขียนคำสั่ง เรือใต้น้ำปรมาณู และคุณจะได้รับแจ้งให้กำหนดค่า เรือใต้น้ำปรมาณู สำหรับโครงการปัจจุบัน ฉันไม่รู้วิธีเขียนในภาษารัสเซียให้ถูกต้องกว่านี้ - ในภาษาอังกฤษจะเขียนว่า ไม่พบไฟล์ .nuke คุณต้องการตั้งค่าบิลด์หรือไม่? [มี/ไม่มี]

กดปุ่ม Y จากนั้นจะมีรายการการตั้งค่าโดยตรง เราต้องการตัวเลือกที่ง่ายที่สุดโดยใช้ MSบิลด์ดังนั้นเราจึงตอบตามภาพหน้าจอ:

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

ไปที่ Visual Studio ซึ่งจะแจ้งให้เราโหลดโซลูชันอีกครั้ง เนื่องจากมีการเพิ่มโปรเจ็กต์ใหม่เข้าไปแล้ว เราโหลดโซลูชันอีกครั้งและพบว่าเรามีโครงการ สร้าง โดยที่เราสนใจไฟล์เดียวเท่านั้น - Build.cs

เราสร้างโปรเจ็กต์ปลั๊กอินหนึ่งโปรเจ็กต์พร้อมการคอมไพล์สำหรับ Revit/AutoCAD เวอร์ชันต่างๆ

เปิดไฟล์นี้และเขียนสคริปต์เพื่อสร้างโปรเจ็กต์สำหรับการกำหนดค่าทั้งหมด หรือใช้สคริปต์ของฉันซึ่งคุณสามารถแก้ไขได้เพื่อให้เหมาะกับความต้องการของคุณ:

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 แล้วเขียนคำสั่งอีกครั้ง เรือใต้น้ำปรมาณู (คุณสามารถเขียนคำสั่ง เรือใต้น้ำปรมาณู บ่งบอกถึงความจำเป็น เป้า. แต่เรามีอันหนึ่ง เป้าซึ่งทำงานตามค่าเริ่มต้น) หลังจากกดปุ่ม Enter เราจะรู้สึกเหมือนเป็นแฮกเกอร์ตัวจริง เพราะโปรเจ็กต์ของเราจะถูกรวบรวมโดยอัตโนมัติสำหรับการกำหนดค่าต่างๆ เช่นเดียวกับในภาพยนตร์

อย่างไรก็ตามคุณสามารถใช้ PowerShell ได้โดยตรงจาก Visual Studio (เมนู "ดู»->«หน้าต่างอื่นๆ»->«คอนโซลตัวจัดการแพ็คเกจ") แต่ทุกอย่างจะเป็นขาวดำซึ่งไม่สะดวกนัก

นี่เป็นการสรุปบทความของฉัน ฉันแน่ใจว่าคุณสามารถหาตัวเลือกสำหรับ AutoCAD ได้ด้วยตัวเอง ฉันหวังว่าเนื้อหาที่นำเสนอนี้จะพบ "ลูกค้า" ของมัน

ขอบคุณ!

ที่มา: will.com

เพิ่มความคิดเห็น