Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/actions/spelling/expect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,7 @@ NOAGGREGATION
NOCLOSE
NOCRLF
NOEXPAND
noinstaller
NOLINKINFO
nomem
NONAME
Expand Down
11 changes: 11 additions & 0 deletions doc/ReleaseNotes.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
## New in v1.29

# New Feature: NoInstaller manifest type

Manifests can now declare `InstallerType: noinstaller` (manifest version `1.29.0`). This type is intended for software a publisher no longer offers as a direct download, allowing winget to continue correlating against the installed package without providing an installer URL.

Key behaviours:

- **`winget install`** — immediately stops with the package's `InstallerAvailabilityMessage` if one is set, or a default "The installer for this package is no longer available." message otherwise. The exit code is `0x8A150116` (`APPINSTALLER_CLI_ERROR_INSTALLER_NOT_AVAILABLE`).
- **`winget show`** — displays `Installer Availability Message:` instead of `Installer Url:`, and shows `Offline Distribution Supported: false`.
- **`winget upgrade`** — a real installer is always preferred over a `noinstaller` entry when both exist for the same package. A `noinstaller` entry is only selected when it is the only applicable option, at which point the install flow blocks as above.
- **Manifest fields** — `InstallerUrl` must not be present. `InstallerSha256`, `ProductCode`, and `AppsAndFeaturesEntries` are all supported for package correlation. `InstallerAvailabilityMessage` (optional, max 512 characters) may be set at root or per-installer level.

# New Feature: Source Priority

