GitHub action to publish your VS Code Extension to the Open VSX Registry or the Visual Studio Marketplace.
All breaking changes of v1 are listed in the changelog
To use the GitHub Action, just reference the action in your workflow file.
The following example shows a workflow that publishes an extension to the Open VSX Registry as well as to the Visual Studio Marketplace when a new tag was created:
on:
push:
tags:
- "*"
name: Deploy Extension
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- name: Publish to Open VSX Registry
uses: HaaLeo/publish-vscode-extension@v1
with:
pat: ${{ secrets.OPEN_VSX_TOKEN }}
- name: Publish to Visual Studio Marketplace
uses: HaaLeo/publish-vscode-extension@v1
with:
pat: ${{ secrets.VS_MARKETPLACE_TOKEN }}
registryUrl: https://marketplace.visualstudio.com
To package the extension only once and publish the identical .vsix
file to both registries one can use the following two steps instead:
- name: Publish to Open VSX Registry
uses: HaaLeo/publish-vscode-extension@v1
id: publishToOpenVSX
with:
pat: ${{ secrets.OPEN_VSX_TOKEN }}
- name: Publish to Visual Studio Marketplace
uses: HaaLeo/publish-vscode-extension@v1
with:
pat: ${{ secrets.VS_MARKETPLACE_TOKEN }}
registryUrl: https://marketplace.visualstudio.com
extensionFile: ${{ steps.publishToOpenVSX.outputs.vsixPath }}
For a more complete and complex example one can check out the workflow of HaaLeo/vscode-timing
.
To publish to the Open VSX Registry ensure that your extension's namespace was created beforehand.
You need to set the pat
parameter to your Open VSX access token.
Further, you should ensure that you only publish an extension which is licensed.
For more information regarding Open VSX' timeline and its extensions' licensing check out Brian King's blog (section "Licensing" and "Timeline").
Currently, this GitHub action allows you to publish extensions which do not state their license terms. However, this behavior is deprecated and a future release of this action will reject unlicensed extensions. Therefore, I heavily encourage you to publish an extension with a (permissive) license such as the MIT license.
In order to upload your extension to the VS Marketplace you need to set the pat
option to the corresponding access token.
Further, the registryUrl
must be set to https://marketplace.visualstudio.com
.
You can set any or all of the following input parameters:
Name | Type | Required? | Default | Description |
---|---|---|---|---|
pat |
string | yes | - | The personal access token to the corresponding registry. |
extensionFile |
string | no | - | Path to the vsix file to be published. This option will be preferred when set together with packagePath . |
registryUrl |
string | no | https://open-vsx.org |
Use the registry API at this base URL |
packagePath |
string | no | ./ |
Path to the extension to be packaged and published. When extensionFile is set too packagePath is ignored. |
baseContentUrl |
string | no | - | Prepend all relative links in README.md with this URL. |
baseImagesUrl |
string | no | - | Prepend all relative image links in README.md with this URL. |
yarn |
boolean | no | false |
Use yarn instead of npm while packing extension files. |
dryRun |
boolean | no | false |
Set this option to true to package your extension but do not publish it. When using this option set the pat option to a stub value. |
noVerify |
boolean | no | false |
Allow publishing extensions to the visual studio marketplace which use a proposed API (enableProposedApi: true). Similar to vsce's --noVerify command line argument. |
preRelease |
boolean | no | false |
Mark the extensions release as pre-release. Is only considered when packaging an extension. |
dependencies |
boolean | no | true |
Check that dependencies defined in package.json exist in node_modules . Set to false if using pnpm or yarn v2+ with PnP. |
skipDuplicate |
boolean | no | false |
Fail silently if version already exists on the marketplace. Equivalent to the --skip-duplicate option of the vsce CLI. |
target |
string | no | - | Target architecture(s) the extension should run on. Separate multiple targets with spaces. E.g.: 'win32-x64 linux-x64' |
The action exposes the following outputs:
Name | Type | Description |
---|---|---|
vsixPath |
string | The path to the packaged and published VSIX file. |
If you found a bug or are missing a feature do not hesitate to file an issue.
Pull Requests are welcome!
To get started submitting code changes please take a look at the CONTRIBUTING.md file first.
When you like this extension make sure to star the repo. I am always looking for new ideas and feedback.
In addition, it is possible to donate via paypal.