Skip to content

Install in LocalAppData on Windows #1592

@kcastellino

Description

@kcastellino

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 with the ID FOLDERID_UserProgramFiles. 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):

# 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

  • Read the Contributing Guidelines.
  • Confirm this request is for Vite+ itself and not for Vite, Vitest, tsdown, Rolldown, or Oxc.
  • Check that there isn't already an issue requesting the same feature.

Metadata

Metadata

Assignees

No one assigned

    Priority

    None yet

    Start date

    None yet

    Target date

    None yet

    Effort

    None yet

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions