หน้านี้จะกล่าวถึงแนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Bazel บน Windows สำหรับติดตั้ง โปรดดูวิธีการที่หัวข้อติดตั้ง Bazel ใน Windows
ปัญหาที่ทราบ
ปัญหาเกี่ยวกับ Bazel ที่เกี่ยวข้องกับ Windows จะมีคำว่า "ทีม 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
อาจใช้ได้กับ Use Case ส่วนใหญ่ และมีฟีเจอร์บางอย่างเสีย เช่น
รบกวนบิลด์ด้วย 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
มักจะใช้สำหรับงานง่ายๆ เช่น
การคัดลอกไฟล์
หรือการเขียนไฟล์ข้อความ
คุณอาจเห็นกฎที่เหมาะสมแทนที่จะใช้ genrule
(และขึ้นอยู่กับ Bash)
ในช่วง
ที่เก็บของ bazel-skylib
กฎเหล่านี้ไม่ต้องใช้ 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)
การใช้กฎ sh_binary และ 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++ คุณสามารถเลือกเครื่องมือสร้าง C++ แบบภาพที่ต้องการได้ เวอร์ชันผ่าน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 เพื่อใช้ Windows 8.1 ได้ SDK (มี 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
* กลุ่ม: --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++ เครื่องมือสร้าง,
เพราะแม้ว่าคุณจะใช้ clang-cl.exe
เป็นคอมไพเลอร์ คุณยังคงต้องลิงก์กับ
ไลบรารี Visual C++
Bazel สามารถตรวจพบการติดตั้ง LLVM บนระบบของคุณโดยอัตโนมัติ หรือคุณสามารถบอก
Bazel ที่ติดตั้ง LLVM โดย BAZEL_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 ในไฟล์
MODULE.bazel
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 โปรดดูการออกแบบนี้ เอกสาร