From 14cdb9a1bd3f5258e20646e05cef3a154b9a0bfd Mon Sep 17 00:00:00 2001 From: Code pianist <77950104+1739616529@users.noreply.github.com> Date: Fri, 19 Jul 2024 17:28:45 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=B4=E6=97=B6=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/nsv/src/command/use.rs | 19 +++++++++--------- crates/root/src/node/mod.rs | 36 ++++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/crates/nsv/src/command/use.rs b/crates/nsv/src/command/use.rs index d0316d4..8ff9fe0 100644 --- a/crates/nsv/src/command/use.rs +++ b/crates/nsv/src/command/use.rs @@ -1,5 +1,5 @@ use async_trait::async_trait; -use root::core::NsvCore; +use root::{core::NsvCore, node::NodeDispose}; use super::Command; use root::node::NsvCoreError; @@ -12,14 +12,15 @@ pub struct Use { #[async_trait] impl Command for Use { - async fn apply(&self, _core: &mut NsvCore) -> Result<(), NsvCoreError> { - // core.set_version_target(&self.version)?; - // let local_node_version = core.get_version_by_local().await; - // if local_node_version.is_none() { - // return Err(NsvCoreError::NodeVersionLocalNotFound) - // } - // let local_node_version = local_node_version.as_ref().unwrap(); - + async fn apply(&self, core: &mut NsvCore) -> Result<(), NsvCoreError> { + core.set_version_target(&self.version)?; + let local_node_version = core.get_version_by_local().await; + if local_node_version.is_none() { + return Err(NsvCoreError::NodeVersionLocalNotFound) + } + let local_node_version = local_node_version.as_ref().unwrap(); + let set_version_shell = core.create_temp_node_version_shell(local_node_version); + core.create_temp_script_file(set_version_shell).await; Ok(()) } } diff --git a/crates/root/src/node/mod.rs b/crates/root/src/node/mod.rs index 5f51c67..b4a65db 100644 --- a/crates/root/src/node/mod.rs +++ b/crates/root/src/node/mod.rs @@ -4,9 +4,10 @@ use crate::util::dir::ensure_dir; use crate::util::download::{download_file, unzip_file}; use async_trait::async_trait; use serde::Deserialize; +use tokio::io::AsyncWriteExt; use std::fs::{read_dir, DirEntry}; use std::path::{Path, PathBuf}; -use tokio::fs::rename; +use tokio::fs::{rename, File}; #[derive(PartialEq, Debug, Clone)] pub enum VersionTarget { @@ -73,6 +74,13 @@ pub trait NodeDispose { /// 获取本地node版本 async fn get_version_by_local(&mut self) -> Option; + + /// 创建临时脚本文件 + async fn create_temp_script_file(&self, shell: String) -> PathBuf; + + /// 生成临时切换node version 脚本 + fn create_temp_node_version_shell(&self, version: &String) -> String; + } #[async_trait] @@ -230,6 +238,32 @@ impl NodeDispose for NsvCore { None } } + + async fn create_temp_script_file(&self, shell: String) -> PathBuf { + let mut temp_dir = self.context.temp.clone(); + temp_dir.push("temp_version"); + let mut temp_file = File::create(&temp_dir).await.unwrap(); + temp_file.write_all(shell.as_bytes()).await.unwrap(); + return temp_dir + } + + fn create_temp_node_version_shell(&self, version: &String) -> String { + #[cfg(any(target_os = "linux", target_os = "macos"))] + let bin = "bin"; + #[cfg(target_os = "windows")] + let bin = ""; + let mut node_dir = self.context.node_dir.clone(); + node_dir.push(version); + node_dir.push(bin); + + #[cfg(any(target_os = "linux", target_os = "macos"))] + let bin = format!(&"#!/bin/bash + export PATH={}:$PATH", node_dir.to_str().unwrap()); + #[cfg(target_os = "windows")] + let bin = format!("$Env:PATH = \"{};\" + $Env:PATH", node_dir.to_str().unwrap()); + + return bin; + } } #[derive(Clone, Debug, Deserialize)]