เมื่อพัฒนาปลั๊กอินสำหรับแอปพลิเคชัน CAD (
เมื่อคุณมีปลั๊กอินเพียงตัวเดียวหรือคุณยังเป็นมือใหม่ในเรื่องนี้ คุณสามารถสร้างสำเนาของโปรเจ็กต์ เปลี่ยนตำแหน่งที่จำเป็นในนั้น และประกอบปลั๊กอินเวอร์ชันใหม่ได้ ดังนั้นการเปลี่ยนแปลงรหัสในภายหลังจะทำให้ต้นทุนค่าแรงเพิ่มขึ้นหลายเท่า
เมื่อคุณได้รับประสบการณ์และความรู้ คุณจะพบกับหลายวิธีในการทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ ฉันเดินไปตามเส้นทางนี้และอยากจะบอกคุณว่าฉันได้อะไรมาและสะดวกแค่ไหน
ก่อนอื่นเรามาดูวิธีการที่ชัดเจนและผมใช้มายาวนานกันดีกว่า
ลิงค์ไปยังไฟล์โครงการ
และเพื่อทำให้ทุกอย่างเรียบง่าย เป็นภาพ และเข้าใจได้ ฉันจะอธิบายทุกสิ่งโดยใช้ตัวอย่างเชิงนามธรรมของการพัฒนาปลั๊กอิน
มาเปิด Visual Studio กันเถอะ (ฉันมีเวอร์ชัน Community 2019 และใช่ - เป็นภาษารัสเซีย) และสร้างโซลูชันใหม่ ลองโทรหาเขาสิ MySuperPluginForRevit
เราจะสร้างปลั๊กอินสำหรับ Revit สำหรับเวอร์ชัน 2015-2020 ดังนั้นเรามาสร้างโปรเจ็กต์ใหม่ในโซลูชัน (Net Framework Class Library) แล้วเรียกมันว่า MySuperPluginForRevit_2015
เราจำเป็นต้องเพิ่มลิงก์ไปยัง Revit API แน่นอนว่าเราสามารถเพิ่มลิงก์ไปยังไฟล์ในเครื่องได้ (เราจะต้องติดตั้ง SDK ที่จำเป็นทั้งหมดหรือ Revit ทุกเวอร์ชัน) แต่เราจะปฏิบัติตามเส้นทางที่ถูกต้องทันทีและเชื่อมต่อแพ็คเกจ NuGet คุณสามารถหาแพ็คเกจได้ค่อนข้างน้อย แต่ฉันจะใช้แพ็คเกจของตัวเอง
หลังจากเชื่อมต่อแพ็คเกจแล้วให้คลิกขวาที่รายการ “การอ้างอิง" และเลือกรายการ "ย้าย packages.config ไปที่ PackageReference...»
หากถึงจุดนี้คุณเริ่มตื่นตระหนกเพราะในหน้าต่างคุณสมบัติแพ็คเกจจะไม่มีรายการสำคัญ”คัดลอกในเครื่อง" ซึ่งเราต้องตั้งค่าให้แน่นอน เท็จจากนั้นอย่าตกใจ - ไปที่โฟลเดอร์ที่มีโปรเจ็กต์ เปิดไฟล์ที่มีนามสกุล .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.
โปรดทราบว่าต้องเพิ่มสัญลักษณ์สำหรับทั้งการกำหนดค่า Debug และ Release
ขณะที่เราอยู่ในหน้าต่างคุณสมบัติ เราก็ไปที่แท็บ " ทันทีใบสมัคร"และในสนาม"เนมสเปซเริ่มต้น» ลบส่วนต่อท้าย _2015เพื่อให้เนมสเปซของเราเป็นสากลและเป็นอิสระจากชื่อแอสเซมบลี:
ในกรณีของฉัน ในผลิตภัณฑ์ขั้นสุดท้าย ปลั๊กอินของทุกเวอร์ชันจะถูกรวมไว้ในโฟลเดอร์เดียว ดังนั้นชื่อแอสเซมบลีของฉันจึงยังคงอยู่ที่ส่วนต่อท้ายของแบบฟอร์ม _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 ลบออกจากโครงการใหม่
ไฟล์พร้อมรหัสที่ต้องการ - Class1.cs – เรามีมันอยู่แล้ว และเราเพียงแค่ต้องแทรกลิงก์ไปยังโปรเจ็กต์ใหม่ มีสองวิธีในการแทรกลิงก์:
- ยาว – คลิกขวาที่โครงการแล้วเลือก “เพิ่ม»->«องค์ประกอบที่มีอยู่"ในหน้าต่างที่เปิดขึ้น ให้ค้นหาไฟล์ที่ต้องการและแทนที่จะเลือกตัวเลือก "เพิ่ม" เลือกตัวเลือก "เพิ่มเป็นการเชื่อมต่อ»
- สั้น – โดยตรงในตัวสำรวจโซลูชัน ให้เลือกไฟล์ที่ต้องการ (หรือแม้แต่ไฟล์ หรือแม้แต่ทั้งโฟลเดอร์) แล้วลากไปยังโปรเจ็กต์ใหม่โดยกดปุ่ม Alt ค้างไว้ ขณะที่คุณลาก คุณจะเห็นว่าเมื่อคุณกดปุ่ม Alt เคอร์เซอร์ของเมาส์จะเปลี่ยนจากเครื่องหมายบวกเป็นลูกศร
ยูพีเอส: ฉันสร้างความสับสนเล็กน้อยในย่อหน้านี้ - คุณควรกดค้างไว้เพื่อถ่ายโอนไฟล์หลายไฟล์ Shift + Alt!
หลังจากดำเนินการตามขั้นตอนแล้ว เราจะมีไฟล์ในโครงการที่สอง Class1.cs ด้วยไอคอนที่เกี่ยวข้อง (ลูกศรสีน้ำเงิน):
เมื่อแก้ไขโค้ดในหน้าต่างตัวแก้ไข คุณสามารถเลือกบริบทของโปรเจ็กต์ที่จะแสดงโค้ดได้ ซึ่งจะช่วยให้คุณเห็นโค้ดที่กำลังแก้ไขภายใต้สัญลักษณ์การคอมไพล์ตามเงื่อนไขต่างๆ:
เราสร้างโปรเจ็กต์อื่นๆ ทั้งหมด (2017-2020) โดยใช้โครงร่างนี้ Life Hack - หากคุณลากไฟล์ใน Solution Explorer ไม่ใช่จากโปรเจ็กต์พื้นฐาน แต่จากโปรเจ็กต์ที่มีการแทรกไฟล์เหล่านั้นเป็นลิงก์อยู่แล้ว คุณไม่จำเป็นต้องกดปุ่ม Alt ค้างไว้!
ตัวเลือกที่อธิบายไว้ค่อนข้างดีจนกระทั่งถึงช่วงเวลาของการเพิ่มปลั๊กอินเวอร์ชันใหม่หรือจนกระทั่งถึงช่วงเวลาของการเพิ่มไฟล์ใหม่ในโครงการ - ทั้งหมดนี้น่าเบื่อมาก และเมื่อไม่นานมานี้ จู่ๆ ฉันก็ตระหนักได้ว่าจะต้องจัดการทุกอย่างอย่างไรในโปรเจ็กต์เดียว และเรากำลังดำเนินการไปยังวิธีที่สอง
ความมหัศจรรย์ของการกำหนดค่า
เมื่ออ่านที่นี่จบแล้ว คุณอาจอุทานว่า “ทำไมคุณถึงอธิบายวิธีแรก ในเมื่อบทความนี้พูดถึงวิธีที่สองทันที!” และฉันได้อธิบายทุกอย่างเพื่อให้ชัดเจนยิ่งขึ้นว่าเหตุใดเราจึงต้องมีสัญลักษณ์การคอมไพล์แบบมีเงื่อนไข และจุดใดที่โปรเจ็กต์ของเราแตกต่าง และตอนนี้มันชัดเจนยิ่งขึ้นสำหรับเราว่าโครงการต่างๆ ที่เราจำเป็นต้องดำเนินการมีความแตกต่างกันอย่างไร เหลือเพียงโครงการเดียวเท่านั้น
และเพื่อให้ทุกอย่างชัดเจนยิ่งขึ้น เราจะไม่สร้างโปรเจ็กต์ใหม่ แต่จะทำการเปลี่ยนแปลงโปรเจ็กต์ปัจจุบันของเราที่สร้างขึ้นในวิธีแรก
ก่อนอื่น เราจะลบโปรเจ็กต์ทั้งหมดออกจากโซลูชัน ยกเว้นโปรเจ็กต์หลัก (ที่มีไฟล์โดยตรง) เหล่านั้น. โครงการสำหรับรุ่นปี 2016-2020 เปิดโฟลเดอร์ที่มีวิธีแก้ปัญหาและลบโฟลเดอร์ของโปรเจ็กต์เหล่านี้ที่นั่น
เรามีอีกหนึ่งโครงการที่เหลืออยู่ในการตัดสินใจของเรา - MySuperPluginForRevit_2015. เปิดคุณสมบัติและ:
- บนแท็บ “ใบสมัคร"ลบส่วนต่อท้ายออกจากชื่อชุดประกอบ _2015 (จะชัดเจนว่าทำไมในภายหลัง)
- บนแท็บ “การชุมนุม» ลบสัญลักษณ์การคอมไพล์แบบมีเงื่อนไข R2015 จากสาขาที่เกี่ยวข้อง
หมายเหตุ: Visual Studio เวอร์ชันล่าสุดมีข้อผิดพลาด - สัญลักษณ์การคอมไพล์แบบมีเงื่อนไขจะไม่แสดงในหน้าต่างคุณสมบัติของโปรเจ็กต์ แม้ว่าจะพร้อมใช้งานก็ตาม หากคุณประสบปัญหานี้ คุณจะต้องลบข้อผิดพลาดดังกล่าวออกจากไฟล์ .csproj ด้วยตนเอง อย่างไรก็ตาม เรายังต้องดำเนินการในส่วนนี้ ดังนั้นโปรดอ่านต่อ
เปลี่ยนชื่อโปรเจ็กต์ในหน้าต่าง Solution Explorer โดยการเอาส่วนต่อท้ายออก _2015 จากนั้นลบโปรเจ็กต์ออกจากโซลูชัน นี่เป็นสิ่งจำเป็นเพื่อรักษาความสงบเรียบร้อยและความรู้สึกของผู้ชอบความสมบูรณ์แบบ! เราเปิดโฟลเดอร์ของโซลูชันของเรา เปลี่ยนชื่อโฟลเดอร์โปรเจ็กต์ที่นั่นในลักษณะเดียวกัน และโหลดโปรเจ็กต์กลับเข้าไปในโซลูชัน
เปิดตัวจัดการการกำหนดค่า การกำหนดค่าของสหรัฐอเมริกา ปล่อย โดยหลักการแล้วไม่จำเป็นก็เลยลบทิ้งไป เราสร้างการกำหนดค่าใหม่ด้วยชื่อที่เราคุ้นเคยอยู่แล้ว R2015, R2016, ... , R2020. โปรดทราบว่าคุณไม่จำเป็นต้องคัดลอกการตั้งค่าจากการกำหนดค่าอื่น และคุณไม่จำเป็นต้องสร้างการกำหนดค่าโปรเจ็กต์:
ไปที่โฟลเดอร์ที่มีโปรเจ็กต์และเปิดไฟล์ที่มีนามสกุล .csproj ในตัวแก้ไขที่สะดวกสำหรับคุณ อย่างไรก็ตาม คุณยังสามารถเปิดได้ใน Visual Studio - คุณต้องยกเลิกการโหลดโปรเจ็กต์ จากนั้นรายการที่ต้องการจะอยู่ในเมนูบริบท:
การแก้ไขใน Visual Studio จะดีกว่า เนื่องจากตัวแก้ไขทั้งการจัดแนวและพร้อมท์
ในไฟล์เราจะเห็นองค์ประกอบต่างๆ
ไปที่องค์ประกอบทั่วไป (แรก) กลุ่มอสังหาริมทรัพย์ และดูทรัพย์สิน ชื่อการประกอบ – นี่คือชื่อของสภาและเราควรจะมีโดยไม่ต้องต่อท้าย _2015. ถ้ามีคำต่อท้ายให้ลบออก
การค้นหาองค์ประกอบที่มีเงื่อนไข
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
เราไม่ต้องการมัน - เราลบมัน
องค์ประกอบมีเงื่อนไข
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
จะต้องทำงานในขั้นตอนการพัฒนาโค้ดและการดีบัก คุณสามารถเปลี่ยนคุณสมบัติให้เหมาะกับความต้องการของคุณ - ตั้งค่าเส้นทางเอาต์พุตที่แตกต่างกัน เปลี่ยนสัญลักษณ์การคอมไพล์แบบมีเงื่อนไข ฯลฯ
ตอนนี้เรามาสร้างองค์ประกอบใหม่กันดีกว่า กลุ่มอสังหาริมทรัพย์ สำหรับการกำหนดค่าของเรา ในองค์ประกอบเหล่านี้ เราเพียงแค่ต้องตั้งค่าคุณสมบัติสี่ประการ:
- เส้นทางขาออก – โฟลเดอร์เอาท์พุต ฉันตั้งค่าเริ่มต้น binR20xx
- กำหนดค่าคงที่ – สัญลักษณ์การคอมไพล์แบบมีเงื่อนไข ควรระบุค่า TRACE;R20хх
- TargetFrameworkVersion – เวอร์ชันแพลตฟอร์ม Revit API เวอร์ชันต่างๆ จำเป็นต้องระบุแพลตฟอร์มที่แตกต่างกัน
- ชื่อการประกอบ – ชื่อแอสเซมบลี (เช่น ชื่อไฟล์) คุณสามารถเขียนชื่อแอสเซมบลีที่แน่นอนได้ แต่เพื่อความคล่องตัวฉันแนะนำให้เขียนค่า $(ชื่อการประกอบ)_20хх. เมื่อต้องการทำเช่นนี้ เราได้ลบคำต่อท้ายออกจากชื่อแอสเซมบลีก่อนหน้านี้
คุณสมบัติที่สำคัญที่สุดขององค์ประกอบทั้งหมดเหล่านี้คือสามารถคัดลอกไปยังโปรเจ็กต์อื่น ๆ ได้โดยไม่ต้องเปลี่ยนแปลงเลย ต่อไปในบทความ ฉันจะแนบเนื้อหาทั้งหมดของไฟล์ .csproj
เอาล่ะ เราทราบคุณสมบัติของโครงการแล้ว - ไม่ใช่เรื่องยาก แต่จะทำอย่างไรกับไลบรารีปลั๊กอิน (แพ็คเกจ NuGet) หากเรามองเพิ่มเติม เราจะเห็นว่าไลบรารีที่รวมไว้นั้นถูกระบุไว้ในองค์ประกอบ
องค์ประกอบมาช่วยเรา
การใช้องค์ประกอบ 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 ทั้งหมด“และเราจะได้เห็นว่าแพ็คเกจของเราเปลี่ยนแปลงไปอย่างไร
และในขั้นตอนนี้ฉันก็มาถึงทางตัน - เพื่อรวบรวมการกำหนดค่าทั้งหมดในคราวเดียวเราสามารถใช้ชุดประกอบแบบแบตช์ (เมนู "การชุมนุม»->«สร้างเป็นชุด") แต่เมื่อสลับการกำหนดค่า แพ็คเกจจะไม่ถูกกู้คืนโดยอัตโนมัติ และเมื่อประกอบโครงการสิ่งนี้จะไม่เกิดขึ้นแม้ว่าในทางทฤษฎีแล้วก็ตาม ฉันไม่พบวิธีแก้ไขปัญหานี้โดยใช้วิธีมาตรฐาน และเป็นไปได้มากว่านี่เป็นข้อบกพร่องของ Visual Studio ด้วย
ดังนั้นสำหรับการประกอบแบบเป็นชุดจึงตัดสินใจใช้ระบบการประกอบอัตโนมัติแบบพิเศษ
ไปที่โฟลเดอร์โซลูชันของเรา (ไม่ใช่โครงการ) กดปุ่มค้างไว้ เปลี่ยน และคลิกขวาบนพื้นที่ว่างในโฟลเดอร์ - ในเมนูบริบทเลือกรายการ “เปิดหน้าต่าง PowerShell ที่นี่'
หากคุณไม่ได้ติดตั้งไว้ เรือใต้น้ำปรมาณูจากนั้นจึงเขียนคำสั่งก่อน
dotnet tool install Nuke.GlobalTool –global
ตอนนี้เขียนคำสั่ง เรือใต้น้ำปรมาณู และคุณจะได้รับแจ้งให้กำหนดค่า เรือใต้น้ำปรมาณู สำหรับโครงการปัจจุบัน ฉันไม่รู้วิธีเขียนในภาษารัสเซียให้ถูกต้องกว่านี้ - ในภาษาอังกฤษจะเขียนว่า ไม่พบไฟล์ .nuke คุณต้องการตั้งค่าบิลด์หรือไม่? [มี/ไม่มี]
กดปุ่ม Y จากนั้นจะมีรายการการตั้งค่าโดยตรง เราต้องการตัวเลือกที่ง่ายที่สุดโดยใช้ MSบิลด์ดังนั้นเราจึงตอบตามภาพหน้าจอ:
ไปที่ Visual Studio ซึ่งจะแจ้งให้เราโหลดโซลูชันอีกครั้ง เนื่องจากมีการเพิ่มโปรเจ็กต์ใหม่เข้าไปแล้ว เราโหลดโซลูชันอีกครั้งและพบว่าเรามีโครงการ สร้าง โดยที่เราสนใจไฟล์เดียวเท่านั้น - Build.cs
เปิดไฟล์นี้และเขียนสคริปต์เพื่อสร้างโปรเจ็กต์สำหรับการกำหนดค่าทั้งหมด หรือใช้สคริปต์ของฉันซึ่งคุณสามารถแก้ไขได้เพื่อให้เหมาะกับความต้องการของคุณ:
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