- การพัฒนาแบบเนทีฟบน Windows มีความซับซ้อนและไม่มีประสิทธิภาพเพราะ ต้องพึ่งพาการติดตั้ง Visual Studio
- ขนาดติดตั้งหลายสิบ GB, การจัดการคอมโพเนนต์ที่ไม่โปร่งใส, ปัญหาเวอร์ชันไม่ตรงกัน เป็นต้น ล้วนทำให้ประสิทธิภาพการทำงานของนักพัฒนาลดลง
- เพื่อแก้ปัญหานี้ จึงพัฒนาเครื่องมือ CLI แบบน้ำหนักเบา
msvcup ที่สามารถ ติดตั้ง MSVC toolchain และ Windows SDK แบบอัตโนมัติ แยกตามเวอร์ชันและแยกสภาพแวดล้อม
msvcup มอบสภาพแวดล้อมการบิลด์ที่ทำซ้ำได้ผ่าน การพาร์ส JSON manifest, การตั้งค่าสภาพแวดล้อมอัตโนมัติ (autoenv) และ การรองรับ lock file
- แนวทางนี้ทำให้สามารถสร้าง ระบบบิลด์อัตโนมัติเต็มรูปแบบที่อิงสคริปต์ ได้โดยไม่ต้องพึ่ง Visual Studio Installer
ปัญหาของการพัฒนาแบบเนทีฟบน Windows
- วิธีเดิมที่ต้องติดตั้ง Visual Studio สร้างภาระให้กับนักพัฒนา เพราะมี ขั้นตอนติดตั้งที่ซับซ้อนและการจัดการ dependency ที่ไม่เสถียร
- ต้องเลือกอย่างละเอียด เช่น เวิร์กโหลด “Desktop development with C++” หรือเวอร์ชัน SDK เฉพาะ และหากเลือกผิดอาจทำให้บิลด์ล้มเหลว
- ขนาดติดตั้งสูงถึง 50GB และแม้ลบออกแล้วก็ยังมี รายการค้างในรีจิสทรีและบริการเบื้องหลัง เหลืออยู่
- บน Linux สามารถติดตั้ง toolchain ได้ด้วยคำสั่ง package manager เพียงบรรทัดเดียว แต่บน Windows กลับต้องเลือกคอมโพเนนต์หลายพันรายการด้วยตนเอง
- Visual Studio เป็น โครงสร้างแบบรวมศูนย์ที่ผูก editor, compiler และ SDK เข้าด้วยกัน ทำให้จัดการเวอร์ชันและทำสภาพแวดล้อมให้ทำซ้ำได้ยาก
- ผลลัพธ์คือความไม่ตรงกันแบบ “เครื่องฉันใช้ได้” เกิดขึ้นบ่อย และกลายเป็น กำแพงในการเริ่มต้นพัฒนาแบบเนทีฟ
msvcup: แนวทางใหม่
- msvcup เป็นเครื่องมือ CLI โอเพนซอร์สที่ ดาวน์โหลดและติดตั้ง MSVC toolchain และ Windows SDK โดยตรง โดยไม่ต้องติดตั้ง Visual Studio
- แต่ละเวอร์ชันจะถูกติดตั้งใน ไดเรกทอรีแยกกัน ใต้
C:\msvcup\ ทำให้ใช้งานหลายเวอร์ชันคู่ขนานกันได้โดยไม่ชนกัน
- การติดตั้งเสร็จได้ภายใน ไม่กี่นาที และรวมเครื่องมือ cross-compile สำหรับ ARM ให้อัตโนมัติด้วย
- คำสั่ง
msvcup install จะติดตั้งแพ็กเกจที่จำเป็น และคำสั่ง autoenv จะสร้าง ไดเรกทอรีสภาพแวดล้อมอัตโนมัติ
- ในไดเรกทอรีนี้จะมี wrapper executable ที่ตั้งค่า environment variable ให้อัตโนมัติ และไฟล์
toolchain.cmake ทำให้โปรเจกต์ CMake สามารถบิลด์ได้โดยไม่ต้องตั้งค่าเพิ่มเติม
- ในตัวอย่างสคริปต์
build.bat สามารถบิลด์โปรแกรม “Hello, World” ผ่าน msvcup ได้ โดยไม่ต้องใช้ Visual Studio
- ใช้งานได้บน Windows 10 ขึ้นไป หากมีเพียง
curl และ tar
หลักการทำงานภายใน
- พาร์ส JSON manifest ของคอมโพเนนต์ Visual Studio ที่ Microsoft แจกจ่าย เพื่อระบุเฉพาะแพ็กเกจที่จำเป็น
- ดาวน์โหลดเฉพาะองค์ประกอบหลัก เช่น compiler, linker, header และ library จาก Microsoft CDN โดยตรง
- คอมโพเนนต์ที่ติดตั้งแล้วจะถูกจัดการด้วย lock file ทำให้ทั้งทีมสามารถใช้แพ็กเกจเวอร์ชันเดียวกันร่วมกันได้
- คำสั่ง
install และ autoenv มีคุณสมบัติ idempotent คือหากติดตั้งไว้แล้วจะทำงานเสร็จภายในไม่กี่มิลลิวินาที
กรณีใช้งานจริง
- Tuple (แอป pair programming) ได้ผนวก
msvcup เข้ากับระบบบิลด์ CI เพื่อตัดข้อกำหนดการติดตั้ง Visual Studio ล่วงหน้าออกไป
- สามารถบิลด์โปรเจกต์ C/C++ หลายร้อยรายการรวมถึง WebRTC ด้วย toolchain/SDK ชุดเดียวกัน
- รองรับทั้งการบิลด์ x86_64 และ ARM
- ข้อดี
- การติดตั้งแบบแยกไดเรกทอรีตามเวอร์ชัน ทำให้ จัดการหลายเวอร์ชันพร้อมกันและติดตั้งใหม่ได้ง่าย
- รองรับ cross-compile อัตโนมัติ โดยไม่ต้องตั้งค่าเพิ่ม
- รับประกันความสามารถในการทำซ้ำด้วย lock file และรับรู้ได้ทันทีหากฝั่ง Microsoft มีการเปลี่ยนแปลง
- ทำงานได้รวดเร็ว โดยไม่มีการติดตั้งซ้ำที่ไม่จำเป็น
ข้อจำกัดและการต่อยอด
msvcup ถูกออกแบบมาโดยเน้น toolchain สำหรับคอมไพล์ ดังนั้นหากยังต้องใช้ Visual Studio IDE เอง ก็ยังจำเป็นต้องติดตั้งแบบทางการอยู่
- อย่างไรก็ตาม ในเวิร์กโฟลว์การพัฒนาแบบเนทีฟส่วนใหญ่ มันสามารถมอบ สภาพแวดล้อมการบิลด์ที่สมบูรณ์ได้โดยไม่ต้องมี IDE
- ตัวอย่าง สคริปต์บิลด์ raylib ที่นำเสนอ แสดงให้เห็นว่าสามารถติดตั้ง SDK และ toolchain แบบอัตโนมัติและบิลด์โปรเจกต์ได้โดยไม่ต้องใช้ Visual Studio
- ดำเนินกระบวนการบิลด์แบบ อัตโนมัติเต็มรูปแบบผ่านบรรทัดคำสั่ง โดยไม่ต้องมี GUI
บทสรุป
msvcup ช่วยตัดความซับซ้อนของ Visual Studio Installer ออกไป และมอบ สภาพแวดล้อมการบิลด์แบบเนทีฟที่มีน้ำหนักเบาและจัดการเวอร์ชันได้
- แนวทางนี้เปลี่ยนการพัฒนาแบบเนทีฟบน Windows ให้เป็นรูปแบบที่ ทำซ้ำได้และทำงานอัตโนมัติ มากขึ้น ช่วยให้นักพัฒนาหลุดพ้นจากการพึ่งพา IDE
- Repo : https://github.com/marler8997/msvcup
5 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ดูซับซ้อนกว่างานที่ฉันทำอีก
แค่ติดตั้ง LTSC Visual Studio Build Tools แล้วใส่คำสั่งแบบ
cl yourprogram.c /link user32.lib advapi32.lib ...ลงในไฟล์ cmd ก็พอฉันแก้โค้ดด้วย vim และสร้างยูทิลิตีหลายตัวด้วยวิธีนี้มาตลอด
ใน toolchain ของ Visual Studio มีทั้ง LTSC และเวอร์ชันเสถียร แต่คนส่วนใหญ่ไม่ค่อยรู้
ถ้าทำงานร่วมกันเป็นทีม ก็ควรใช้เวอร์ชันคงที่จาก เอกสารประวัติการออกรีลีสอย่างเป็นทางการ
เหมือนสมัยก่อนที่ทั้งบริษัทตรึงใช้ toolchain เวอร์ชันเดียวกันนั่นแหละ
เพราะงั้นนักเรียนหรือนักพัฒนาเล่นๆ หลายคนเลยไม่ค่อยรู้จัก
แต่คนที่ใช้ VS ในบริษัทส่วนใหญ่จะรู้เรื่องนี้
มีใครรู้ไหมว่าจะออกเมื่อไหร่?
toolchain ของ Linux ก็ไม่ได้รอดพ้นจาก dependency hell
ติดตั้งแพ็กเกจ npm แล้วดันต้องใช้ cmake บ้าง, ชนกับเวอร์ชัน glibc บ้าง, หรือเป็นโปรเจ็กต์ C++ ที่ต้องการ boost เวอร์ชันล่าสุด ฯลฯ
ฉันยังจำตอนแพตช์ openSSL ช่วง heartbleed ได้อยู่เลย
Visual Studio ก็ใช้งานลำบาก แต่ขุมนรกจริงๆ คือ ความสับสนเรื่องเวอร์ชัน .NET Framework
แต่ละเวอร์ชันของ Windows มี .NET ที่ติดตั้งมาไม่เหมือนกัน และก็ไม่ชัดเจนว่าแอปจะรันบน runtime ไหน
เพราะงั้นเวลาปล่อยใช้งานวงกว้างก็ต้องทำ shim สำหรับตรวจเวอร์ชัน .NET ด้วย C++ เพื่อให้ไปรันบน runtime ที่ถูกต้อง
ทีม glibc เข้มงวดมากเรื่อง ความเข้ากันได้ย้อนหลังและไปข้างหน้า
ใน บทความของ LWN มีบอกไว้ว่าครั้งล่าสุดที่มีการทำลายความเข้ากันได้คือเมื่อไร
ปัญหาจริงคือคนชอบ pin เวอร์ชัน glibc ผิดๆ
glibc ไม่ควรถูก pin เวอร์ชัน
ส่วน GCC เคยทำลายความเข้ากันได้อยู่บ้าง แต่ส่วนใหญ่เป็นเพราะการเปลี่ยนแปลงของมาตรฐาน C++
.NET Framework เป็นของ legacy ไปแล้ว และหลัง .NET 5 ก็ไม่มีปัญหาแบบนี้
แต่ก็ยังมีแอปจำนวนมากที่พึ่งพาเวอร์ชันเก่าอยู่
มันแก้ปัญหาได้ก็จริง แต่ก็สร้าง ความซับซ้อนแบบใหม่ ขึ้นมาพร้อมกัน
บางทีก็อยากกลับไปยุค system package manager อย่างเดียว
ในสาย embedded ฝั่ง rust + probe-rs ใช้งานสบายกว่ามาก
ตัวติดตั้ง Visual Studio รองรับการติดตั้งแบบไร้ผู้ดูแลผ่าน พารามิเตอร์บรรทัดคำสั่ง
มีอธิบายไว้ในเอกสารทางการ
ตอนปี 2018 ฉันเคยทำงานบนเครือข่ายดาวเทียมที่เน็ตช้า เลยใช้วิธีนี้เพราะต้องสร้างแพ็กเกจติดตั้งแบบออฟไลน์
ดูจากสคริปต์แล้ว
curl -L -o msvcup.zip https://github.com/marler8997/msvcup/releases/...มันเป็นแนวนี้
แต่ฉันไม่ค่อยอยากติดตั้ง ไฟล์ปฏิบัติการจากบัญชี GitHub ที่ไม่รู้ที่มา โดยไม่ตรวจสอบ hash
สถานการณ์บน Windows อาจไม่ได้แย่อย่างที่บล็อกพูด แต่สิ่งนี้ดูไม่ใช่วิธีแก้ปัญหาเท่าไร มันเหมือนสคริปต์ติดตั้งเสี่ยงๆ อีกตัวมากกว่า
แค่อ่านและ ตรวจทานสคริปต์ด้วยตัวเอง ก็พอ
วิธีแบบ curl|sh สุดท้ายก็คือการดาวน์โหลดซอร์สโค้ด ไม่ได้เสี่ยงไปกว่าการติดตั้งไฟล์ปฏิบัติการโดยตรง
โปรเจ็กต์ของเขา zigwin32 ยังถูกลิงก์จาก win32metadata ของ Microsoft ด้วย
พูดอีกแบบคือเป็นคนที่น่าเชื่อถือ
บทความนี้ ให้ความรู้สึกเหมือน AI เขียน
โครงประโยคแบบ “it’s not just X, but Y” หรือรายการเน้นประเด็นต่างๆ เป็นสไตล์ LLM ชัดเจน
เลยสงสัยว่าโปรเจ็กต์นี้มีส่วนที่มนุษย์ทำเองมากแค่ไหน
โครงสร้างรายการดูแปลกและความสม่ำเสมอก็ไม่ค่อยมี
แต่ถ้า LLM เป็นคนเขียนจริง ก็อาจเป็น หลักฐานว่าคุณภาพ LLM ทุกวันนี้ดีขึ้นมาก
หรืออาจเป็นผลจากเครื่องมืออย่าง Grammarly ก็ได้
เพราะมันอ่านง่ายสำหรับผู้อ่าน
เอาจริงๆ แค่อยากให้เปิดเผยไปตรงๆ ว่าใช้ AI หรือเปล่า
ในฐานะความพยายามปรับปรุง DX ของ Visual Studio, msvcup นี่สดใหม่มาก
ถ้าสมัยเรียนมหาวิทยาลัยมีอะไรแบบนี้ก็คงดี
อีกทางเลือกหนึ่งคือ ติดตั้ง Build Tools ลงในคอนเทนเนอร์
ติดตั้งด้วย winget ก็จบแล้ว
winget install --id Microsoft.VisualStudio.2022.BuildToolsถ้าต้องใช้ฟีเจอร์ WinRT ก็เพิ่ม
winget install --id Microsoft.WindowsSDK.10.0.18362winget install --id Microsoft.WindowsAppRuntime.1.8ได้ต้องระบุด้วยว่าจะติดตั้ง workload ไหน และถ้าไม่รู้โปรเจ็กต์ก็ต้องลองผิดลองถูกเยอะ
.vsconfigช่วยได้บ้าง แต่ก็ไม่สมบูรณ์อยากให้โปรเจ็กต์โอเพนซอร์สต่างๆ ไม่กีดกันการรองรับ MinGW
มันเป็นคอมไพเลอร์ที่ดีและทำงานได้เยี่ยมโดยไม่ต้องมี DLL เพิ่ม
ไม่เข้าใจว่าทำไมโอเพนซอร์สถึงต้องบังคับใช้คอมไพเลอร์แบบปิดด้วย
WIL เป็นไลบรารีที่นักพัฒนาเคอร์เนลนิยมใช้ และช่วยเพิ่มทั้งความปลอดภัยของโค้ดกับความสะดวกได้มาก
ตัวอย่างเช่น Steamworks SDK build ด้วย MinGW ได้ แต่พอรันจริงกลับ crash
เสียดายที่แม้แต่ในบล็อกโพสต์นี้ก็ยังไม่พูดถึงเลย
ใช้ Clang + MSVC STL + WinSDK มันสะอาดกว่ามาก
หรือจะทำแบบนี้ง่ายๆ ก็ได้
"winget install Microsoft.VisualStudio.BuildTools""winget install Microsoft.WindowsSDK.10.0.26100"ชอบตรงที่ เสถียรเมื่อเทียบกับความพยายามที่ลงไป
อยากให้ทุกภาษามี เครื่องมือแยกเวอร์ชันแบบ Python uv
เรื่องอย่าง Bing, Copilot หรือโฆษณาก็สมควรถูกวิจารณ์อยู่ แต่ส่วนใหญ่ก็ ปิดได้
ผมก็เจอปัญหา dependency ของ
glibcเหมือนกันตอนบิลด์บน Ubuntu 24.04 แล้วพอจะไปรันบน CentOS 6 หรือ 7ดูเหมือนว่าปัญหาคือมันดึงเวอร์ชัน
glibcของสภาพแวดล้อมที่ใช้บิลด์มาเป็นค่าเริ่มต้นยังไงก็หลีกเลี่ยงการพึ่งพา
glibcไม่ได้ครับ..ถ้าไม่ใช่ภาษาสคริปต์อย่าง python/jv/.net/js ก็เลี่ยงการพึ่งพา
glibcไม่ได้อยู่แล้วและนี่ก็เป็นเหตุผลว่าทำไมถึงต้องแจกจ่ายไลบรารีแยกตามแต่ละดิสโทร
อย่างน้อย ถ้าบิลด์บน
glibcขั้นต่ำมา และไม่มี dependency อื่นเป็นพิเศษ ก็สามารถรันบนดิสโทรเวอร์ชันที่สูงกว่าตัวอื่น ๆ ได้สบายครับบน WSL2 ที่ใช้ Ubuntu ก็ทำให้การพัฒนาบน Windows ดีขึ้นมากเหมือนกันครับ แต่ถ้าเป็นสภาพแวดล้อมของ Visual Studio ไม่ใช่ VS Code ก็ดูเหมือนว่านี่น่าจะพอช่วยได้อยู่บ้างนะครับ แต่ก็เหมือนว่าบน Windows จะใช้แพ็กเกจเมเนเจอร์อย่าง
chocoหรือwingetไม่ได้สินะครับดูเหมือนว่าตัวจัดการแพ็กเกจจะโฟกัสที่ผลลัพธ์สุดท้ายมากกว่า SDK
อย่าง
vcredistเอง นักพัฒนาส่วนใหญ่ก็มักตั้งค่าให้ติดตั้งภายในสคริปต์ของตัวจัดการแพ็กเกจแต่ถ้าเป็นสภาพแวดล้อมสำหรับการบิลด์ก็จะเป็นอีกเรื่องหนึ่ง