Skip to content

Proposal to drop .EXE support #407

@jantari

Description

@jantari

Description of the new feature/enhancement

This is a suggestion / spec / discussion on how I believe
winget should NOT support any .exe Setups/Installers and
instead I propose a (more or less - see below) strict MSIX-only approach.

This is intended to be an open discussion about #223,
specifically continuing on this comment by @VincentJoshuaET

@aclinick replied there that the adoption of MSIX
is not far enough along yet and it would significantly reduce the amount of available apps.

This proposal is the formal version of replying "so what?" to this.
We want a package manager for Windows. A real one. Microsoft has MSIX, it's open-source,
and they have winget, it's open-source. I want to see how many others would prefer
a tiny starting software selection of REAL packages with all the goodies over a larger software
selection of glorified one-way install-scripts.

Let us build the right thing now for the future, instead of reinventing the past we're tring to get away from so desperately

What is wrong with supprting .EXE (not a complete list by ANY means):

  1. .EXE Setups are often not "transactional" packages, aka changes they make are not reverted on uninstall
  2. They complicate the manifest format a lot with varying silent arguments and/or answer files
  3. There are no guarantees in install behavior and they all vary a lot:
    • Even with silent arguments, some installers invoke hidden windows that steal focus
    • With silent arguments, some installers may choose undesirable defaults
    • Even with silent arguments, an installer may show a MessageBox on Error
    • Even with silent arguments, some installers do not run/work when there is no user logged in or no graphical user session available (which breaks remote winget installs via ssh/WinRM when nobody is physically logged in to the machine)
  4. It is unclear to the user of winget whether an .EXE Setup installs per-user or per-machine
  5. Since the programs installed can update on their own and do not have a truly reliable way of fetching their version number - and even if they are not forced to have a version number that is comparable numerically (they might use a version string like "v10-0-pre-Build3002") winget cannot accurately keep track of them after the initial install
  6. .EXE Setups may bundle and install dependencies such as MSVC++ Redists or Microsoft ODBC Driver that winget is unaware have been installed (dependency resolution is not possible and neither is keeping track of the patch levels of libraries or dependencies)
  7. .EXE installers are just dirty, supporting them will cause so many issues -> even now, in this super early beta, already there are tons of open issues on this GitHub that all just relate to something weird or unexpected in Nullsoft, Squirrel, InstallShield, FlexeraInstallAnywhere, INNO etc. etc. etc. These programs, once installed, can be uninstalled, tampered with, moved, have their Uninstall-registry-key deleted by anything at any moment. There are no guarantees they can make to winget.

Proposed technical implementation details (optional)

Three options:

1. Slim down the scope of winget-cli and the manifest format.

Only allow .MSIX (or .MSIXBUNDLE) application packages, because these are true "OS-manageable" packages in the sense one would expect from a package manager.
This would provide the best possible user experience and communicate to OEMs, developers and partners the importance of MSIX.

2. Only allow .MSIX, .MSIXBUNDLE and "legacy" .MSI

.MSI packages aren't perfect, but they are a lot better than the wide variety of .EXE Setup packagers.
They have consistent silent arguments, they are registered by the Windows Installer database and as such can be queried programmatically. They have required information fields, such as Publisher, ProductName, ProductVersion and a GUID for each package so while they permit a Version-String that may be hard to parse we could beef up winget-clis ability to parse "weirdo" non-numeric version strings such as "v10", "2.1.0-pre", "2.1.0-rc2", "3.0-alpha3" etc. past the capabilities of .NET System.Version so we could cover >96% of version numbers. Alternatively the package manifest could include a transcribed, machine readable version number for winget to use internally such as "2.1.0-rc2" -> "2.0.9999.2"

3. Only allow .MSIX and .MSIXBUNDLE packages, but provide re-packaging CI for .EXE and .MSI

The MSIX Packaging Tool can execute .EXE and .MSI Setups and repackage them into .MSIX - most of the time. There could be special "winget-repackager"-as-a-Service tool set up by Microsoft (GitHub Actions/Cloud-based) where any .EXE and .MSI packages submitted for winget will be automatically repackaged into .MSIX by the MSIX Packaging Tool under the hood - and when no errors or warnings occurred, the package is good to go and will be added to the repositories. If the Installer tries something that .MSIX does not support yet, such as installing a Windows service, the packager will error out and refuse. This tool could additionally validate that the produces .MSIX file works by deploying it to itself or a fresh VM/Container and seeing whether that succeeds and whether the package installs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions