voidzero-dev / voidzero-dev/vite-plus

Install in LocalAppData on Windows

Abierto
#1,592 0 comentarios 0 reacciones 0 asignados Ver en GitHub
pending triage
Lenguaje dominante
Rust
Estrellas
5.8k
Forks
262
Merge medio
23 h 18 min
PR fusionados (30 d)
139

Descripción

### Description

By default, Vite+ is installed in `%USERPROFILE%\.vite-plus`. This adds clutter to the user's profile folder, especially since the folder is not hidden (unlike on POSIX systems). This issue is related to #827.

### Suggested solution

Change the default installation location to either `%LOCALAPPDATA%\vite-plus` (which is equivalent to `$XDG_DATA_HOME`) or in `%LOCALAPPDATA%\Programs\vite-plus` (which is used by MSI installers as the default per-user install location).

Strictly speaking, the default per-user install location is a [known folder](https://learn.microsoft.com/en-us/windows/win32/shell/known-folders) with the ID [FOLDERID_UserProgramFiles](https://learn.microsoft.com/en-us/windows/win32/shell/knownfolderid#:~:text=FOLDERID%5FUserProgramFiles). The default path is `%LOCALAPPDATA%\Programs`, but it can be overridden on an individual system. Therefore, the path to this folder should be retrieved by calling the `SHGetKnownFolderPath` function in `shell32.dll`. The following script uses P/Invoke within PowerShell to get the value (with no error checking):

```powershell
# Here be P/Invoke...
$Shell32 = ([System.Management.Automation.PSTypeName]'Win32.Shell32').Type;

if (-not $Shell32) {
# The PreserveSig = false setting automatically unmarshals the return value.
$signature = @'
[DllImport("shell32.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode, ExactSpelling = true, PreserveSig = false)]
public static extern string SHGetKnownFolderPath(
ref Guid rfid,
uint dwFlags,
IntPtr hToken
);
'@

$typeArgs = @{
MemberDefinition = $signature
Name = "Shell32"
Namespace = "Win32"
PassThru = $true
};
$Shell32 = Add-Type @typeArgs;
}

# GUID for FOLDERID_UserProgramFiles known folder: {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}
# $guid = [System.Guid]::ParseExact("{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}", "B")
# $guid = [guid]"{5CD7AEE2-2219-4A67-B85D-6C9CE15660CB}"
$guid = [System.Guid]::new(0x5CD7AEE2, 0x2219, 0x4A67, 0xB8, 0x5D, 0x6C, 0x9C, 0xE1, 0x56, 0x60, 0xCB);
# The flag in the second argument tells Windows to create the folder if it doesn't exist
# The null pointer as the third argument means we get the known folder path for the current user
$path = $Shell32::SHGetKnownFolderPath([ref]$guid, 0x00008000, [IntPtr]::Zero);
return $path;
```

### Alternative

_No response_

### Additional context

_No response_

### Validations

- [x] Read the [Contributing Guidelines](https://github.com/voidzero-dev/vite-plus/blob/main/CONTRIBUTING.md).
- [x] Confirm this request is for Vite+ itself and not for Vite, Vitest, tsdown, Rolldown, or Oxc.
- [x] Check that there isn't already an issue requesting the same feature.

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

El payload no menciona archivos de implementación ni pruebas. Empieza localizando la lógica de rutas del instalador de Windows e inspecciona el punto de entrada SHGetKnownFolderPath propuesto; se considera terminado cuando las instalaciones nuevas de Windows usan la ubicación por usuario seleccionada sin romper las instalaciones existentes.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
rust
Área
operating-systems, tooling
Tipo de issue
Nueva funcionalidad
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
48/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.