> [!NOTE]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$id": "https://aka.ms/winget-manifest.defaultlocale.1.28.0.schema.json",
"$id": "https://aka.ms/winget-manifest.defaultlocale.1.29.0.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "A representation of a multiple-file manifest representing a default app metadata in the OWC. v1.28.0",
"description": "A representation of a multiple-file manifest representing a default app metadata in the OWC. v1.29.0",
"definitions": {
"Url": {
"type": [ "string", "null" ],
Expand Down Expand Up @@ -261,7 +261,7 @@
},
"ManifestVersion": {
"type": "string",
"default": "1.28.0",
"default": "1.29.0",
"pattern": "^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){2}$",
"description": "The manifest syntax version"
}
Expand Down
59 changes: 50 additions & 9 deletions schemas/JSON/manifests/latest/manifest.installer.latest.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
{
"$id": "https://aka.ms/winget-manifest.installer.1.28.0.schema.json",
"$id": "https://aka.ms/winget-manifest.installer.1.29.0.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "A representation of a single-file manifest representing an app installers in the OWC. v1.28.0",
"description": "A representation of a single-file manifest representing an app installers in the OWC. v1.29.0",
"definitions": {
"InstallerAvailabilityMessage": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"description": "A message to display when the installer is not available (only valid for noinstaller type)"
},
"PackageIdentifier": {
"type": "string",
"pattern": "^[^\\.\\s\\\\/:\\*\\?\"<>\\|\\x01-\\x1f]{1,32}(\\.[^\\.\\s\\\\/:\\*\\?\"<>\\|\\x01-\\x1f]{1,32}){1,7}$",
Expand Down Expand Up @@ -66,7 +72,8 @@
"burn",
"pwa",
"portable",
"font"
"font",
"noinstaller"
],
"description": "Enumeration of supported installer types. InstallerType is required in either root level or individual Installer level"
},
Expand Down Expand Up @@ -840,13 +847,26 @@
},
"DesiredStateConfiguration": {
"$ref": "#/definitions/DesiredStateConfiguration"
},
"InstallerAvailabilityMessage": {
"$ref": "#/definitions/InstallerAvailabilityMessage"
}
},
"required": [
"Architecture",
"InstallerUrl",
"InstallerSha256"
]
"Architecture"
],
"if": {
"properties": {
"InstallerType": { "not": { "const": "noinstaller" } }
},
"required": ["InstallerType"]
},
"then": {
"required": [
"InstallerUrl",
"InstallerSha256"
]
}
}
},
"type": "object",
Expand Down Expand Up @@ -968,6 +988,9 @@
"DesiredStateConfiguration": {
"$ref": "#/definitions/DesiredStateConfiguration"
},
"InstallerAvailabilityMessage": {
"$ref": "#/definitions/InstallerAvailabilityMessage"
},
"Installers": {
"type": "array",
"items": {
Expand All @@ -984,7 +1007,7 @@
},
"ManifestVersion": {
"type": "string",
"default": "1.28.0",
"default": "1.29.0",
"pattern": "^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){2}$",
"description": "The manifest syntax version"
}
Expand All @@ -995,5 +1018,23 @@
"Installers",
"ManifestType",
"ManifestVersion"
]
],
"if": {
"not": {
"properties": {
"InstallerType": { "const": "noinstaller" }
},
"required": ["InstallerType"]
}
},
"then": {
"properties": {
"Installers": {
"items": {
"if": { "not": { "required": ["InstallerType"] } },
"then": { "required": ["InstallerUrl", "InstallerSha256"] }
}
}
}
}
}
6 changes: 3 additions & 3 deletions schemas/JSON/manifests/latest/manifest.locale.latest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$id": "https://aka.ms/winget-manifest.locale.1.28.0.schema.json",
"$id": "https://aka.ms/winget-manifest.locale.1.29.0.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "A representation of a multiple-file manifest representing app metadata in other locale in the OWC. v1.28.0",
"description": "A representation of a multiple-file manifest representing app metadata in other locale in the OWC. v1.29.0",
"definitions": {
"Url": {
"type": [ "string", "null" ],
Expand Down Expand Up @@ -256,7 +256,7 @@
},
"ManifestVersion": {
"type": "string",
"default": "1.28.0",
"default": "1.29.0",
"pattern": "^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){2}$",
"description": "The manifest syntax version"
}
Expand Down
59 changes: 50 additions & 9 deletions schemas/JSON/manifests/latest/manifest.singleton.latest.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
{
"$id": "https://aka.ms/winget-manifest.singleton.1.28.0.schema.json",
"$id": "https://aka.ms/winget-manifest.singleton.1.29.0.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "A representation of a single-file manifest representing an app in the OWC. v1.28.0",
"description": "A representation of a single-file manifest representing an app in the OWC. v1.29.0",
"definitions": {
"InstallerAvailabilityMessage": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"description": "A message to display when the installer is not available (only valid for noinstaller type)"
},
"PackageIdentifier": {
"type": "string",
"pattern": "^[^\\.\\s\\\\/:\\*\\?\"<>\\|\\x01-\\x1f]{1,32}(\\.[^\\.\\s\\\\/:\\*\\?\"<>\\|\\x01-\\x1f]{1,32}){1,7}$",
Expand Down Expand Up @@ -168,7 +174,8 @@
"burn",
"pwa",
"portable",
"font"
"font",
"noinstaller"
],
"description": "Enumeration of supported installer types. InstallerType is required in either root level or individual Installer level"
},
Expand Down Expand Up @@ -941,13 +948,26 @@
},
"DesiredStateConfiguration": {
"$ref": "#/definitions/DesiredStateConfiguration"
},
"InstallerAvailabilityMessage": {
"$ref": "#/definitions/InstallerAvailabilityMessage"
}
},
"required": [
"Architecture",
"InstallerUrl",
"InstallerSha256"
]
"Architecture"
],
"if": {
"properties": {
"InstallerType": { "not": { "const": "noinstaller" } }
},
"required": ["InstallerType"]
},
"then": {
"required": [
"InstallerUrl",
"InstallerSha256"
]
}
}
},
"type": "object",
Expand Down Expand Up @@ -1192,6 +1212,9 @@
"DesiredStateConfiguration": {
"$ref": "#/definitions/DesiredStateConfiguration"
},
"InstallerAvailabilityMessage": {
"$ref": "#/definitions/InstallerAvailabilityMessage"
},
"Installers": {
"type": "array",
"items": {
Expand All @@ -1208,7 +1231,7 @@
},
"ManifestVersion": {
"type": "string",
"default": "1.28.0",
"default": "1.29.0",
"pattern": "^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){2}$",
"description": "The manifest syntax version"
}
Expand All @@ -1224,5 +1247,23 @@
"Installers",
"ManifestType",
"ManifestVersion"
]
],
"if": {
"not": {
"properties": {
"InstallerType": { "const": "noinstaller" }
},
"required": ["InstallerType"]
}
},
"then": {
"properties": {
"Installers": {
"items": {
"if": { "not": { "required": ["InstallerType"] } },
"then": { "required": ["InstallerUrl", "InstallerSha256"] }
}
}
}
}
}
6 changes: 3 additions & 3 deletions schemas/JSON/manifests/latest/manifest.version.latest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$id": "https://aka.ms/winget-manifest.version.1.28.0.schema.json",
"$id": "https://aka.ms/winget-manifest.version.1.29.0.schema.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "A representation of a multi-file manifest representing an app version in the OWC. v1.28.0",
"description": "A representation of a multi-file manifest representing an app version in the OWC. v1.29.0",
"type": "object",
"properties": {
"PackageIdentifier": {
Expand Down Expand Up @@ -31,7 +31,7 @@
},
"ManifestVersion": {
"type": "string",
"default": "1.28.0",
"default": "1.29.0",
"pattern": "^(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){2}$",
"description": "The manifest syntax version"
}
Expand Down
Loading