|
|
@@ -1078,8 +1078,42 @@ export async function installAll(options: InstallOptions, onStatus: StatusCallba
|
|
|
// 使用完整路径,避免 PATH 未生效的问题
|
|
|
// 检测是否已安装 pnpm,优先使用 pnpm
|
|
|
const hasPnpm = await commandExistsWithRefresh('pnpm')
|
|
|
- const pkgManager = hasPnpm ? getPnpmPath() : getNpmPath()
|
|
|
- await executeCommand(pkgManager, ['install', '-g', '@anthropic-ai/claude-code'], true)
|
|
|
+
|
|
|
+ if (hasPnpm) {
|
|
|
+ // 使用 pnpm 安装,需要确保 PNPM_HOME 环境变量已设置
|
|
|
+ const { getRefreshedPath } = await import('./utils')
|
|
|
+ const refreshedPath = await getRefreshedPath()
|
|
|
+ const execEnv: Record<string, string> = { ...process.env as Record<string, string>, PATH: refreshedPath }
|
|
|
+
|
|
|
+ // 先执行 pnpm setup
|
|
|
+ try {
|
|
|
+ await execa('pnpm', ['setup'], { env: execEnv, shell: platform === 'win32' })
|
|
|
+ logger.installInfo('pnpm setup 完成')
|
|
|
+ } catch (error) {
|
|
|
+ logger.installWarn('pnpm setup 失败', error)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 手动设置 PNPM_HOME 环境变量
|
|
|
+ if (platform === 'win32') {
|
|
|
+ const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local')
|
|
|
+ const pnpmHome = path.join(localAppData, 'pnpm')
|
|
|
+ execEnv.PNPM_HOME = pnpmHome
|
|
|
+ execEnv.PATH = `${pnpmHome};${execEnv.PATH}`
|
|
|
+ logger.installInfo(`设置 PNPM_HOME: ${pnpmHome}`)
|
|
|
+ } else {
|
|
|
+ const pnpmHome = path.join(os.homedir(), '.local', 'share', 'pnpm')
|
|
|
+ execEnv.PNPM_HOME = pnpmHome
|
|
|
+ execEnv.PATH = `${pnpmHome}:${execEnv.PATH}`
|
|
|
+ logger.installInfo(`设置 PNPM_HOME: ${pnpmHome}`)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 使用 pnpm 安装 Claude Code
|
|
|
+ await execa('pnpm', ['install', '-g', '@anthropic-ai/claude-code'], { env: execEnv, shell: platform === 'win32' })
|
|
|
+ } else {
|
|
|
+ // 使用 npm 安装
|
|
|
+ const pkgManager = getNpmPath()
|
|
|
+ await executeCommand(pkgManager, ['install', '-g', '@anthropic-ai/claude-code'], true)
|
|
|
+ }
|
|
|
currentStep++
|
|
|
}
|
|
|
|