Skip to content

Commit 78dc58f

Browse files
committed
feat: 支持卸载已安装版本
1 parent dfc3a63 commit 78dc58f

File tree

7 files changed

+117
-10
lines changed

7 files changed

+117
-10
lines changed

src-tauri/src/env_commands.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,14 @@ pub async fn get_supported_environment_languages(
5858
let manager = env_manager.lock().await;
5959
Ok(manager.get_supported_languages())
6060
}
61+
62+
#[tauri::command]
63+
pub async fn uninstall_environment_version(
64+
language: String,
65+
version: String,
66+
env_manager: State<'_, EnvironmentManagerState>,
67+
) -> Result<(), String> {
68+
info!("卸载 {} 版本 {}", language, version);
69+
let manager = env_manager.lock().await;
70+
manager.uninstall_version(&language, &version).await
71+
}

src-tauri/src/env_manager.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ pub trait EnvironmentProvider: Send + Sync {
7676
// 获取安装目录
7777
#[allow(dead_code)]
7878
fn get_install_dir(&self) -> PathBuf;
79+
80+
// 卸载指定版本
81+
async fn uninstall_version(&self, version: &str) -> Result<(), String>;
7982
}
8083

8184
// 环境管理器
@@ -158,6 +161,16 @@ impl EnvironmentManager {
158161
pub fn get_supported_languages(&self) -> Vec<String> {
159162
self.providers.keys().cloned().collect()
160163
}
164+
165+
pub async fn uninstall_version(&self, language: &str, version: &str) -> Result<(), String> {
166+
let provider = self
167+
.providers
168+
.get(language)
169+
.ok_or_else(|| format!("暂未支持 {} 语言,请前往 github 提供 issues", language))?;
170+
171+
info!("卸载 {} 版本 {}", language, version);
172+
provider.uninstall_version(version).await
173+
}
161174
}
162175

163176
// 辅助函数:发送下载进度事件

src-tauri/src/env_providers/clojure.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,4 +859,22 @@ impl EnvironmentProvider for ClojureEnvironmentProvider {
859859
fn get_install_dir(&self) -> PathBuf {
860860
self.install_dir.clone()
861861
}
862+
863+
async fn uninstall_version(&self, version: &str) -> Result<(), String> {
864+
let version_dir = self.install_dir.join(version);
865+
866+
if !version_dir.exists() {
867+
return Err(format!("版本 {} 未安装", version));
868+
}
869+
870+
let current_version = self.get_current_version().await.ok().flatten();
871+
if current_version.as_deref() == Some(version) {
872+
return Err(format!("无法卸载当前正在使用的版本 {}", version));
873+
}
874+
875+
std::fs::remove_dir_all(&version_dir).map_err(|e| format!("删除版本目录失败: {}", e))?;
876+
877+
info!("已卸载 Clojure 版本 {}", version);
878+
Ok(())
879+
}
862880
}

src-tauri/src/env_providers/scala.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,4 +704,22 @@ impl EnvironmentProvider for ScalaEnvironmentProvider {
704704
fn get_install_dir(&self) -> PathBuf {
705705
self.install_dir.clone()
706706
}
707+
708+
async fn uninstall_version(&self, version: &str) -> Result<(), String> {
709+
let version_dir = self.install_dir.join(version);
710+
711+
if !version_dir.exists() {
712+
return Err(format!("版本 {} 未安装", version));
713+
}
714+
715+
let current_version = self.get_current_version().await.ok().flatten();
716+
if current_version.as_deref() == Some(version) {
717+
return Err(format!("无法卸载当前正在使用的版本 {}", version));
718+
}
719+
720+
std::fs::remove_dir_all(&version_dir).map_err(|e| format!("删除版本目录失败: {}", e))?;
721+
722+
info!("已卸载 Scala 版本 {}", version);
723+
Ok(())
724+
}
707725
}

src-tauri/src/main.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ mod utils;
1919

