microsoft / winget-cli

WinGet is the Windows Package Manager. This project includes a CLI (Command Line Interface), PowerShell modules, and a COM (Component Object Model) API (Application Programming Interface).
https://learn.microsoft.com/windows/package-manager/
MIT License
22.68k stars 1.4k forks source link

Support validation for multiple aliases in a single portable executable #2884

Open sitiom opened 1 year ago

sitiom commented 1 year ago

Brief description of your issue

winget validate fails locally for nested portable executables with multiple aliases. Some applications expect multiple aliases from one command, which is why this is important.

Related to https://github.com/microsoft/winget-cli/issues/2523#issue-1376643992:

  • This might be acceptable as long as they have different command aliases?

Perhaps this was overlooked.

Steps to reproduce

  1. Checkout https://github.com/microsoft/winget-pkgs/pull/94699
  2. Validate the Fly-io.flyctl manifest locally with winget validate
  3. Validation fails with this error:
    Manifest validation failed.
    Manifest Error: Duplicate relative file path found. [RelativeFilePath]
    Manifest Error: Duplicate relative file path found. [RelativeFilePath]

Installation works as intended however, creating fly and flyctl aliases for flyctl.exe.

Expected behavior

Validation should succeed

Actual behavior

Validation is failing.

Environment

Windows: Windows.Desktop v10.0.22621.1105
System Architecture: X64
Package: Microsoft.DesktopAppInstaller v1.19.10173.0
ryfu-msft commented 1 year ago

@sitiom,

This scenario seems a bit strange to me. Why are multiple aliases needed for a single executable when one alias could do the job? Could you give me more context on your scenario or your specific package? Is this a "special" case or is this a more common scenario that we had overlooked when implementing the validation. We don't want to open up floodgates and allow a bunch of symlinks/aliases to be generated for only a single executable if it is not absolutely necessary.

sitiom commented 1 year ago

Why are multiple aliases needed for a single executable when one alias could do the job?

Some CLI apps have a shorter alias that users can use for convenience. flyctl is an example (i.e., flyctl and fly as stated in the docs). Users expect both aliases to be available like in other package managers; thus, this case should be supported.

We don't want to open up floodgates and allow a bunch of symlinks/aliases to be generated for only a single executable if it is not absolutely necessary.

Of course, you shouldn't when it's not necessary ๐Ÿ™‚

denelon commented 1 year ago

It sounds more like a new feature then. Are there any other examples like this?

A few more "real world" examples will help justify the work. It's hard to justify for one package given all the other open Issues.

I'd also want a few more ๐Ÿ‘on the issue ๐Ÿ˜Š

sitiom commented 1 year ago

Workaround: Prefix .\ to the other RelativeFilePath (i.e., flyctl.exe and .\flyctl.exe). Validation now succeeds: image

However, you cannot apply this workaround for non-zip binaries (Example: Genivia.ugrep).

Trenly commented 1 year ago

[Policy] Portable

soredake commented 7 months ago

Another package that uses multiple aliases https://github.com/microsoft/winget-pkgs/pull/131849