Buck2 运行在 Windows 上的一些问题

1. 运行权限问题

当 Buck2 在 Windows 上运行并尝试创建符号链接(symlink)时,可能会出现错误 “A required privilege is not held by the client.”(错误代码1314,意为客户端没有所需的特权)。这个错误表明当前用户帐户缺乏创建符号链接的权限。

解决方法:开启 Windows 开发者模式和修改注册表

启用开发者模式

  1. 打开开发者模式设置: 按下 Win + R,输入命令 ms-settings:developers 并回车,或者通过开始菜单进入 “设置” -> “隐私和安全” -> “针对开发人员”(在部分系统中路径为“更新和安全” -> “针对开发人员”);​
  2. 启用开发者模式: 在开发者设置页面,将 “开发人员模式” 开关切换为打开状态。阅读提示后确认启用。启用后,Windows 会授予当前用户帐户创建符号链接的权限​;

修改注册表

  1. 按下 Win+R 输入 regedit 打开注册表;
  2. 定位:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
  3. 新建 NtfsAllowSymlinkEvaluation 值为 1 ( DWORD值 );

最后重启电脑即可,不重启可能会无法生效,总之重启大法解决一切。

2. Python 环境问题

  1. 测试系统安装 Python 3.13.2 ,并且需要将 Python 的路径添加到环境变量中,执行 Buck2 的 build 命令时不再报找不到 Python 的错误;

3. 编译 Windows 系统 Library 的问题

  1. 编译 Windows0.58.0 版本时,要使用 Rust Nightly 版本进行编译,目前的 Stable 版本会报错;
  2. 需要在 BUCK 中指定 CARGO_MANIFEST_DIR 路径,尝试使用各种相对路径都会报错,使用 . 反而正常编译;
load("@prelude//rust:cargo_package.bzl", "cargo")

cargo.rust_library(
    name = "windows",
    srcs = glob(["src/**/*.rs"]),
    crate = "windows",
    crate_root = "src/lib.rs",
    edition = "2021",
    features = [
        "Win32",
        "Win32_Foundation",
        "Win32_Security",
        "Win32_System",
        "Win32_System_DataExchange",
        "Win32_System_Memory",
        "Win32_System_Threading",
        "Win32_UI",
        "Win32_UI_WindowsAndMessaging",
        "default",
        "std",
    ],
    env = {
        "CARGO_MANIFEST_DIR": ".",
    },
    visibility = ["PUBLIC"],
    deps = [
        "//third-party/rust/crates/windows-core/0.58.0:windows-core",
        "//third-party/rust/crates/windows-targets/0.52.6:windows-targets",
    ],
)