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
23.13k stars 1.44k forks source link

Installer locale does not match required locale (No applicable installer found; see logs for more details.) #2305

Open MartinSGill opened 2 years ago

MartinSGill commented 2 years ago

Brief description of your issue

Attempting to install a package, I get an error message: "No applicable installer found; see logs for more details."

I first noticed this with upgrade --all failing to upgrade many packages without any warnings/errors. Then tried to uninstall/reinstall packages manually and discovered this issue.

Steps to reproduce

Tried this with a number of applications (installer types), including:

All gave the same error, non of them installed correctly.

Downloading the installer (from the manifest file) and running it directly works without issue.

Expected behavior

Correctly install the application, or provide a helpful error message.

Actual behavior

Nothing happens; useless error message.

Environment

## Env

Windows Package Manager (Preview) v1.3.1391-preview
Copyright (c) Microsoft Corporation. All rights reserved.

Windows: Windows.Desktop v10.0.22000.739
System Architecture: X64
Package: Microsoft.DesktopAppInstaller v1.18.1391.0

Logs: %LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\DiagOutputDir

## log

2022-07-03 16:50:05.505 [CORE] WinGet, version [1.3.1391-preview], activity [{84FB7417-A1CA-4E25-A8D8-74FE95FDC52C}]
2022-07-03 16:50:05.506 [CORE] OS: Windows.Desktop v10.0.22000.739
2022-07-03 16:50:05.506 [CORE] Command line Args: "C:\Users\marti\AppData\Local\Microsoft\WindowsApps\winget.exe" install OpenTTD.OpenTTD
2022-07-03 16:50:05.506 [CORE] Package: Microsoft.DesktopAppInstaller v1.18.1391.0
2022-07-03 16:50:05.506 [CORE] IsCOMCall:0; Caller: winget-cli
2022-07-03 16:50:05.511 [CLI ] WinGet invoked with arguments: 'install' 'OpenTTD.OpenTTD'
2022-07-03 16:50:05.511 [CLI ] Found subcommand: install
2022-07-03 16:50:05.511 [CLI ] Leaf command to execute: root:install
2022-07-03 16:50:05.514 [CLI ] Executing command: install
2022-07-03 16:50:05.515 [REPO] GetCurrentSourceRefs: Source named 'microsoft.builtin.desktop.frameworks' from origin Default is hidden and is dropped.
2022-07-03 16:50:05.515 [REPO] Default source requested, multiple sources available, adding all to source references.
2022-07-03 16:50:05.515 [REPO] Adding to source references msstore
2022-07-03 16:50:05.515 [REPO] Adding to source references winget
2022-07-03 16:50:05.515 [REPO] Multiple sources available, creating aggregated source.
2022-07-03 16:50:05.515 [REPO] Adding to aggregated source: msstore
2022-07-03 16:50:05.515 [REPO] Sending http GET request to: https://storeedgefd.dsx.mp.microsoft.com/v9.0/information
2022-07-03 16:50:05.617 [REPO] Response status: 200
2022-07-03 16:50:05.617 [REPO] Sending http GET request to: https://storeedgefd.dsx.mp.microsoft.com/v9.0/information
2022-07-03 16:50:05.653 [REPO] Response status: 200
2022-07-03 16:50:05.654 [REPO] Adding to aggregated source: winget
2022-07-03 16:50:05.664 [CORE] Examining extension: PFN = Microsoft.Winget.MSStore.Source_8wekyb3d8bbwe, ID = IndexDB
2022-07-03 16:50:05.667 [CORE] Examining extension: PFN = Microsoft.Winget.Source_8wekyb3d8bbwe, ID = IndexDB
2022-07-03 16:50:05.667 [CORE] Found matching extension.
2022-07-03 16:50:05.687 [REPO] Opening SQLite Index for ImmutableRead at 'C:\Program Files\WindowsApps\Microsoft.Winget.Source_2022.703.1522.494_neutral__8wekyb3d8bbwe\Public\index.db'
2022-07-03 16:50:05.687 [SQL ] Opening SQLite connection: 'file:/C:/Program Files/WindowsApps/Microsoft.Winget.Source_2022.703.1522.494_neutral__8wekyb3d8bbwe/Public/index.db?immutable=1' [1, 40]
2022-07-03 16:50:05.687 [REPO] Opened SQLite Index with version [1.3], last write [2022-07-03 16:22:26.000]
2022-07-03 16:50:05.889 [REPO] Sending http POST request to: https://storeedgefd.dsx.mp.microsoft.com/v9.0/manifestSearch
2022-07-03 16:50:06.168 [REPO] Response status: 200
2022-07-03 16:50:06.176 [CLI ] Found one app. App id: OpenTTD.OpenTTD App name: OpenTTD
2022-07-03 16:50:06.177 [REPO] Downloading manifest
2022-07-03 16:50:06.177 [CORE] WinINet downloading from url: https://cdn.winget.microsoft.com/cache/manifests/o/OpenTTD/OpenTTD/12.2/d412-OpenTTD.OpenTTD.yaml
2022-07-03 16:50:06.686 [CORE] Download hash: 254fd0703a055cb9999ccf99aee7745cf97c25a0654eba733626dbb1086a863a
2022-07-03 16:50:06.686 [CORE] Download completed.
2022-07-03 16:50:06.686 [CLI ] Manifest fields: Name [OpenTTD], Version [12.2]
2022-07-03 16:50:06.687 [CLI ] Starting installer selection.
2022-07-03 16:50:06.687 [CLI ] Installer [X64,nullsoft,Machine,] not applicable: Installer locale does not match required locale: Required locales: [en-GB, en-US, en]
2022-07-03 16:50:06.687 [CLI ] Installer [X86,nullsoft,Machine,] not applicable: Installer locale does not match required locale: Required locales: [en-GB, en-US, en]
2022-07-03 16:50:06.687 [CLI ] Installer [Arm64,nullsoft,Machine,] not applicable: Installer locale does not match required locale: Required locales: [en-GB, en-US, en]
2022-07-03 16:50:06.687 [CLI ] Installer [Arm64,nullsoft,Machine,] not applicable: Machine is not compatible with Arm64
2022-07-03 16:50:06.696 [CLI ] Terminating context: 0x8a150010 at D:\a\_work\1\s\external\pkg\src\AppInstallerCLICore\Workflows\InstallFlow.cpp:76
MartinSGill commented 1 year ago

