Search code examples
azure-devopsazure-pipelinesazure-devops-extensions

Uploaded extension package is missing an 'overview.md' file which is a mandatory details asset


While trying to publish an extension to the marketplace I bumped into this error message.

The supplied extension definition isn't valid: 
'Uploaded extension package is missing an 'overview.md' file which is a mandatory details asset. 
Try again after adding the file.'

Yet, my extension has the mandatory details asset in the vss-extension.json:

content": {
  "details": {
    "path": "overview.md"
  }
}

And the file is present in the generated vsix:

screenshot of vsix file contents containing overview.md


Solution

  • It turns out that when you try to simply include everything in the extension with:

    "files": [
      {
        "path": "."
      }
    ]
    

    It overrides the metadata for the "special content files" when these files are matched by the listed files.

    So, I ended up moving all the build task in the extension to a _tasks folder and instead of lazily including everything, I'm now lazily including _tasks:

    "files": [
      {
        "path": "_tasks"
      }
    ],
    

    With this change, the vsix has the required metadata on the overview.md:

    vsix\extension.vsixmanifest

      <Assets>
        <Asset Type="Microsoft.VisualStudio.Services.Icons.Default" d:Source="File" Path="icon-default.png" Addressable="true"/>
        <Asset Type="Microsoft.VisualStudio.Services.Icons.Large" d:Source="File" Path="icon-large.png" Addressable="true"/>
        <Asset Type="Microsoft.VisualStudio.Services.Content.Details" d:Source="File" Path="overview.md" Addressable="true"/>
        <Asset Type="Microsoft.VisualStudio.Services.Content.License" d:Source="File" Path="LICENSE" Addressable="true"/>
        <Asset Type="Microsoft.VisualStudio.Services.Content.Privacy" d:Source="File" Path="PRIVACY.md" Addressable="true"/>
        <Asset Type="Microsoft.VisualStudio.Services.Manifest" d:Source="File" Path="extension.vsomanifest" Addressable="true"/>
      </Assets>