|
在 DSH 的 pwsh 里跑正常的构建命令: cmd /c "vcvars64.bat && cmake --build cmake-build-debug --target all -j 30" [0/2] Re-checking globbed directories... -- Running vcpkg install 因为项目中 CMake 用了 file(GLOB_RECURSE ... CONFIGURE_DEPENDS),我这次新增了几个源文件,所以每次 ninja 构建都会触发 cmake 重新配置。而项目是 vcpkg manifest 模式,每次配置都会跑一遍 vcpkg install,哪怕包都装好了,它也要去更新 C:\src\vcpkg\buildtrees\ 下的状态文件 —— 这个目录在 workspace 之外。 DSH 的 pwsh 默认是 workspace-write 沙箱,写不进去。但 vcpkg/cmake 被拒之后不是快速失败,而是卡在那里等,ninja 也一起卡住,上面那个 permission denied 的错误在后台任务里完全看不到,输出全被缓冲吞了。最后我是靠 Get-Process 看 CPU 才定位到是 cmake 卡在重配置。 手动给我这个会话开了 danger-full-access 之后,同一条命令直接跑通,日志长这样: [0/2] Re-checking globbed directories... 我建议沙箱拦截 workspace 之外的写入时,能不能直接给个明确的报错(比如 [sandbox: file access denied])让命令快速失败?现在这种"挂着不动"太误导人了,错误还藏在日志文件里。 |
Replies: 1 comment
|
先说结论:这是策略按设计生效,不是沙箱故障。 可写面到底有哪些 在
为什么后台完全看不到「拒绝」标记 这里有个退出码门槛,值得说清楚。拒绝判定是「退出码非零 且 stderr 命中该后端的拒绝方言」两个条件同时成立:
所以标记不出现,只需要其中一个条件不满足。你这次最直接的一层是:
而且沙箱这一侧不会给你超时兜底: 下次怎么把它变成可见 # 1) 把那次调用的输出完整落盘(拒绝行会被 stderr 带出来)
cmd /c "vcvars64.bat && cmake --build cmake-build-debug --target all -j 30" 2>&1 | Tee-Object build.log
# 2) 或者先把 vcpkg 这一步单独暴露出来,不带 ninja
cmake --preset <你的 preset> # 只 configure,让 vcpkg install 的失败直接冒到前台
# 3) 直接读它自己写的日志
Get-Content cmake-build-debug\vcpkg-manifest-install.log -Tail 40修法(按推荐度)
关于你提的三条建议,我的看法:
一个我们没法验的点:这台机器上没有 vcpkg、没有 cmake 工程,所以「为什么 CMake 是挂住而不是快速失败」这一层我只能给出推测 —— 可能与 如果这条解释解决了你的问题,可以把它标为 answer,方便后面在 DSH 里跑 CMake/vcpkg 构建的人找到。 |
先说结论:这是策略按设计生效,不是沙箱故障。
C:\src\vcpkg\buildtrees这个路径不在本次调用的任何可写面里。可写面到底有哪些
在
workspace-write下只有两处:packages/sandbox/sandbox-local/src/index.ts:395-414的materializeAclGrant,:397派生 SID、:401的grant.add(workspaceRoot, true));:418的mkdtempSync(join(tmpdir(), 'dsh-')),其TMP/TEMP会在 spawn 前被改写到那里。C:\src\vcpkg两处都不在,所以你看到的permission denied是预期结果。这也是为什么手动开danger-full-access后同一条命令直接跑通。为什么后台完全看不到「拒绝」标记
这里有个退出码门槛,值得说清楚。拒绝判定是「退出码非零 且 stderr 命中该后端的拒绝方言」两个条件同时成立:
packages/sandbox/sandbox-local/src/index.ts:205-213,其中'windows-acl'=['access is denied', 'access to the path', 'permission denied', 'operation not pe…