استفاده از Bazel در ویندوز

این صفحه بهترین روش ها برای استفاده از Bazel در ویندوز را پوشش می دهد. برای دستورالعمل‌های نصب، به نصب Bazel در ویندوز مراجعه کنید.

مشکلات شناخته شده

مشکلات Bazel مربوط به ویندوز با برچسب "team-Windows" در GitHub مشخص شده اند. می توانید مسائل باز را اینجا ببینید.

بهترین شیوه ها

از مسائل مسیر طولانی اجتناب کنید

برخی از ابزارها دارای محدودیت حداکثر طول مسیر در ویندوز هستند، از جمله کامپایلر MSVC. برای جلوگیری از برخورد با این مشکل، می توانید یک فهرست خروجی کوتاه برای Bazel با پرچم --output_user_root مشخص کنید.

به عنوان مثال، خط زیر را به فایل bazelrc خود اضافه کنید:

startup --output_user_root=C:/tmp

پشتیبانی از نام فایل 8.3 را فعال کنید

Bazel سعی می کند یک نسخه با نام کوتاه برای مسیرهای فایل طولانی ایجاد کند. اما برای انجام این کار، پشتیبانی از نام فایل 8.3 باید برای حجمی که فایل با مسیر طولانی در آن قرار دارد، فعال شود. با اجرای دستور زیر می توانید ایجاد نام 8.3 را در تمام حجم ها فعال کنید:

fsutil 8dot3name set 0

برخی از ویژگی‌ها به Bazel نیاز دارند که بتواند پیوندهای سمبل فایل را در ویندوز ایجاد کند، یا با فعال کردن Developer Mode (در ویندوز 10 نسخه 1703 یا جدیدتر)، یا با اجرای Bazel به عنوان یک سرپرست. این ویژگی های زیر را فعال می کند:

برای سهولت کار، خطوط زیر را به فایل bazelrc خود اضافه کنید:

startup --windows_enable_symlinks
build --enable_runfiles

توجه : ایجاد پیوندهای نمادین در ویندوز یک عملیات گران است. پرچم --enable_runfiles به طور بالقوه می تواند تعداد زیادی پیوند سمبل فایل ایجاد کند. فقط زمانی که به آن نیاز دارید این ویژگی را فعال کنید.

اجرای Bazel: پوسته MSYS2 در مقابل خط فرمان در مقابل PowerShell

توصیه: Bazel را از خط فرمان ( cmd.exe ) یا از PowerShell اجرا کنید.

