ในการพัฒนาซอฟต์แวร์ด้วย C# การจัดการเวอร์ชัน (Versioning) ของไฟล์ที่ Build ออกมาเป็นสิ่งสำคัญอย่างยิ่ง โดยเฉพาะเมื่อทีมงานต้องทำการทดสอบ (Testing) ในสภาพแวดล้อมที่แตกต่างกัน การต้องคอยเปลี่ยนชื่อไฟล์ `.exe` ด้วยการเพิ่มหมายเลขเวอร์ชันด้วยมือถือเป็นงานที่น่าเบื่อและเสี่ยงต่อความผิดพลาดสูง
บทความนี้จะแนะนำวิธีการใช้คุณสมบัติของ MSBuild (Microsoft Build Engine) เพื่อให้ระบบสามารถสร้างไฟล์ `.exe` พร้อมแนบหมายเลขเวอร์ชันของ Assembly โดยอัตโนมัติในขั้นตอน Post-Build Event ซึ่งช่วยเพิ่มประสิทธิภาพและความน่าเชื่อถือให้กับกระบวนการ Build ของคุณ
⚙️ หลักการทำงาน: การใช้ MSBuild Targets
หัวใจของการแก้ปัญหานี้คือการเพิ่ม Custom Targets เข้าไปในไฟล์โปรเจกต์ (`.csproj`) โดยเราจะใช้ Target ที่ทำงานหลังจากการ Build หลักเสร็จสิ้น (PostBuild) เพื่อดึงข้อมูลเวอร์ชันของ Assembly ที่ถูกสร้างขึ้นมา แล้วใช้คำสั่งระบบปฏิบัติการ (เช่น `copy` ใน Windows) เพื่อคัดลอกไฟล์และเปลี่ยนชื่อให้มีเวอร์ชันกำกับ
🛠️ ขั้นตอนการติดตั้ง Code
- เปิดไฟล์
.csprojของโปรเจกต์ที่ต้องการแก้ไข - เพิ่มบล็อกโค้ด XML ของ Target เข้าไปในส่วนท้ายของไฟล์ (ก่อนแท็ก
)
โค้ดตัวอย่างที่สมบูรณ์สำหรับการเพิ่ม Versioning:
XML
<Target Name="GetAssemblyVersion" AfterTargets="Build">
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
<Output TaskParameter="Assemblies" ItemName="MyAssemblyIdentities" />
</GetAssemblyIdentity>
<Message Text="[INFO] Assembly Version Detected: %(MyAssemblyIdentities.Version)" />
</Target>
<Target Name="PostBuild" AfterTargets="GetAssemblyVersion">
<Exec Command="copy /Y "$(ProjectDir)$(OutDir)$(TargetName).exe" "$(ProjectDir)$(OutDir)$(TargetName) v.%(MyAssemblyIdentities.Version)_$(ConfigurationName).exe" />
</Target>
</Project>
💡 คำอธิบายโค้ด (Technical Deep Dive)
GetAssemblyIdentity: Target นี้ทำหน้าที่ค้นหาข้อมูลตัวตนของ Assembly ที่ถูกสร้างขึ้นมา โดยดึงค่าเวอร์ชัน (Version) ออกมาเก็บไว้ในตัวแปรMyAssemblyIdentitiesPostBuild: Target นี้จะทำงานหลังจากGetAssemblyVersionเสร็จสิ้น มันใช้คำสั่งExecเพื่อรันคำสั่ง Command Line (ในที่นี้คือcopy)copy /Y ...: คำสั่งนี้จะคัดลอกไฟล์.exeเดิม และเปลี่ยนชื่อไฟล์ปลายทางให้เป็น[ชื่อโปรแกรม] v.[เวอร์ชัน]_[Configuration].exeโดยใช้ตัวแปร%(MyAssemblyIdentities.Version)ที่เราดึงมาได้
✅ สรุปและข้อควรระวัง (Conclusion)
การใช้ MSBuild Targets ในลักษณะนี้เป็นวิธีที่ทรงพลังในการทำให้กระบวนการ Build เป็นไปโดยอัตโนมัติ (Automation) ทำให้มั่นใจได้ว่าทุกครั้งที่ Build ระบบจะสร้างไฟล์ที่ระบุเวอร์ชันอย่างถูกต้องโดยไม่ต้องมีการแทรกแซงด้วยมือ
ข้อควรระวังคือ หากคุณเปลี่ยนชื่อไฟล์ในโค้ดนี้ ต้องแน่ใจว่าพาธ (Path) ของไฟล์ต้นฉบับและปลายทางถูกต้องตามโครงสร้างโปรเจกต์ของคุณเสมอ