สร้างไฟล์ MSBuild .Targets แบบกำหนดเองโดยทางโปรแกรม

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

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

ฉันมีแนวคิดบางประการเกี่ยวกับวิธีการทำเช่นนี้ แต่ฉันอยากเห็นสิ่งที่คนอื่นคิดไว้ก่อน :-)


person Sameer Singh    schedule 22.11.2010    source แหล่งที่มา


คำตอบ (2)


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

ฉันอาจจินตนาการถึงโซลูชันอัตโนมัติอื่นๆ อีกมากมาย แต่การพิจารณา "เวลาที่ลงทุน"/"เวลาที่ประหยัดได้เนื่องจากระบบอัตโนมัติ" ทำให้จินตนาการของฉันหยุดหลุดลอยไป =)

person alpha-mouse    schedule 22.11.2010
comment
ฉันพบวิธีแก้ปัญหาโดยใช้ PowerShell, Assembly Reflection และ XML ฉันเรียกใช้สคริปต์ PowerShell ในเป้าหมาย AfterBuild ของโปรเจ็กต์ และไฟล์ .Targets ถูกสร้างขึ้นตามที่คาดไว้ สิ่งนี้ไม่ได้ทำให้ฉันรู้สึกว่าเป็นวิธีแก้ปัญหาที่สวยงาม แต่ ... มีความคิดเห็นเกี่ยวกับเรื่องนี้หรือทางเลือกอื่นบ้างไหม? =) - person Sameer Singh; 23.11.2010
comment
คุณสามารถย้าย .Targets ที่คุณสร้างด้วย Powershell และการสะท้อนกลับในเส้นทาง (เครือข่าย) ที่นักพัฒนาคนใดก็ตามสามารถเข้าถึงได้ จากนั้น ในสคริปต์การสร้างโปรเจ็กต์ของคุณ คุณจะอ้างอิงไฟล์ .Targets หลักของคุณเสมอ สำหรับการใช้ Powershell และการสะท้อนกลับ ฟังดูไม่สวยงามสำหรับฉัน คุณอาจใช้ความคิดเห็น xml แทนการสะท้อนกลับ แต่จะต้องดำเนินการเพิ่มเติม - person Benjamin Baumann; 24.11.2010

ฉันพบวิธีที่ดีกว่าในการบรรลุเป้าหมายนี้โดยใช้งาน TaskSchema ของ MSBuild Community Task:

<TaskSchema Assemblies="@(MyTaskAssembly)" 
            OutputPath="%(MyTaskAssembly.RootDir)%(MyTaskAssembly.Directory)" 
            CreateTaskList="true"
            IgnoreMsBuildSchema="true"
            Includes="Microsoft.Build.Commontypes.xsd"/>

ฉันเพียงแค่ตรวจสอบให้แน่ใจว่าฉันได้นำเข้าไฟล์ MSBuild.Community.Tasks.Targets แล้วสร้าง ItemGroup ชื่อ MyTaskAssembly ที่มีแอสเซมบลีงานทั้งหมดของฉัน (ตัวตกใจ) จากนั้นติดการเรียกงานด้านบนในเป้าหมาย AfterBuild ของโครงการของฉัน หวาน! :)

person Sameer Singh    schedule 28.05.2012