หน้านี้จะกล่าวถึงแนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Bazel บน Windows ดูวิธีการติดตั้งได้ที่ติดตั้ง Bazel ใน Windows
ปัญหาที่ทราบแล้ว
ปัญหาเกี่ยวกับ Bazel ที่เกี่ยวข้องกับ Windows จะมีป้ายกำกับ "team-Windows" ใน GitHub ดูปัญหาที่ยังไม่ได้รับการแก้ไขได้ที่นี่
แนวทางปฏิบัติแนะนำ
หลีกเลี่ยงปัญหาเส้นทางยาว
เครื่องมือบางอย่างมีขีดจำกัดความยาวเส้นทางสูงสุดใน Windows ซึ่งรวมถึงคอมไพเลอร์ MSVC คุณระบุไดเรกทอรีเอาต์พุตแบบสั้นสำหรับ Bazel ได้โดยใช้แฟล็ก --output_user_root เพื่อหลีกเลี่ยงปัญหานี้
ตัวอย่างเช่น ให้เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc:
startup --output_user_root=C:/tmp
เปิดใช้การรองรับชื่อไฟล์ 8.3
บาเซลพยายามสร้างเวอร์ชันชื่อย่อสำหรับเส้นทางไฟล์ที่ยาว แต่หากต้องการเปิดใช้การรองรับชื่อไฟล์ 8.3 จะต้องเปิดใช้งานวอลุ่มที่มีเส้นทางยาวอยู่ด้วย คุณสามารถเปิดใช้การสร้างชื่อ 8.3 ในวอลุ่มทั้งหมดโดยเรียกใช้คำสั่งต่อไปนี้
fsutil 8dot3name set 0
เปิดใช้การสนับสนุน symlink
ฟีเจอร์บางอย่างกำหนดให้ Bazel สร้างลิงก์สัญลักษณ์ของไฟล์ได้ใน Windows ด้วยการเปิดใช้โหมดนักพัฒนาซอฟต์แวร์ (ใน Windows 10 เวอร์ชัน 1703 ขึ้นไป) หรือเรียกใช้ Bazel ในฐานะผู้ดูแลระบบ การดำเนินการนี้จะเปิดใช้ฟีเจอร์ต่อไปนี้
หากต้องการทำให้ง่ายขึ้น ให้เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc:
startup --windows_enable_symlinks
build --enable_runfiles
หมายเหตุ: การสร้างลิงก์สัญลักษณ์ใน Windows เป็นการดำเนินการที่มีค่าใช้จ่ายสูง แฟล็ก --enable_runfiles
อาจสร้างลิงก์สัญลักษณ์ไฟล์จำนวนมาก เปิดใช้ฟีเจอร์นี้เมื่อจำเป็นเท่านั้น
การเรียกใช้ Bazel: เชลล์ MSYS2 กับพรอมต์คำสั่งกับ PowerShell
คำแนะนำ: เรียกใช้ Bazel จาก Command Prompt (cmd.exe
) หรือจาก
PowerShell
ในวันที่ 15-01-2020 อย่าเรียกใช้ Bazel จาก bash
ไม่ว่าจะเป็นจาก MSYS2 Shell, Git Bash, Cygwin หรือตัวแปร Bash อื่นๆ แม้ว่า Bazel อาจทำงานได้กับกรณีการใช้งานส่วนใหญ่ แต่ก็มีบางอย่างขัดข้อง เช่น รบกวนการสร้างด้วย Ctrl+C จาก MSYS2)
นอกจากนี้ หากคุณเลือกที่จะเรียกใช้ภายใต้ MSYS2 คุณจะต้องปิดใช้การแปลงเส้นทางอัตโนมัติของ MSYS2 มิเช่นนั้น MSYS จะแปลงอาร์กิวเมนต์บรรทัดคำสั่งที่ดูเหมือนเส้นทาง Unix (เช่น //foo:bar
) เป็นเส้นทาง Windows ดูรายละเอียดได้ในคำตอบของ StackOverflow นี้
การใช้ Bazel โดยไม่ใช้ Bash (MSYS2)
ใช้บิลด์ Bazel โดยไม่มี Bash
Bazel เวอร์ชันก่อน 1.0 เคยกำหนดให้ Bash ต้องสร้างกฎบางอย่าง
เริ่มต้นด้วย Bazel 1.0 คุณสามารถสร้างกฎโดยไม่ต้องใช้ Bash ได้ ยกเว้นในกรณีต่อไปนี้
genrule
เนื่องจาก Genrules จะเรียกใช้คำสั่ง Bash- กฎ
sh_binary
หรือsh_test
เพราะว่ากฎเหล่านี้ต้องมี Bash โดยพื้นฐานแล้ว - กฎ Starlark ที่ใช้
ctx.actions.run_shell()
หรือctx.resolve_command()
อย่างไรก็ตาม genrule
มักจะใช้สำหรับงานง่ายๆ เช่น การคัดลอกไฟล์หรือการเขียนไฟล์ข้อความ
คุณอาจค้นหากฎที่เหมาะสมในที่เก็บ Bazel-skylib แทนที่จะใช้ genrule
(และขึ้นอยู่กับ Bash)
กฎเหล่านี้ไม่ต้องใช้ Bash เมื่อสร้างบน Windows
การใช้การทดสอบ bazel โดยไม่มี Bash
Bazel เวอร์ชันก่อน 1.0 เคยกำหนดให้ Bash เป็น bazel test
ทุกอย่าง
ตั้งแต่ Bazel 1.0 เป็นต้นไป คุณจะทดสอบกฎใดก็ได้โดยไม่ใช้ Bash ยกเว้นในกรณีต่อไปนี้
- คุณใช้
--run_under
- กฎทดสอบเองต้องใช้ Bash (เนื่องจากไฟล์ปฏิบัติการเป็นสคริปต์ Shell)
ใช้การวิ่งแบบ Bazel โดยไม่มี Bash
Bazel เวอร์ชันก่อน 1.0 เคยกำหนดให้ Bash เป็น bazel run
ทุกอย่าง
เริ่มต้นด้วย Bazel 1.0 คุณสามารถเรียกใช้กฎใดก็ได้โดยไม่ใช้ Bash ยกเว้นในกรณีต่อไปนี้
- คุณใช้
--run_under
หรือ--script_path
- กฎทดสอบเองต้องใช้ Bash (เนื่องจากไฟล์ปฏิบัติการเป็นสคริปต์ Shell)
การใช้กฎ shbinary และ sh* และ ctx.actions.run_shell() โดยไม่มี Bash
คุณต้องใช้ Bash เพื่อสร้างและทดสอบกฎ sh_*
รวมถึงเพื่อสร้างและทดสอบกฎ Starlark ที่ใช้ ctx.actions.run_shell()
และ ctx.resolve_command()
แนวทางนี้ใช้กับกฎในโปรเจ็กต์ของคุณ รวมทั้งกฎในที่เก็บภายนอกที่โปรเจ็กต์ต้องใช้ด้วย (รวมถึงกฎทางอ้อม)
ในอนาคต อาจมีตัวเลือกให้ใช้ระบบย่อยของ Windows สำหรับ Linux (WSL) เพื่อสร้างกฎเหล่านี้ แต่ปัจจุบันกฎดังกล่าวไม่ได้มีความสำคัญเป็นอันดับต้นๆ ของทีมย่อย Bazel-on-Windows
การตั้งค่าตัวแปรสภาพแวดล้อม
ตัวแปรสภาพแวดล้อมที่คุณตั้งค่าไว้ใน Command Prompt (cmd.exe
) ของ Windows จะได้รับการตั้งค่าเฉพาะในเซสชันพรอมต์คำสั่งดังกล่าวเท่านั้น หากขึ้นต้น cmd.exe
ใหม่ คุณจะต้องกำหนดตัวแปรอีกครั้ง หากต้องการตั้งค่าตัวแปรเมื่อ cmd.exe
เริ่มทำงานเสมอ ให้เพิ่มตัวแปรเหล่านี้ลงในตัวแปรผู้ใช้หรือตัวแปรระบบในกล่องโต้ตอบ Control Panel >
System Properties > Advanced > Environment Variables...
สร้างบน Windows
สร้าง C++ ด้วย MSVC
หากต้องการสร้างเป้าหมาย C++ ด้วย MSVC คุณต้องมีสิ่งต่อไปนี้
(ไม่บังคับ) ตัวแปรสภาพแวดล้อม
BAZEL_VC
และBAZEL_VC_FULL_VERSION
Bazel จะตรวจหาคอมไพเลอร์ Visual C++ ในระบบโดยอัตโนมัติ หากต้องการบอกให้ Bazel ใช้การติดตั้ง VC ที่เจาะจง คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมดังต่อไปนี้
สำหรับ Visual Studio 2017 และ 2019 ให้ตั้งค่าเป็น
BAZEL_VC
นอกจากนี้ คุณอาจตั้งค่าBAZEL_VC_FULL_VERSION
ด้วยBAZEL_VC
ไดเรกทอรีการติดตั้งเครื่องมือสร้าง Visual C++set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
BAZEL_VC_FULL_VERSION
(ไม่บังคับ) สำหรับ Visual Studio 2017 และ 2019 เท่านั้นจึงจะเป็นหมายเลขเวอร์ชันเต็มของเครื่องมือสร้าง Visual C++ คุณเลือกเวอร์ชัน Visual C++ Build Tools ที่แน่นอนได้ผ่านBAZEL_VC_FULL_VERSION
หากติดตั้งมากกว่า 1 เวอร์ชัน ไม่เช่นนั้น Bazel จะเลือกเวอร์ชันล่าสุดset BAZEL_VC_FULL_VERSION=14.16.27023
สำหรับ Visual Studio 2015 หรือเก่ากว่า ให้ตั้งค่า
BAZEL_VC
(ไม่รองรับBAZEL_VC_FULL_VERSION
)BAZEL_VC
ไดเรกทอรีการติดตั้งเครื่องมือสร้าง Visual C++set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
-
Windows SDK มีไฟล์ส่วนหัวและไลบรารีที่คุณจำเป็นต้องใช้เมื่อสร้างแอปพลิเคชัน Windows รวมถึง Bazel เอง โดยค่าเริ่มต้น ระบบจะใช้ Windows SDK เวอร์ชันล่าสุดที่ติดตั้ง นอกจากนี้ คุณยังระบุเวอร์ชันของ Windows SDK ได้โดยการตั้งค่า
BAZEL_WINSDK_FULL_VERSION
คุณจะใช้หมายเลข SDK ของ Windows 10 แบบเต็ม เช่น 10.0.10240.0 หรือจะระบุ 8.1 เพื่อใช้ SDK ของ Windows 8.1 ก็ได้ (มี SDK ของ Windows 8.1 ให้บริการเพียงเวอร์ชันเดียวเท่านั้น) โปรดตรวจสอบว่าคุณได้ติดตั้ง Windows SDK ที่ระบุไว้ข้อกำหนด: รองรับ VC 2017 และ 2019 เครื่องมือสร้าง VC 2015 แบบสแตนด์อโลนไม่รองรับการเลือก Windows SDK คุณจะต้องติดตั้ง Visual Studio 2015 อย่างเต็มรูปแบบ มิฉะนั้นระบบจะไม่สนใจ
BAZEL_WINSDK_FULL_VERSION
set BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
หากตั้งค่าทุกอย่างเรียบร้อยแล้ว คุณก็สามารถสร้างเป้าหมาย C++ ได้เลย
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่างใดโปรเจ็กต์หนึ่งของเรา ดังนี้
bazel build //examples/cpp:hello-world
bazel-bin\examples\cpp\hello-world.exe
โดยค่าเริ่มต้น ไบนารีที่สร้างจะกำหนดเป้าหมายเป็นสถาปัตยกรรม x64 หากต้องการระบุสถาปัตยกรรมเป้าหมายอื่น ให้ตั้งค่าตัวเลือกบิลด์ --cpu
สำหรับสถาปัตยกรรมเป้าหมาย ดังนี้
* x64 (ค่าเริ่มต้น): --cpu=x64_windows
หรือไม่มีตัวเลือก
* x86: --cpu=x64_x86_windows
* ARM: --cpu=x64_arm_windows
* ARM64: --cpu=arm64_windows
ตัวอย่างเช่น หากต้องการสร้างเป้าหมายสำหรับสถาปัตยกรรม ARM ให้เรียกใช้คำสั่งต่อไปนี้
bazel build //examples/cpp:hello-world --cpu=x64_arm_windows
หากต้องการสร้างและใช้ไลบรารีที่ลิงก์แบบไดนามิก (ไฟล์ DLL) โปรดดูตัวอย่างนี้
ขีดจำกัดความยาวของบรรทัดคำสั่ง: เพื่อป้องกัน
ปัญหาขีดจำกัดความยาวของบรรทัดคำสั่งของ Windows ให้เปิดใช้ฟีเจอร์ไฟล์พารามิเตอร์ของคอมไพเลอร์ผ่าน --features=compiler_param_file
สร้าง C++ ด้วย Clang
ตั้งแต่เวอร์ชัน 0.29.0 เป็นต้นไป Bazel รองรับการสร้างด้วยไดรเวอร์คอมไพเลอร์ที่เข้ากันได้กับ MSVC ของ LLVM (clang-cl.exe
)
ข้อกำหนด: หากต้องการสร้างด้วย Clang คุณต้องติดตั้งทั้งเครื่องมือ LLVM และ Visual C++ Build เพราะแม้ว่าคุณจะใช้ clang-cl.exe
เป็นคอมไพเลอร์ แต่คุณก็ยังคงต้องลิงก์กับไลบรารี C++ ภาพ
Bazel ตรวจหาการติดตั้ง LLVM ในระบบโดยอัตโนมัติ หรือคุณจะบอก Bazel อย่างชัดแจ้งว่า BAZEL_LLVM
ติดตั้ง LLVM ไว้ที่ใด
BAZEL_LLVM
ไดเรกทอรีการติดตั้ง LLVMset BAZEL_LLVM=C:\Program Files\LLVM
การเปิดใช้เครื่องมือ Clang ในการสร้าง C++ สามารถทำได้หลายกรณี
ใน bazel 0.28 และเก่ากว่า: Clang ไม่ได้รับการสนับสนุน
หากไม่มี
--incompatible_enable_cc_toolchain_resolution
คุณจะเปิดใช้เครื่องมือ Clang ได้ด้วยแฟล็กบิลด์--compiler=clang-cl
ด้วย
--incompatible_enable_cc_toolchain_resolution
: คุณต้องเพิ่มเป้าหมายแพลตฟอร์มไปยังBUILD file
(เช่น ไฟล์BUILD
ระดับบนสุด) ให้ทำดังนี้platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", ], )
จากนั้นคุณสามารถเปิดใช้เครื่องมือ Clang ด้วยวิธีใดวิธีหนึ่งต่อไปนี้
- ระบุแฟล็กบิลด์ต่อไปนี้
--extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
- ลงทะเบียนแพลตฟอร์มและ Toolchain ในไฟล์
WORKSPACE
register_execution_platforms( ":x64_windows-clang-cl" ) register_toolchains( "@local_config_cc//:cc-toolchain-x64_windows-clang-cl", )
เราวางแผนว่าจะเปิดใช้ธง --incompatible_enable_cc_toolchain_resolutionโดยค่าเริ่มต้นในการเปิดตัว Bazel ในอนาคต เราจึงแนะนำให้เปิดใช้การสนับสนุน Clang ด้วยวิธีที่ 2
สร้าง Java
คุณต้องมีสิ่งต่อไปนี้เพื่อสร้างเป้าหมาย Java
ใน Windows Bazel จะสร้างไฟล์เอาต์พุต 2 ไฟล์สำหรับกฎ java_binary
ดังนี้
- ไฟล์
.jar
- ไฟล์
.exe
ที่ตั้งค่าสภาพแวดล้อมสำหรับ JVM และเรียกใช้ไบนารีได้
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่างใดโปรเจ็กต์หนึ่งของเรา ดังนี้
bazel build //examples/java-native/src/main/java/com/example/myproject:hello-world
bazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe
สร้าง Python
หากต้องการสร้างเป้าหมาย Python คุณต้องมีสิ่งต่อไปนี้
ใน Windows Bazel จะสร้างไฟล์เอาต์พุต 2 ไฟล์สำหรับกฎ py_binary
ดังนี้
- ไฟล์ ZIP แบบดึงตัวเอง
- ไฟล์ปฏิบัติการที่สามารถเปิดอินเทอร์พรีเตอร์ Python ที่มีไฟล์ ZIP ที่แยกตัวเองออกมาเป็นอาร์กิวเมนต์
คุณจะเรียกใช้ไฟล์ปฏิบัติการ (ไฟล์มีนามสกุล .exe
) หรือเรียกใช้ Python โดยใช้ไฟล์ ZIP ที่ดึงข้อมูลด้วยตนเองเป็นอาร์กิวเมนต์ได้
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่างใดโปรเจ็กต์หนึ่งของเรา ดังนี้
bazel build //examples/py_native:bin
bazel-bin\examples\py_native\bin.exe
python bazel-bin\examples\py_native\bin.zip
หากสนใจรายละเอียดเกี่ยวกับวิธีที่ Bazel สร้างเป้าหมาย Python บน Windows โปรดดูเอกสารการออกแบบนี้