
























@@ -825,46 +825,69 @@ export function createBundledRuntimeDependencyAliasMap(params: {
825825return aliases;
826826}
827827828+function shouldCleanBundledRuntimeDepsInstallExecutionRoot(params: {
829+installRoot: string;
830+installExecutionRoot: string;
831+}): boolean {
832+const installRoot = path.resolve(params.installRoot);
833+const installExecutionRoot = path.resolve(params.installExecutionRoot);
834+return installExecutionRoot.startsWith(`${installRoot}${path.sep}`);
835+}
836+828837export function installBundledRuntimeDeps(params: {
829838installRoot: string;
830839installExecutionRoot?: string;
831840missingSpecs: string[];
832841env: NodeJS.ProcessEnv;
833842}): void {
834843const installExecutionRoot = params.installExecutionRoot ?? params.installRoot;
835-fs.mkdirSync(params.installRoot, { recursive: true });
836-fs.mkdirSync(installExecutionRoot, { recursive: true });
837-if (path.resolve(installExecutionRoot) !== path.resolve(params.installRoot)) {
838-fs.writeFileSync(
839-path.join(installExecutionRoot, "package.json"),
840-`${JSON.stringify({ name: "openclaw-runtime-deps-install", private: true }, null, 2)}\n`,
841-"utf8",
842-);
843-}
844-const installEnv = createBundledRuntimeDepsInstallEnv(params.env);
845-const npmRunner = resolveBundledRuntimeDepsNpmRunner({
846-env: installEnv,
847-npmArgs: createBundledRuntimeDepsInstallArgs(params.missingSpecs),
848-});
849-const result = spawnSync(npmRunner.command, npmRunner.args, {
850-cwd: installExecutionRoot,
851-encoding: "utf8",
852-env: npmRunner.env ?? installEnv,
853-stdio: "pipe",
854-});
855-if (result.status !== 0 || result.error) {
856-const output = [result.error?.message, result.stderr, result.stdout]
857-.filter(Boolean)
858-.join("\n")
859-.trim();
860-throw new Error(output || "npm install failed");
861-}
862-if (path.resolve(installExecutionRoot) !== path.resolve(params.installRoot)) {
863-const stagedNodeModulesDir = path.join(installExecutionRoot, "node_modules");
864-if (!fs.existsSync(stagedNodeModulesDir)) {
865-throw new Error("npm install did not produce node_modules");
844+const isolatedExecutionRoot =
845+path.resolve(installExecutionRoot) !== path.resolve(params.installRoot);
846+const cleanInstallExecutionRoot =
847+isolatedExecutionRoot &&
848+shouldCleanBundledRuntimeDepsInstallExecutionRoot({
849+installRoot: params.installRoot,
850+ installExecutionRoot,
851+});
852+try {
853+fs.mkdirSync(params.installRoot, { recursive: true });
854+fs.mkdirSync(installExecutionRoot, { recursive: true });
855+if (isolatedExecutionRoot) {
856+fs.writeFileSync(
857+path.join(installExecutionRoot, "package.json"),
858+`${JSON.stringify({ name: "openclaw-runtime-deps-install", private: true }, null, 2)}\n`,
859+"utf8",
860+);
861+}
862+const installEnv = createBundledRuntimeDepsInstallEnv(params.env);
863+const npmRunner = resolveBundledRuntimeDepsNpmRunner({
864+env: installEnv,
865+npmArgs: createBundledRuntimeDepsInstallArgs(params.missingSpecs),
866+});
867+const result = spawnSync(npmRunner.command, npmRunner.args, {
868+cwd: installExecutionRoot,
869+encoding: "utf8",
870+env: npmRunner.env ?? installEnv,
871+stdio: "pipe",
872+});
873+if (result.status !== 0 || result.error) {
874+const output = [result.error?.message, result.stderr, result.stdout]
875+.filter(Boolean)
876+.join("\n")
877+.trim();
878+throw new Error(output || "npm install failed");
879+}
880+if (isolatedExecutionRoot) {
881+const stagedNodeModulesDir = path.join(installExecutionRoot, "node_modules");
882+if (!fs.existsSync(stagedNodeModulesDir)) {
883+throw new Error("npm install did not produce node_modules");
884+}
885+replaceNodeModulesDir(path.join(params.installRoot, "node_modules"), stagedNodeModulesDir);
886+}
887+} finally {
888+if (cleanInstallExecutionRoot) {
889+fs.rmSync(installExecutionRoot, { recursive: true, force: true });
866890}
867-replaceNodeModulesDir(path.join(params.installRoot, "node_modules"), stagedNodeModulesDir);
868891}
869892}
870893此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。