|
|
@@ -110,6 +110,7 @@ export function httpsGet<T = unknown>(
|
|
|
* 获取 Windows 系统最新的 PATH 环境变量
|
|
|
* 安装软件后,系统 PATH 会更新,但当前进程的 PATH 不会自动更新
|
|
|
* 通过 PowerShell 从注册表读取最新的 PATH
|
|
|
+ * 同时添加 pnpm 和 npm 的全局 bin 目录,确保能找到全局安装的命令
|
|
|
*/
|
|
|
async function getRefreshedWindowsPath(): Promise<string> {
|
|
|
try {
|
|
|
@@ -118,10 +119,32 @@ async function getRefreshedWindowsPath(): Promise<string> {
|
|
|
'-Command',
|
|
|
`[Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [Environment]::GetEnvironmentVariable('Path', 'User')`
|
|
|
])
|
|
|
- return result.stdout.trim()
|
|
|
+ let newPath = result.stdout.trim()
|
|
|
+
|
|
|
+ // 添加 pnpm 全局 bin 目录(如果不在 PATH 中)
|
|
|
+ // pnpm 在 Windows 上的默认全局 bin 目录是 %LOCALAPPDATA%\pnpm
|
|
|
+ const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local')
|
|
|
+ const pnpmGlobalBin = path.join(localAppData, 'pnpm')
|
|
|
+ if (!newPath.toLowerCase().includes(pnpmGlobalBin.toLowerCase())) {
|
|
|
+ newPath = `${pnpmGlobalBin};${newPath}`
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加 npm 全局 bin 目录(如果不在 PATH 中)
|
|
|
+ // npm 在 Windows 上的默认全局 bin 目录是 %APPDATA%\npm
|
|
|
+ const appData = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')
|
|
|
+ const npmGlobalBin = path.join(appData, 'npm')
|
|
|
+ if (!newPath.toLowerCase().includes(npmGlobalBin.toLowerCase())) {
|
|
|
+ newPath = `${npmGlobalBin};${newPath}`
|
|
|
+ }
|
|
|
+
|
|
|
+ return newPath
|
|
|
} catch {
|
|
|
- // 如果失败,返回当前进程的 PATH
|
|
|
- return process.env.PATH || ''
|
|
|
+ // 如果失败,返回当前进程的 PATH,并添加常用的全局 bin 目录
|
|
|
+ let fallbackPath = process.env.PATH || ''
|
|
|
+ const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local')
|
|
|
+ const appData = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming')
|
|
|
+ fallbackPath = `${path.join(localAppData, 'pnpm')};${path.join(appData, 'npm')};${fallbackPath}`
|
|
|
+ return fallbackPath
|
|
|
}
|
|
|
}
|
|
|
|