⚡我做了一个批量下载 VSCode 插件的小工具

前言 ✨

​ 因为我经常需要在离线环境开发项目,经常需要将vscode的插件传进去进行安装,之前采用的方案都是通过复制外网。vscode里面的extensions文件夹,将其传进去覆盖来实现的。

​ 但是这种方式需要知道vscode安装位置,并且最新版覆盖进去的时候不知道为什么,插件是有了,但是没有在插件列表里面显示出来。处理起来也比较麻烦。于是打算直接去下载插件的visix包。

​ 一个个下又非常麻烦,于是诞生了这个工具。

项目地址 📦

如果对你有帮助的话,请帮我点一个 star ⭐

项目地址:

一个用于批量下载 VSCode 插件 vsix 包的实用工具,支持离线环境快速安装插件。

名称 链接
GitHub仓库 leixq1024/vscode-vsix-download
使用文档 README

实现思路 🛠️

  1. 通过命令行获取本地已安装的 VSCode 插件列表及版本信息。
  2. 利用 Open VSX Registry 构建每个插件的 vsix 下载链接。
  3. 批量下载所有插件的 vsix 安装包,保存到本地文件夹,便于离线环境安装。
flowchart TD A[获取本地已安装插件列表] --> B[构建插件 vsix 下载链接] B --> C[批量下载 vsix 安装包] C --> D[离线环境安装插件]

核心代码介绍 💻

获取vscode已安装的插件列表 📋

​ 通过命令行中的code --list-extensions --show-versions命令,可以获取到当前vscode插件的列表。

css 复制代码
code --list-extensions --show-versions

像下面这样,其中你可以看到版本号和插件名称。

通过这个命令获取到插件列表之后,用代码处理一下格式。

js 复制代码
const { execSync } = require("child_process");
const getExtensions = () => {
  try {
    // 执行命令获取插件列表
    const output = execSync("code --list-extensions --show-versions", { encoding: "utf-8" });
    return output
      .split("\n")
      .filter(Boolean)
      .map(line => {
        // 解析每一行,格式为 publisher.extension@version
        const match = line.match(/^([^.]+)\.([^\@]+)\@(.+)$/);
        return match ? { publisher: match[1], extension: match[2], version: match[3] } : null;
      })
      .filter(Boolean);
  } catch (e) {
    // 获取失败时抛出异常
    throw new Error("无法获取 VSCode 插件列表,请确保已安装 VSCode 并 code 命令可用。");
  }
};

这里我用了execSync创建了一个子进程,并且执行了前面的那个命令。

上面代码的效果如下:

构建下载地址 🔗

​ 上面的步骤已经获取到了插件列表,接下来我们就需要一个网站提供下载链接。

Open VSX Registry

​ 这个open visix网站收录了vscode拓展,基本上你用的插件在这上面都是可以找到的,如果实在没找到,一般数量不会很多,这时候去github翻找一下,或者去插件官网找找也是有的。

随便打开一个插件往下找,就找到这个下载地址,点击下载。

下载下来的就是我们需要的vsix包。

经过一番处理,最终代码如下:

js 复制代码
const getVsixUrl = ({ publisher, extension, version }) =>
  `https://open-vsx.org/api/${publisher}/${extension}/${version}/file/${publisher}.${extension}-${version}.vsix`;

这样就可以获取我们插件的vsix文件下载地址了。

下载插件 ⬇️

​ 接下来就是下载插件了,这边我用axios去下载,你要用fetch也是可以的。

js 复制代码
const downloadVsix = async (url, dest) => {
  const response = await axios({
    method: "get",
    url,
    responseType: "stream", // 以流的方式下载
    maxRedirects: 5 // 支持重定向
  });
  if (response.status !== 200) throw new Error(`下载失败,状态码: ${response.status}`);
  const fileStream = fs.createWriteStream(dest);
  return new Promise((resolve, reject) => {
    response.data.pipe(fileStream);
    response.data.on("error", reject);
    fileStream.on("finish", resolve);
  });
};

如何使用 🚀

拉取代码 🧲

shell 复制代码
git clone https://github.com/leixq1024/vscode-vsix-download.git

拉取下来之后里面,有几个文件,其中download-vsix.js就是主要的代码文件了。

安装依赖 📦

arduino 复制代码
pnpm install 
// 或
npm install 
// 或
yarn install 

运行项目 ▶️

shell 复制代码
pnpm run start

​ 运行之后,会开始检测你安装的插件。

检测完成之后就会开始按顺序下载。

下载成功之后会显示,成功了多少个,并且在当前目录下会有一个downloaded文件夹。

这个文件夹里面的就是下载好的vsix文件。

这样你就可以直接将文件传入离线环境的开发环境,再用插件这边的从vsix安装功能。

这样就可以把你的插件装进去了。

相关推荐
求知若渴,虚心若愚。4 分钟前
Error reading config file (/home/ansible.cfg): ‘ACTION_WARNINGS(default) = True
linux·前端·ansible
LinDaiuuj1 小时前
最新的前端技术和趋势(2025)
前端
一只小风华~1 小时前
JavaScript 函数
开发语言·前端·javascript·ecmascript·web
程序猿阿伟2 小时前
《不只是接口:GraphQL与RESTful的本质差异》
前端·restful·graphql
若梦plus3 小时前
Nuxt.js基础与进阶
前端·vue.js
樱花开了几轉4 小时前
React中为甚么强调props的不可变性
前端·javascript·react.js
风清云淡_A4 小时前
【REACT18.x】CRA+TS+ANTD5.X实现useImperativeHandle让父组件修改子组件的数据
前端·react.js
小飞大王6664 小时前
React与Rudex的合奏
前端·react.js·前端框架
若梦plus4 小时前
React之react-dom中的dom-server与dom-client
前端·react.js
若梦plus4 小时前
react-router-dom中的几种路由详解
前端·react.js