2020
use crate::env_commands::{
2121
EnvironmentManagerState, download_and_install_version, get_environment_info,
22-
get_supported_environment_languages, switch_environment_version,
22+
get_supported_environment_languages, switch_environment_version, uninstall_environment_version,
2323
};
2424
use crate::env_manager::EnvironmentManager;
2525
use crate::env_providers::{ClojureEnvironmentProvider, ScalaEnvironmentProvider};
@@ -93,6 +93,7 @@ fn main() {
9393
get_environment_info,
9494
download_and_install_version,
9595
switch_environment_version,
96+
uninstall_environment_version,
9697
get_supported_environment_languages,
9798
// 应用信息命令
9899
get_app_info,

src/components/setting/EnvironmentManager.vue

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,21 @@
9393
当前
9494
</span>
9595
</div>
96-
<Button v-if="environmentInfo.current_version !== version.version"
97-
type="primary"
98-
size="sm"
99-
@click="handleSwitchVersion(version.version)">
100-
切换
101-
</Button>
96+
<div class="flex items-center space-x-2">
97+
<Button v-if="environmentInfo.current_version !== version.version"
98+
type="primary"
99+
size="sm"
100+
@click="handleSwitchVersion(version.version)">
101+
切换
102+
</Button>
103+
<Button v-if="environmentInfo.current_version !== version.version"
104+
type="danger"
105+
size="sm"
106+
:icon="Trash2"
107+
@click="handleUninstall(version.version)">
108+
卸载
109+
</Button>
110+
</div>
102111
</div>
103112
</div>
104113
</div>
@@ -147,7 +156,7 @@
147156

148157
<script setup lang="ts">
149158
import { computed, ref } from 'vue'
150-
import { AlertCircle, CheckCircle, Download, Folder } from 'lucide-vue-next'
159+
import { AlertCircle, CheckCircle, Download, Folder, Trash2 } from 'lucide-vue-next'
151160
import { useEnvironmentManager } from '../../composables/useEnvironmentManager'
152161
import Label from '../../ui/Label.vue'
153162
import Input from '../../ui/Input.vue'
@@ -171,7 +180,8 @@ const {
171180
isDownloading,
172181
error,
173182
downloadAndInstall,
174-
switchVersion
183+
switchVersion,
184+
uninstallVersion
175185
} = useEnvironmentManager(props.language)
176186
177187
const activeVersionTab = ref('installed')
@@ -256,6 +266,17 @@ const handleSwitchVersion = async (version: string) => {
256266
}
257267
}
258268
269+
// 卸载版本
270+
const handleUninstall = async (version: string) => {
271+
try {
272+
await uninstallVersion(version)
273+
console.log('卸载版本成功:', version)
274+
}
275+
catch (e) {
276+
console.error('卸载版本失败:', e)
277+
}
278+
}
279+
259280
// 选择目录
260281
const onSelectDirectory = () => {
261282
emit('select-directory')

src/composables/useEnvironmentManager.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,30 @@ export function useEnvironmentManager(language: string) {
8686
}
8787
}
8888

89+
// 卸载版本
90+
const uninstallVersion = async (version: string) => {
91+
isLoading.value = true
92+
error.value = null
93+
94+
try {
95+
await invoke('uninstall_environment_version', {
96+
language,
97+
version
98+
})
99+
100+
// 刷新环境信息
101+
await fetchEnvironmentInfo()
102+
}
103+
catch (e) {
104+
error.value = e as string
105+
console.error('卸载版本失败:', e)
106+
throw e
107+
}
108+
finally {
109+
isLoading.value = false
110+
}
111+
}
112+
89113
// 监听下载进度
90114
const setupProgressListener = async () => {
91115
unlistenProgress = await listen<DownloadProgress>('env-download-progress', (event) => {
@@ -117,6 +141,7 @@ export function useEnvironmentManager(language: string) {
117141
error,
118142
fetchEnvironmentInfo,
119143
downloadAndInstall,
120-
switchVersion
144+
switchVersion,
145+
uninstallVersion
121146
}
122147
}

0 commit comments

Comments
 (0)