voidzero-dev / voidzero-dev/vite-plus
Install in LocalAppData on Windows
- 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
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