









@@ -389,8 +389,7 @@ function Add-ToUserPath {
389389}
390390391391function Get-PortableGitRoot {
392-$base = Join-Path $env:LOCALAPPDATA "OpenClaw\deps"
393-return (Join-Path $base "portable-git")
392+return (Join-Path (Get-OpenClawDepsRoot) "portable-git")
394393}
395394396395function Get-PortableGitCommandPath {
@@ -414,20 +413,41 @@ function Use-PortableGitIfPresent {
414413return $false
415414 }
416415416+foreach ($pathEntry in (Get-PortableGitPathEntries)) {
417+Add-ToProcessPath $pathEntry
418+ }
419+if (Check-Git) {
420+return $true
421+ }
422+return $false
423+}
424+425+function Get-PortableGitPathEntries {
426+$gitExe = Get-PortableGitCommandPath
427+if (-not $gitExe) {
428+return @()
429+ }
430+417431$portableRoot = Get-PortableGitRoot
418-foreach ($pathEntry in @(
432+$pathEntries = @(
419433 (Join-Path $portableRoot "mingw64\bin"),
420434 (Join-Path $portableRoot "usr\bin"),
421435 (Split-Path -Parent $gitExe)
422- )) {
423-if (Test-Path $pathEntry) {
424-Add-ToProcessPath $pathEntry
436+ )
437+return ($pathEntries | Where-Object { Test-Path $_ } | Select-Object -Unique)
438+}
439+440+function Ensure-PortableGitOnUserPath {
441+$added = @()
442+foreach ($pathEntry in (Get-PortableGitPathEntries)) {
443+if (Add-ToUserPath $pathEntry) {
444+$added += $pathEntry
425445 }
426446 }
427-if (Check-Git) {
428-return $true
447+448+if ($added.Count -gt 0) {
449+Write-Host "[!] Added user-local Git to user PATH (restart terminal if git or git-backed updates are not found)" -ForegroundColor Yellow
429450 }
430-return $false
431451}
432452433453function Resolve-PortableGitDownload {
@@ -458,6 +478,7 @@ function Resolve-PortableGitDownload {
458478459479function Install-PortableGit {
460480if (Use-PortableGitIfPresent) {
481+ Ensure-PortableGitOnUserPath
461482$portableVersion = (& git --version 2>$null)
462483if ($portableVersion) {
463484Write-Host "[OK] User-local Git already available: $portableVersion" -ForegroundColor Green
@@ -499,14 +520,18 @@ function Install-PortableGit {
499520if (-not (Use-PortableGitIfPresent)) {
500521throw "Portable Git bootstrap completed, but git is still unavailable."
501522 }
523+ Ensure-PortableGitOnUserPath
502524503525$portableVersion = (& git --version 2>$null)
504526Write-Host "[OK] User-local Git ready: $portableVersion" -ForegroundColor Green
505527}
506528507529function Ensure-Git {
508530if (Check-Git) { return $true }
509-if (Use-PortableGitIfPresent) { return $true }
531+if (Use-PortableGitIfPresent) {
532+ Ensure-PortableGitOnUserPath
533+return $true
534+ }
510535try {
511536Install-PortableGit
512537if (Check-Git) {
@@ -655,17 +680,81 @@ function Ensure-OpenClawOnPath {
655680return $false
656681}
657682683+function Get-RepoPnpmVersion {
684+param([string]$RepoDir)
685+686+if ([string]::IsNullOrWhiteSpace($RepoDir)) {
687+return $null
688+ }
689+690+$packageJsonPath = Join-Path $RepoDir "package.json"
691+if (-not (Test-Path $packageJsonPath)) {
692+return $null
693+ }
694+695+try {
696+$packageJson = Get-Content -LiteralPath $packageJsonPath -Raw | ConvertFrom-Json
697+if ($packageJson.packageManager -match '^pnpm@(?<version>[^+]+)') {
698+return $Matches["version"]
699+ }
700+if ($packageJson.devEngines -and $packageJson.devEngines.packageManager) {
701+$packageManager = $packageJson.devEngines.packageManager
702+if ($packageManager.name -eq "pnpm" -and -not [string]::IsNullOrWhiteSpace($packageManager.version)) {
703+return $packageManager.version
704+ }
705+ }
706+ } catch {
707+return $null
708+ }
709+710+return $null
711+}
712+713+function Test-PnpmCommandMatchesVersion {
714+param(
715+ [string]$PnpmVersion,
716+ [string]$RepoDir
717+ )
718+719+$pnpmCommand = Get-PnpmCommandPath
720+if (-not $pnpmCommand) {
721+return $false
722+ }
723+if ([string]::IsNullOrWhiteSpace($PnpmVersion)) {
724+return $true
725+ }
726+727+$pushedLocation = $false
728+try {
729+if (-not [string]::IsNullOrWhiteSpace($RepoDir) -and (Test-Path $RepoDir)) {
730+Push-Location -LiteralPath $RepoDir
731+$pushedLocation = $true
732+ }
733+$currentVersion = (& $pnpmCommand --version 2>$null)
734+return ($LASTEXITCODE -eq 0 -and $currentVersion -and $currentVersion.Trim() -eq $PnpmVersion)
735+ } finally {
736+if ($pushedLocation) {
737+Pop-Location
738+ }
739+ }
740+}
741+658742function Ensure-Pnpm {
659-if (Get-PnpmCommandPath) {
743+param([string]$RepoDir)
744+745+$pnpmVersion = Get-RepoPnpmVersion -RepoDir $RepoDir
746+$pnpmSpec = if ([string]::IsNullOrWhiteSpace($pnpmVersion)) { "pnpm@latest" } else { "pnpm@$pnpmVersion" }
747+748+if (Test-PnpmCommandMatchesVersion -PnpmVersion $pnpmVersion -RepoDir $RepoDir) {
660749return
661750 }
662751$corepackCommand = Get-CorepackCommandPath
663752if ($corepackCommand) {
664753try {
665754& $corepackCommand enable | Out-Null
666-& $corepackCommand prepare pnpm@latest --activate | Out-Null
667-if (Get-PnpmCommandPath) {
668-Write-Host "[OK] pnpm installed via corepack" -ForegroundColor Green
755+& $corepackCommand prepare $pnpmSpec --activate | Out-Null
756+if (Test-PnpmCommandMatchesVersion -PnpmVersion $pnpmVersion -RepoDir $RepoDir) {
757+Write-Host "[OK] pnpm installed via corepack ($pnpmSpec)" -ForegroundColor Green
669758return
670759 }
671760 } catch {
@@ -676,10 +765,13 @@ function Ensure-Pnpm {
676765$prevScriptShell = $env:NPM_CONFIG_SCRIPT_SHELL
677766$env:NPM_CONFIG_SCRIPT_SHELL = "cmd.exe"
678767try {
679-& (Get-NpmCommandPath) install -g pnpm
768+& (Get-NpmCommandPath) install -g $pnpmSpec
680769 } finally {
681770$env:NPM_CONFIG_SCRIPT_SHELL = $prevScriptShell
682771 }
772+if (-not (Test-PnpmCommandMatchesVersion -PnpmVersion $pnpmVersion -RepoDir $RepoDir)) {
773+throw "pnpm install completed, but $pnpmSpec is not first on PATH."
774+ }
683775Write-Host "[OK] pnpm installed" -ForegroundColor Green
684776}
685777@@ -821,7 +913,6 @@ function Install-OpenClawFromGit {
821913if (-not (Ensure-Git)) {
822914return $false
823915 }
824- Ensure-Pnpm
825916826917$repoUrl = "https://github.com/openclaw/openclaw.git"
827918Write-Host "[*] Installing OpenClaw from GitHub ($repoUrl)..." -ForegroundColor Yellow
@@ -844,6 +935,7 @@ function Install-OpenClawFromGit {
844935 } else {
845936Write-Host "[!] Git update disabled; skipping git pull" -ForegroundColor Yellow
846937 }
938+ Ensure-Pnpm -RepoDir $RepoDir
847939848940Remove-LegacySubmodule -RepoDir $RepoDir
849941@@ -853,13 +945,19 @@ function Install-OpenClawFromGit {
853945throw "pnpm not found after installation."
854946 }
855947$env:NPM_CONFIG_SCRIPT_SHELL = "cmd.exe"
948+$pushedRepoLocation = $false
856949try {
857-& $pnpmCommand -C $RepoDir install
858-if (-not (& $pnpmCommand -C $RepoDir ui:build)) {
950+Push-Location -LiteralPath $RepoDir
951+$pushedRepoLocation = $true
952+& $pnpmCommand install
953+if (-not (& $pnpmCommand ui:build)) {
859954Write-Host "[!] UI build failed; continuing (CLI may still work)" -ForegroundColor Yellow
860955 }
861-& $pnpmCommand -C $RepoDir build
956+& $pnpmCommand build
862957 } finally {
958+if ($pushedRepoLocation) {
959+Pop-Location
960+ }
863961$env:NPM_CONFIG_SCRIPT_SHELL = $prevPnpmScriptShell
864962 }
865963此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。