از 15/01/2020، Bazel را از bash اجرا نکنید - از پوسته MSYS2، یا Git Bash، یا Cygwin، یا هر گونه دیگر Bash. در حالی که Bazel ممکن است برای بیشتر موارد استفاده کار کند، برخی چیزها خراب هستند، مانند قطع کردن ساخت با Ctrl+C از MSYS2 ). همچنین، اگر انتخاب کنید که تحت MSYS2 اجرا شود، باید تبدیل مسیر خودکار MSYS2 را غیرفعال کنید، در غیر این صورت MSYS آرگومان های خط فرمان را که شبیه مسیرهای یونیکس هستند (مانند //foo:bar ) به مسیرهای ویندوز تبدیل می کند. برای جزئیات بیشتر به این پاسخ StackOverflow مراجعه کنید.

استفاده از Bazel بدون Bash (MSYS2)

استفاده از ساخت بازل بدون Bash

نسخه‌های Bazel قبل از 1.0 به Bash برای ایجاد برخی قوانین نیاز داشتند.

با شروع Bazel 1.0، می‌توانید هر قاعده‌ای را بدون Bash بسازید، مگر اینکه یک قانون زیر باشد:

  • genrule ، زیرا ژانرها دستورات Bash را اجرا می کنند
  • قانون sh_binary یا sh_test ، زیرا اینها ذاتاً به Bash نیاز دارند
  • قانون Starlark که از ctx.actions.run_shell() یا ctx.resolve_command() استفاده می کند

با این حال، genrule اغلب برای کارهای ساده مانند کپی کردن یک فایل یا نوشتن یک فایل متنی استفاده می شود . به جای استفاده از genrule (و بسته به Bash) ممکن است یک قانون مناسب در مخزن bazel-skylib پیدا کنید . وقتی این قوانین بر روی ویندوز ساخته می شوند، نیازی به Bash ندارند .

استفاده از تست بازل بدون Bash

نسخه‌های Bazel قبل از 1.0 به Bash نیاز داشتند تا هر چیزی bazel test کند.

با شروع Bazel 1.0، می‌توانید هر قاعده‌ای را بدون Bash آزمایش کنید، مگر اینکه:

  • شما از --run_under استفاده می کنید
  • خود قانون تست به Bash نیاز دارد (زیرا فایل اجرایی آن یک اسکریپت پوسته است)

استفاده از bazel run بدون Bash

نسخه‌های Bazel قبل از 1.0 به Bash نیاز داشتند تا هر چیزی bazel run کند.

با شروع Bazel 1.0، می توانید هر قانونی را بدون Bash اجرا کنید، به جز موارد:

  • شما از --run_under یا --script_path استفاده می کنید
  • خود قانون تست به Bash نیاز دارد (زیرا فایل اجرایی آن یک اسکریپت پوسته است)

استفاده از قوانین دودویی sh و sh * و ctx.actions.run_shell() بدون Bash

برای ساختن و آزمایش قوانین sh_* و برای ساخت و آزمایش قوانین Starlark که از ctx.actions.run_shell() و ctx.resolve_command() استفاده می کنند، به Bash نیاز دارید. این نه تنها در مورد قوانین پروژه شما اعمال می شود، بلکه در مورد قوانین موجود در هر یک از مخازن خارجی پروژه شما (حتی به صورت گذرا) به آن بستگی دارد.

در آینده، ممکن است گزینه ای برای استفاده از Windows Subsystem for Linux (WSL) برای ایجاد این قوانین وجود داشته باشد، اما در حال حاضر این گزینه برای زیرتیم Bazel-on-Windows در اولویت نیست.

تنظیم متغیرهای محیطی

متغیرهای محیطی که در خط فرمان ویندوز ( cmd.exe ) تنظیم می کنید فقط در آن جلسه خط فرمان تنظیم می شوند. اگر یک cmd.exe جدید راه اندازی می کنید، باید دوباره متغیرها را تنظیم کنید. برای اینکه همیشه متغیرها را هنگام شروع cmd.exe تنظیم کنید، می توانید آنها را به متغیرهای کاربر یا متغیرهای سیستم در کادر گفتگوی Control Panel > System Properties > Advanced > Environment Variables... اضافه کنید.

بر روی ویندوز بسازید

ساخت ++C با MSVC

برای ساخت اهداف C++ با MSVC، شما نیاز دارید:

  • کامپایلر Visual C++ .

  • (اختیاری) متغیر محیطی 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++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC
      
    • BAZEL_VC_FULL_VERSION (اختیاری) فقط برای Visual Studio 2017 و 2019، شماره نسخه کامل Visual C++ Build Tools شما. اگر بیش از یک نسخه نصب شده باشد، می‌توانید نسخه دقیق Visual C++ Build Tools را از طریق BAZEL_VC_FULL_VERSION انتخاب کنید، در غیر این صورت Bazel آخرین نسخه را انتخاب خواهد کرد.

      set BAZEL_VC_FULL_VERSION=14.16.27023
      

    برای Visual Studio 2015 یا بالاتر، BAZEL_VC را تنظیم کنید. ( BAZEL_VC_FULL_VERSION پشتیبانی نمی شود.)

    • BAZEL_VC دایرکتوری نصب Visual C++ Build Tools

      set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
      
  • Windows SDK .

    Windows SDK حاوی فایل‌های هدر و کتابخانه‌هایی است که هنگام ساخت برنامه‌های ویندوز، از جمله خود Bazel، به آنها نیاز دارید. به طور پیش فرض، آخرین SDK ویندوز نصب شده استفاده خواهد شد. همچنین می توانید نسخه SDK ویندوز را با تنظیم BAZEL_WINSDK_FULL_VERSION مشخص کنید. می توانید از یک شماره SDK کامل ویندوز 10 مانند 10.0.10240.0 استفاده کنید، یا 8.1 را برای استفاده از Windows 8.1 SDK تعیین کنید (فقط یک نسخه از Windows 8.1 SDK موجود است). لطفاً مطمئن شوید که 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)، این مثال را ببینید.

محدودیت طول خط فرمان : برای جلوگیری از مشکل محدودیت طول خط فرمان ویندوز ، ویژگی فایل پارامتر کامپایلر را از طریق --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 دایرکتوری نصب LLVM

    set 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
    
    • پلتفرم و زنجیره ابزار را در فایل 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 را با رویکرد دوم فعال کنید.

جاوا بسازید

برای ساخت اهداف جاوا، شما نیاز دارید:

در ویندوز، Bazel دو فایل خروجی برای قوانین 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

پایتون بسازید

برای ساخت اهداف پایتون، شما نیاز دارید:

در ویندوز، Bazel دو فایل خروجی برای قوانین py_binary :

  • یک فایل فشرده خود استخراج
  • یک فایل اجرایی که می تواند مفسر پایتون را با فایل فشرده خود استخراج شونده به عنوان آرگومان راه اندازی کند.

شما می توانید فایل اجرایی را اجرا کنید (این فایل دارای پسوند .exe . است) یا می توانید پایتون را با فایل فشرده خود استخراج شده به عنوان آرگومان اجرا کنید.

سعی کنید از یکی از پروژه های نمونه ما یک هدف بسازید:

  bazel build //examples/py_native:bin
  bazel-bin\examples\py_native\bin.exe
  python bazel-bin\examples\py_native\bin.zip

اگر به جزئیاتی در مورد نحوه ساخت اهداف پایتون روی ویندوز توسط Bazel علاقه مند هستید، این سند طراحی را بررسی کنید.