Still seeing this issue. The log message has become better at least.

[...] Required locales: [en-GB, en-US, en] Or does not satisfy compatible match for Preferred Locales: [en-IE, en-US, en-GB, de-DE, ja]
ckagerer commented 9 months ago

Same issue for me, for the following update

Epic Games Launcher    EpicGames.EpicGamesLauncher    1.3.82.0 1.3.93.0  winget

I was able to force an update with this:

winget upgrade EpicGames.EpicGamesLauncher --locale en-US

The cause seems to lie in the manifesto. In which the entry InstallerLocal has been added.

grafik

d0ggie commented 5 months ago

The problem is indeed a missing InstallerLocale in the manifest and how it is handled (or lack thereof) in the ManifestComparator. This omittance will be problematic, if settings.json contains installBehavior > preferences > locale or --locale is used.

Unless InstallerLocale is present, Manifest::ManifestInstaller::Locale will be an empty string. This is even visible in the log message, "Installer locale does not match required locale: Required locales [...]", which should display the required locale: https://github.com/microsoft/winget-cli/blob/2979fd81dedd79f06bb0061159f6764b4ac70a9a/src/AppInstallerCLICore/Workflows/ManifestComparator.cpp#L684-L693

The problem is likely just a small mishap, just a few lines above, which happened in commit 4b613b3057df01b8225ff50a73af971fa27d02b5. For a Preferred Locale a match is always made, if the Installer Locale is empty. This code path is not taken, unless the locale is what is currently installed. This is exactly why one would like to use --locale, override the locale derived from the currently installed version.

https://github.com/microsoft/winget-cli/blob/2979fd81dedd79f06bb0061159f6764b4ac70a9a/src/AppInstallerCLICore/Workflows/ManifestComparator.cpp#L669-L670

However, in case of a Required Locale, the empty Installer Locale is not checked. This code path is not taken, if there is no Required Locale present, i.e. --locale or a corresponding settings.json setting.

https://github.com/microsoft/winget-cli/blob/2979fd81dedd79f06bb0061159f6764b4ac70a9a/src/AppInstallerCLICore/Workflows/ManifestComparator.cpp#L655

Unless there is a match (and for an empty string there is none), GetDistanceOfLanguage returns 0.0 (more precisely, this is what GetDistanceOfClosestLanguageInList sets as the distance, if no match is found or either [or both] of the input strings are empty).

So, to summarize, at the moment installing a problematic package is not possible with --locale (manifest is missing InstallerLocale) or without --locale (manifest PackageLocale and installed locale do not match; the reported installed version is not necessarily correct, but this is obviously the problem with the installer).