หน้านี้ครอบคลุมแนวทางปฏิบัติแนะนำสำหรับการใช้ Bazel ใน Windows ดูวิธีการติดตั้งได้ที่หัวข้อติดตั้ง Bazel ใน Windows
ปัญหาที่ทราบ
ปัญหาเกี่ยวกับ Bazel ที่เกี่ยวข้องกับ Windows จะมีป้ายกำกับ "area-Windows" ใน GitHub GitHub-Windows
แนวทางปฏิบัติแนะนำ
หลีกเลี่ยงปัญหาเส้นทางยาว
เครื่องมือบางอย่างมีข้อจำกัดความยาวเส้นทางสูงสุดใน Windows ซึ่งรวมถึงคอมไพเลอร์ MSVC หากต้องการหลีกเลี่ยงปัญหานี้ คุณสามารถระบุไดเรกทอรีเอาต์พุตแบบสั้นสำหรับ Bazel ได้โดยใช้แฟล็ก --output_user_root
ตัวอย่างเช่น เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc
startup --output_user_root=C:/tmp
เปิดใช้การรองรับ Symlink
ฟีเจอร์บางอย่างกำหนดให้ Bazel ต้องสร้าง Symlink ของไฟล์ใน Windows ได้ โดยการเปิดใช้ โหมดนักพัฒนาแอป (ใน Windows 10 เวอร์ชัน 1703 ขึ้นไป) หรือเรียกใช้ Bazel ในฐานะผู้ดูแลระบบ ซึ่งจะเปิดใช้ฟีเจอร์ต่อไปนี้
หากต้องการให้ง่ายขึ้น ให้เพิ่มบรรทัดต่อไปนี้ลงในไฟล์ bazelrc
startup --windows_enable_symlinks
build --enable_runfiles
หมายเหตุ: การสร้างลิงก์สัญลักษณ์ใน Windows เป็นการดำเนินการที่ใช้ทรัพยากรมาก แฟล็ก --enable_runfiles อาจสร้าง Symlink ของไฟล์จำนวนมาก ให้เปิดใช้ฟีเจอร์นี้เฉพาะเมื่อจำเป็นเท่านั้น
การเรียกใช้ Bazel: เชลล์ MSYS2 เทียบกับ Command Prompt เทียบกับ PowerShell
คำแนะนำ: เรียกใช้ Bazel จาก Command Prompt (cmd.exe) หรือจาก PowerShell
ณ วันที่ 15 มกราคม 2020 ห้าม เรียกใช้ Bazel จาก bash ไม่ว่าจะ
จากเชลล์ MSYS2, Git Bash, Cygwin หรือ Bash เวอร์ชันอื่นๆ แม้ว่า Bazel อาจทำงานได้ในกรณีการใช้งานส่วนใหญ่ แต่บางอย่างก็ใช้งานไม่ได้ เช่น การขัดจังหวะบิลด์ด้วย Ctrl+C จาก MSYS2)
นอกจากนี้ หากคุณเลือกที่จะเรียกใช้ภายใต้ MSYS2 คุณต้องปิดใช้การแปลงเส้นทางอัตโนมัติของ MSYS2 ไม่เช่นนั้น MSYS จะแปลงอาร์กิวเมนต์บรรทัดคำสั่งที่ ดูเหมือน เส้นทาง Unix (เช่น //foo:bar) เป็นเส้นทาง Windows ดูรายละเอียดได้จากคำตอบใน StackOverflow นี้
การใช้ Bazel โดยไม่มี Bash (MSYS2)
การใช้ bazel build โดยไม่มี Bash
Bazel เวอร์ชันก่อน 1.0 กำหนดให้ต้องใช้ Bash เพื่อสร้างกฎบางอย่าง
ตั้งแต่ Bazel 1.0 เป็นต้นไป คุณสามารถสร้างกฎใดก็ได้โดยไม่ต้องใช้ Bash ยกเว้นกฎต่อไปนี้
genruleเนื่องจาก genrule จะเรียกใช้คำสั่ง Bash- กฎ
sh_binaryหรือsh_testเนื่องจากกฎเหล่านี้จำเป็นต้องใช้ Bash - กฎ Starlark ที่ใช้
ctx.actions.run_shell()หรือctx.resolve_command()
อย่างไรก็ตาม มักใช้ genrule สำหรับงานง่ายๆ เช่น
การคัดลอกไฟล์
หรือ การเขียนไฟล์ข้อความ
แทนที่จะใช้ genrule (และต้องใช้ Bash) คุณอาจพบกฎที่เหมาะสม
ใน
ที่เก็บ bazel-skylib
กฎเหล่านี้ไม่จำเป็นต้องใช้ Bash เมื่อสร้างใน Windows
การใช้ bazel test โดยไม่มี Bash
Bazel เวอร์ชันก่อน 1.0 กำหนดให้ต้องใช้ Bash เพื่อ bazel test ทุกอย่าง
ตั้งแต่ Bazel 1.0 เป็นต้นไป คุณสามารถทดสอบกฎใดก็ได้โดยไม่ต้องใช้ Bash ยกเว้นในกรณีต่อไปนี้
- คุณใช้
--run_under - กฎการทดสอบเองกำหนดให้ต้องใช้ Bash (เนื่องจากไฟล์ที่เรียกทำงานได้เป็นสคริปต์ของ Shell)
การใช้ bazel run โดยไม่มี 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 Subsystem for Linux (WSL) เพื่อสร้างกฎเหล่านี้ แต่ปัจจุบันยังไม่ใช่ลำดับความสำคัญของทีมย่อย Bazel-on-Windows
การตั้งค่าตัวแปรสภาพแวดล้อม
ตัวแปรสภาพแวดล้อมที่คุณตั้งค่าใน Command Prompt ของ Windows (cmd.exe) จะตั้งค่าในเซสชัน Command Prompt นั้นเท่านั้น หากคุณเริ่ม cmd.exe ใหม่ คุณต้องตั้งค่าตัวแปรอีกครั้ง หากต้องการตั้งค่าตัวแปรทุกครั้งที่ cmd.exe เริ่มทำงาน คุณ
สามารถเพิ่มตัวแปรลงในตัวแปรผู้ใช้หรือตัวแปรระบบในกล่องโต้ตอบ Control Panel >
System Properties > Advanced > Environment Variables...
สร้างบน Windows
สร้าง C++ ด้วย MSVC
หากต้องการสร้างเป้าหมาย C++ ด้วย MSVC คุณต้องมีสิ่งต่อไปนี้
(ไม่บังคับ) ตัวแปรสภาพแวดล้อม
BAZEL_VCและBAZEL_VC_FULL_VERSIONBazel จะตรวจหาคอมไพเลอร์ Visual C++ ในระบบของคุณโดยอัตโนมัติ หากต้องการบอกให้ Bazel ใช้การติดตั้ง VC ที่เฉพาะเจาะจง คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมต่อไปนี้
สำหรับ Visual Studio 2017 และ 2019 ให้ตั้งค่าตัวแปรสภาพแวดล้อม
BAZEL_VCตัวใดตัวหนึ่ง นอกจากนี้ คุณยังตั้งค่าBAZEL_VC_FULL_VERSIONได้ด้วยBAZEL_VCไดเรกทอรีการติดตั้ง Visual C++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VCBAZEL_VC_FULL_VERSION(ไม่บังคับ) เฉพาะสำหรับ Visual Studio 2017 และ 2019 หมายเลขเวอร์ชันเต็มของ Visual C++ Build Tools คุณสามารถเลือกเวอร์ชัน 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++ Build Toolsset BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
The Windows SDK
Windows SDK มีไฟล์ส่วนหัวและไลบรารีที่คุณต้องใช้เมื่อสร้างแอปพลิเคชัน Windows รวมถึง Bazel เอง โดยค่าเริ่มต้น ระบบจะใช้ Windows SDK เวอร์ชันล่าสุดที่ติดตั้ง นอกจากนี้ คุณยังระบุเวอร์ชัน Windows SDK ได้โดยการตั้งค่า
BAZEL_WINSDK_FULL_VERSIONคุณสามารถใช้หมายเลข Windows 10 SDK แบบเต็ม เช่น 10.0.10240.0 หรือระบุ 8.1 เพื่อใช้ Windows 8.1 SDK (มี Windows 8.1 SDK เพียงเวอร์ชันเดียว) โปรดตรวจสอบว่าคุณได้ติดตั้ง Windows SDK ที่ระบุไว้ข้อกำหนด: ระบบรองรับ VC 2017 และ 2019 VC 2015 Build Tools แบบสแตนด์อโลนไม่รองรับการเลือก Windows SDK คุณจะต้องติดตั้ง Visual Studio 2015 แบบเต็ม ไม่เช่นนั้นระบบจะละเว้น
BAZEL_WINSDK_FULL_VERSIONset BAZEL_WINSDK_FULL_VERSION=10.0.10240.0
หากตั้งค่าทุกอย่างเรียบร้อยแล้ว คุณก็สร้างเป้าหมาย C++ ได้เลย
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่าง ของเรา
bazel build //examples/cpp:hello-worldbazel-bin\examples\cpp\hello-world.exe
โดยค่าเริ่มต้น ไบนารีที่สร้างขึ้นจะกำหนดเป้าหมายเป็นสถาปัตยกรรม x64 หากต้องการสร้างสำหรับสถาปัตยกรรม ARM64 ให้ใช้คำสั่งต่อไปนี้
--platforms=//:windows_arm64 --extra_toolchains=@local_config_cc//:cc-toolchain-arm64_windows
คุณสามารถใช้ @local_config_cc ใน MODULE.bazel ด้วยคำสั่งต่อไปนี้
bazel_dep(name = "rules_cc", version = "0.1.1")
cc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension")
use_repo(cc_configure, "local_config_cc")
หากต้องการสร้างและใช้ไลบรารีลิงก์แบบไดนามิก (ไฟล์ DLL) โปรดดู ตัวอย่างนี้
ข้อจำกัดความยาวบรรทัดคำสั่ง: หากต้องการป้องกัน
ปัญหาข้อจำกัดความยาวบรรทัดคำสั่งของ Windows,
ให้เปิดใช้ฟีเจอร์ไฟล์พารามิเตอร์คอมไพเลอร์ผ่าน --features=compiler_param_file
สร้าง C++ ด้วย Clang
ตั้งแต่เวอร์ชัน 0.29.0 เป็นต้นมา Bazel รองรับการสร้างด้วยไดรเวอร์คอมไพเลอร์ที่เข้ากันได้กับ MSVC ของ LLVM (clang-cl.exe)
ข้อกำหนด: หากต้องการสร้างด้วย Clang คุณต้องติดตั้ง ทั้ง
LLVM และ Visual C++ Build Tools
เนื่องจากแม้ว่าคุณจะใช้ clang-cl.exe เป็นคอมไพเลอร์ แต่คุณก็ยังต้องลิงก์กับ
ไลบรารี Visual C++
Bazel สามารถตรวจหาการติดตั้ง LLVM ในระบบของคุณได้โดยอัตโนมัติ หรือคุณสามารถบอก Bazel อย่างชัดเจนว่า LLVM ติดตั้งอยู่ที่ใดโดยใช้ BAZEL_LLVM
BAZEL_LLVMไดเรกทอรีการติดตั้ง LLVMset BAZEL_LLVM=C:\Program Files\LLVM
หากต้องการเปิดใช้ Toolchain ของ Clang การกำหนดค่าจะขึ้นอยู่กับเวอร์ชัน Bazel และคุณกำลังใช้ Bzlmod หรือ WORKSPACE
Bazel 8 ขึ้นไป:
การใช้ Bzlmod (แนะนำ):
ตรวจสอบว่าคุณได้โหลด
rules_ccในMODULE.bazelและกำหนดค่า Toolchain ของ CC แล้ว ดังนี้ ```python bazel_dep(name = "rules_cc", version = "0.0.17") # หรือเวอร์ชันใหม่กว่าcc_configure = use_extension("@rules_cc//cc:extensions.bzl", "cc_configure_extension") use_repo(cc_configure, "local_config_cc") ```
กำหนดเป้าหมาย
platformในไฟล์ BUILD (เช่น ไฟล์ BUILD รูท):python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )เปิดใช้ Toolchain โดยใช้แฟล็กต่อไปนี้:
bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
การใช้ WORKSPACE:
โหลดการขึ้นต่อกันและ Toolchain ของ
rules_ccในไฟล์WORKSPACE:python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()กำหนดเป้าหมาย
platformในไฟล์ BUILD (เช่น ไฟล์ BUILD รูท):python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@bazel_tools//tools/cpp:clang-cl", # Alias to the @rules_cc constraint in Bazel 8+ ], )เปิดใช้ Toolchain โดยใช้แฟล็กต่อไปนี้:
bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
Bazel 7:
หมายเหตุ: ใน Bazel 7 @bazel_tools//tools/cpp:clang-cl ไม่ใช่ ชื่อแทนข้อจำกัด @rules_cc หากต้องการใช้ clang-cl กับ rules_cc ใน Bazel
7 อย่างถูกต้อง คุณต้องอ้างอิงข้อจำกัดภายในที่เก็บ @rules_cc ป้ายกำกับ @rules_cc//cc/private/toolchain:clang-cl เป็นป้ายกำกับส่วนตัวในทางเทคนิค แต่จำเป็นสำหรับการทำงานที่สอดคล้องกันระหว่างการตั้งค่า WORKSPACE และ Bzlmod ใน Bazel 7
การใช้ Bzlmod:
ตั้งค่า
MODULE.bazelตามตัวอย่าง Bazel 8กำหนดเป้าหมาย
platformโดยใช้ข้อจำกัดส่วนตัว@rules_ccดังนี้:python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )เปิดใช้ Toolchain โดยใช้แฟล็กต่อไปนี้:
bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
การใช้ WORKSPACE:
โหลดการขึ้นต่อกันและ Toolchain ของ
rules_ccในไฟล์WORKSPACE:python load("@rules_cc//cc:repositories.bzl", "rules_cc_dependencies", "rules_cc_toolchains") rules_cc_dependencies() rules_cc_toolchains()กำหนดเป้าหมาย
platformโดยใช้ข้อจำกัดส่วนตัว@rules_ccดังนี้:python platform( name = "x64_windows-clang-cl", constraint_values = [ "@platforms//cpu:x86_64", "@platforms//os:windows", "@rules_cc//cc/private/toolchain:clang-cl", # Necessary for Bazel 7 ], )เปิดใช้ Toolchain โดยใช้แฟล็กต่อไปนี้:
bash --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
Bazel 0.29 ถึง 6.x:
เปิดใช้ Toolchain ของ Clang ด้วยแฟล็กการสร้าง
--compiler=clang-clหากบิลด์ของคุณตั้งค่าแฟล็ก --incompatible_enable_cc_toolchain_resolution เป็น
trueให้ใช้วิธีการสำหรับ Bazel 7.0.0
Bazel 0.28 และเวอร์ชันเก่ากว่า:
- ไม่รองรับ Clang
สร้าง Java
หากต้องการสร้างเป้าหมาย Java คุณต้องมีสิ่งต่อไปนี้
ใน Windows, Bazel จะสร้างไฟล์เอาต์พุต 2 ไฟล์สำหรับกฎ java_binary ดังนี้
- ไฟล์
.jar - ไฟล์
.exeที่สามารถตั้งค่าสภาพแวดล้อมสำหรับ JVM และเรียกใช้ไบนารีได้
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่าง ของเรา
bazel build //examples/java-native/src/main/java/com/example/myproject:hello-worldbazel-bin\examples\java-native\src\main\java\com\example\myproject\hello-world.exe
สร้าง Python
หากต้องการสร้างเป้าหมาย Python คุณต้องมีสิ่งต่อไปนี้
- ตัวแปลภาษา Python
ใน Windows, Bazel จะสร้างไฟล์เอาต์พุต 2 ไฟล์สำหรับกฎ py_binary ดังนี้
- ไฟล์ ZIP ที่แตกตัวเองได้
- ไฟล์ที่เรียกทำงานได้ซึ่งสามารถเปิดตัวแปลภาษา Python ด้วยไฟล์ ZIP ที่แตกตัวเองได้เป็นอาร์กิวเมนต์
คุณสามารถเรียกใช้ไฟล์ที่เรียกทำงานได้ (มีนามสกุล .exe) หรือเรียกใช้ Python ด้วยไฟล์ ZIP ที่แตกตัวเองได้เป็นอาร์กิวเมนต์ก็ได้
ลองสร้างเป้าหมายจากโปรเจ็กต์ตัวอย่าง ของเรา
bazel build //examples/py_native:binbazel-bin\examples\py_native\bin.exepython bazel-bin\examples\py_native\bin.zip
หากสนใจดูรายละเอียดเกี่ยวกับวิธีที่ Bazel สร้างเป้าหมาย Python ใน Windows โปรดดูเอกสารการออกแบบ นี้