news 2026/10/7 16:52:53

VSCode插件离线导出与迁移:清单备份到VSIX分发完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VSCode插件离线导出与迁移:清单备份到VSIX分发完整指南

换电脑、重装系统、或者被分配了一台只能连内网的开发机,这些场景下“VSCode 插件怎么搬过去”几乎是每个用 VSCode 的人都绕不开的问题。所谓“导出 VSCode 插件到本地”,简单说就是把已经装好的扩展变成一份可以带走、可以分发、可以离线安装的东西。它既可以是纯文本的插件清单,也可以是真正的 .vsix 安装包。这篇文章我会把我实测过的两种思路都讲清楚——一种是导出插件清单后联网批量安装,另一种是把插件安装包真正下载到本地做离线分发——顺带把版本匹配、依赖插件、批量脚本、常见报错这些细节全部处理掉,保证你照着做就能复现。

先交代一下我对这个需求的定位:这篇文章不是讲“怎么装插件”,而是讲“怎么把装好的插件环境整体备份/迁移/分发”。适合三类人看:经常换电脑的开发者、公司内网环境没有外网权限的开发者,以及想给团队统一开发环境的技术负责人。

1. 为什么要把 VSCode 插件导出到本地

1.1 你可能遇到的实际场景

先说个最常见的:新笔记本到手,装好 VSCode 后打开扩展面板,发现之前精心调好的几十个插件全得重新搜、重新装。如果你用的插件数量少还好,十几个也还能忍受,但要是你装了四五十个,手动一个个点安装会非常崩溃。这时候有一份插件清单,一条命令全装回来,体验完全不一样。

第二种场景是公司内网开发。很多企业的开发环境是物理隔离的,要么完全没有外网,要么只能访问白名单站点。VSCode 扩展市场在这种网络下要么慢如蜗牛,要么直接连不上。这时候你必须提前把插件下载成 .vsix 文件,拷到内网机器上离线安装。这是“导出到本地”最刚需的场景。

第三种场景是插件版本锁定。VSCode 扩展默认会自动更新,有时候插件更新会引入行为变化,甚至和项目里的 SDK 或构建流程冲突。如果你希望团队所有成员都用完全一致的插件版本,就需要导出带版本号的插件清单,然后在安装时锁定版本。很多线上事故的根因不是代码,而是某个人 IDE 里的插件偷偷升级了。

第四种场景是团队标准化。我见过不少团队,新人入职后要花半天折腾开发环境。如果能把公司内部常用插件统一打包成一批 .vsix 文件,放到共享目录或者内网文件服务器上,新人只要执行一条脚本就能拥有和老员工完全一致的扩展环境。这事做一次,后面能省很多时间。

1.2 两条技术路线:清单重装 vs 本地VSIX包

“导出插件”这件事,说白了有两条路线。第一条是“导出清单”:用code --list-extensions生成一个文本文件,里面记录你当前所有插件名称,到了新机器上再用命令行批量安装。这条路线要求目标机器能联网访问插件市场,好处是操作简单、导出文件极小,适合日常换机备份。

第二条是“导出安装包”:把每个插件对应的 .vsix 文件下载到本地,做成一个离线安装包目录,再到目标机器上通过命令行或者 UI 安装。这条路线不依赖网络,适合内网离线环境,也适合团队统一分发。

两条路线不是互斥的,实际工作中我会建议你两条都做:清单用于日常备份和版本审计,vsix 文件用于离线环境。这里直接给一张对比表。

对比维度清单重装离线VSIX包
导出产物文本文件(扩展名列表).vsix 安装包文件
文件大小几KB每个几MB到几百MB
目标机网络要求需要联网访问市场完全离线可用
版本控制精度通过清单带版本号实现通过下载固定版本实现
适用场景换电脑、日常备份内网、团队分发、版本锁定
实现难度极低中等,需要脚本辅助

2. 方式一:插件清单导出与批量重装

2.1 用命令行生成插件清单

VSCode 安装后会自带一个code命令。如果你安装时勾选了“添加到 PATH”,在任意终端里输入code --version就能看到版本信息。如果提示找不到命令,别急着怀疑人生,大概率是你安装时没把“Add to PATH”勾上,或者你用的是 Linux 的 AppImage 版。这种情况下可以直接进入 VSCode 的安装目录调用可执行文件:Windows 一般在C:\Program Files\Microsoft VS Code\Code.exe,macOS 是在应用右键“显示包内容”里的Contents/Resources/app/bin/code,Linux 一般在/usr/share/code/bin/code。终端里用完整路径执行即可。

确认命令可用后,生成插件清单的核心命令就两条:

# 只列出插件 ID code --list-extensions # 列出插件 ID 并附带版本号 code --list-extensions --show-versions

第一条命令输出类似:

ms-python.python ms-python.vscode-pylance esbenp.prettier-vscode eamodio.gitlens

第二条命令会在每个插件 ID 后面跟一个@和版本号:

ms-python.python@2024.4.1 ms-python.vscode-pylance@2024.4.1 esbenp.prettier-vscode@10.1.0

实际使用中,我会建议每次导出都带上--show-versions。原因很简单:版本号是插件环境审计的关键信息。如果哪天项目出问题,你能快速确认是哪台机器上哪个插件版本不对劲。只导出一串插件名,没法做这种回溯。

导出到文件的话,在终端里重定向就行:

code --list-extensions --show-versions > my-vscode-extensions.txt

Windows 上用 PowerShell 也是一样的写法。这个文件建议直接纳入个人配置备份体系,比如放到 Git 仓库里、丢进同步网盘,或者存到公司内部知识库,别只留在本机。我自己的习惯是把它放在一个名为dotfiles的仓库里,和 VSCode 的settings.json、keybindings.json放一起,这样整个编辑器配置都是可追溯、可复现的。

2.2 在新机器上批量安装

有了清单文件之后,在新机器上批量安装的套路也比较固定。如果目标机器是 Windows,而且你用的是 PowerShell,可以这样写:

Get-Content my-vscode-extensions.txt | ForEach-Object { code --install-extension $_ }

如果清单里带了版本号,上面这条命令也能直接工作,因为code --install-extension ms-python.python@2024.4.1这种写法 VSCode 是认的,它会在市场里找对应版本安装。但注意,如果带版本号的清单里某些版本在市场已经下架,安装就会失败。遇到这种情况,要么去掉版本号重新安装最新版,要么单独处理失败的插件。

macOS 或 Linux 上可以用 xargs 一行解决:

cat my-vscode-extensions.txt | xargs -n1 code --install-extension

我建议你在批量安装的时候加一条简单的失败记录逻辑。比如 PowerShell 版本改成:

Get-Content my-vscode-extensions.txt | ForEach-Object { Write-Host "Installing $_" code --install-extension $_ 2>&1 | Out-File -Append install-log.txt }

把安装日志落盘,装完以后扫一遍日志就知道哪些插件失败了,不用盯着屏幕一个个确认。这个习惯救过我很多次,尤其是在网络不稳定的时候。

2.3 补充:VSCode 自带的“设置同步”

其实 VSCode 本身内置了“设置同步”功能,登录微软账号或 GitHub 账号后,可以自动同步设置、键盘快捷键、扩展列表,甚至 UI 状态。如果你每个开发机器都能顺利登录同一账号,而且网络畅通,理论上换机后打开 VSCode 就会自动恢复插件列表。

但我个人的看法是:设置同步适合“个人日常换机”这个轻量场景,不适合“团队批量分发”和“内网离线环境”。因为账号同步依赖网络、依赖登录态,而且它同步的是“可用插件列表”而非“离线安装包”。在完全没有外网的内网机器上,你登录不了账号,设置同步也就无从谈起。再加上部分企业会禁用外部账号登录,所以掌握手动导出清单和离线安装包的方法,依然是更稳妥的底牌。

3. 方式二:把 VSIX 真正下载到本地

3.1 从官方市场手动下载 VSIX

如果你的目标是离线分发,那么清单显然不够用,必须拿到真正的 .vsix 安装包。最可靠的方式是从 Visual Studio Marketplace 手动下载。

操作方法很简单:打开 VSCode 扩展市场网页https://marketplace.visualstudio.com/vscode,搜索你要的插件,进入详情页。右侧有一个蓝色的“Download Extension”按钮,点一下就会下载一个 .vsix 文件。这里要注意,Marketplace 详情页面上还有一个“Install”按钮,那是给网页端用户点击后关联本地 VSCode 安装用的,不是下载离线包。要拿离线文件,认准 Download Extension。

关于插件市场的 URL 结构,你还需要知道一个小规律:每个插件的详情页地址都长成https://marketplace.visualstudio.com/items?itemName=publisher.extensionName的样子,比如 GitLens 就是https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens。这里publisher是发布者名称,extensionName是扩展名称,二者结合才构成全局唯一的插件 ID。在批量下载时,这个 URL 结构很有用,因为它可以直接通过拼接 URL 跳转到对应插件详情页。

另外,Marketplace 的详情页里通常还有一个“Version History”区域,可以查看历史版本并下载旧版本 .vsix。如果你需要锁定版本、复现旧环境,这条路径是首选。

3.2 从本机扩展目录直接找 VSIX?先说结论

很多人在了解“导出插件到本地”时第一反应是:插件都装在本机某个目录里,把那个目录拷贝出来不就行了?这里我必须说清楚一个容易踩坑的认知误区。

VSCode 扩展的安装目录在 Windows 下是%USERPROFILE%\.vscode\extensions,macOS 和 Linux 下是~/.vscode/extensions。我最初也以为里面存的是 .vsix 文件,结果进去一看,里面全是解压后的目录结构,每个插件的代码、资源、package.json 都被展开放在一个名为publisher.extension-版本号的文件夹里。比如:

~/.vscode/extensions/ eamodio.gitlens-14.5.1/ ms-python.python-2024.4.1/ esbenp.prettier-vscode-10.1.0/

所以,本机扩展目录里通常没有原始 .vsix 安装包。直接复制整个目录到另一台机器,理论上某些插件能跑,但我强烈不建议把它当作标准做法。原因有几个:第一,解压后的目录缺少 .vsix 的元数据和签名信息,VSCode 对扩展的完整性校验和版本管理会出问题;第二,不同平台、不同架构的二进制可能不一样,直接跨系统拷贝容易遇到“装上了但没法用”的情况;第三,这种目录里经常带着.obsolete文件,直接复制容易把旧版本残留一起带过去,造成扩展状态混乱。

那本机目录就没用了吗?也不是。在没法联网访问市场的极端内网环境下,把本地扩展目录整体打包作为“临时应急方案”是可行的。我做过一次,把整个~/.vscode/extensions打成 tar 包,拷贝到同平台、同体系结构的内网机器上解压,部分纯 JS 插件能工作。但它只能算应急,不能作为正式分发手段。正式离线分发,永远优先找 .vsix 文件。

3.3 批量下载 VSIX 的脚本化思路

如果你要导出几十个插件,一个网页一个网页手动点 Download Extension 效率太低,而且不知不觉就会漏掉一两个。正确的做法是把清单和市场 URL 规则结合起来,用脚本批量下载。

我这里给一个 Python 脚本的思路,它做的事很简单:读取插件清单,为每个插件构造市场页面 URL,解析页面里的下载链接,然后下载 .vsix 文件到本地目录。实际项目里,市场页面结构可能会有变化,所以脚本里用正则或者类库解析时要做好容错,避免单个插件解析失败导致整个脚本中断。

import requests import re import os with open('my-vscode-extensions.txt', 'r', encoding='utf-8') as f: lines = [line.strip() for line in f if line.strip()] os.makedirs('vsix-packages', exist_ok=True) for line in lines: ext_id = line.split('@')[0] publisher, ext_name = ext_id.split('.', 1) page_url = f'https://marketplace.visualstudio.com/items?itemName={publisher}.{ext_name}' try: resp = requests.get(page_url, timeout=30) resp.raise_for_status() # 页面里通常能找到 Download Extension 对应的链接 # 这里解析逻辑需要根据页面结构调整 download_match = re.search(r'https://[^"\']+\.vsix', resp.text) if download_match: vsix_url = download_match.group(0) file_name = f'{publisher}.{ext_name}-{line.split("@")[-1]}.vsix' if '@' in line else f'{publisher}.{ext_name}.vsix' with open(os.path.join('vsix-packages', file_name), 'wb') as f_out: f_out.write(requests.get(vsix_url, timeout=120).content) print(f'[OK] {ext_id}') else: print(f'[FAIL] no download link: {ext_id}') except Exception as e: print(f'[ERROR] {ext_id}: {e}')

这个脚本不是用来直接无脑运行的,它的核心价值是演示批量下载的思路:清单 → URL 构造 → 链接解析 → 下载落盘。你可以根据自己的实际情况调整解析规则和下载策略。在生产环境里,我更推荐直接用curl或 PowerShell 写一套更精简的批处理,因为 Python 脚本在无外网的机器上可能连 Python 都没装。

3.4 用命令行直接安装 VSIX 文件

VSIX 文件下载到本地后,安装方式有三种,我按习惯的推荐顺序列一下。

第一种,命令行安装。在终端里执行:

code --install-extension /path/to/ms-python.python-2024.4.1.vsix

这个命令会静默安装,安装完成后会有提示。如果目标 VSCode 里已经装了同插件的其他版本,需要覆盖安装的话加--force:

code --install-extension /path/to/ms-python.python-2024.4.1.vsix --force

第二种,UI 安装。打开 VSCode,按Ctrl+Shift+X打开扩展面板,点击右上角“...”菜单,选择“Install from VSIX...”,然后选择本地 .vsix 文件即可。

第三种,文件管理器安装。在 Windows 资源管理器或 macOS Finder 里右键 .vsix 文件,选择“Install Extension with VS Code”(实际上更多时候是双击后由 VSCode 关联打开)。这个方式最省事,但前提是系统里已经正确安装 VSCode 且 .vsix 文件关联成功。

离线批量安装时,最实用的是第一种命令行方式。把所有 .vsix 文件放到同一个目录下,然后写一个循环脚本,遍历目录、逐个安装。Windows PowerShell 下可以这样:

Get-ChildItem -Path ./vsix-packages -Filter *.vsix | ForEach-Object { code --install-extension $_.FullName --force }

Linux/macOS 下用 for 循环:

for vsix in ./vsix-packages/*.vsix; do code --install-extension "$vsix" --force done

我建议在批量安装前先检查一下 VSCode 版本和目标插件要求的兼容版本,避免装了之后才发现扩展被禁用。

4. 实操细节、安装前置与环境要求

4.1 离线安装前的版本匹配检查

离线安装和在线安装最大的区别在于,你没法临时去市场拉取依赖,也没法自动处理版本冲突。所以在执行批量安装之前,先确认两件事:第一,VSCode 本身是什么版本,扩展对 VSCode 版本的要求是什么;第二,插件之间有没有依赖关系,依赖的插件是否也被你导出了。

先说第一个。每个 .vsix 包内的package.json里都有一个engines.vscode字段,表示该扩展支持的最低 VSCode 版本。举个例子,某个扩展可能写着"engines": { "vscode": "^1.78.0" },这意味着要求 VSCode 版本至少是 1.78.0。如果你本机的 VSCode 是 1.76.0,安装时会提示“扩展与此版本的 VSCode 不兼容”,然后自动禁用。检查当前 VSCode 版本很简单,终端执行code --version即可,第一行就是版本号。

再说依赖关系。典型例子是微软的 Python 扩展ms-python.python,它依赖ms-python.vscode-pylance。如果只导出前者、漏掉后者,安装完成后 Python 插件的核心功能会缺失。查看一个扩展的依赖,可以在市场详情页的“Dependencies”和“Bundled Extensions”里看到。批量导出时,建议把依赖插件一并加入清单。我的做法是:在导出清单前,先逐一点开本轮需要导出的插件详情页,把 dependencies 里的插件 ID 记下来,和主插件一起导出。

4.2 不同平台插件的特殊处理

在线安装时,VSCode 会自动下载匹配你操作系统和 CPU 架构的插件版本。离线安装时,这个选择就得你自己负责了。像ms-vscode.cpptools这类含有原生二进制的扩展,Windows 的 .vsix 里可能包含win32-x64的二进制,Linux 平台可能要选包含linux-x64的包。不同的发布者处理方式不同,有些扩展会把所有平台的文件都打进同一个 .vsix,安装时自行选择对应二进制;有些则会根据访问来源给你不同的 .vsix 下载链接。离线分发时,建议先在一台目标机器上试装一个典型插件,确认能正常加载,再做全量分发。

另外要特别注意“语言包”这类特殊插件。中文语言包ms-ceintl.vscode-language-pack-zh-hans和普通插件一样导出即可,但它的安装状态通常不影响其他插件。如果你的团队有国际化需求,最好把语言包也纳入导出清单。

4.3 版本锁定与后续更新策略

导出到本地的最终目的,不只是“装上一次”,还包括“后续怎么维护”。我实践下来的经验是:本地 .vsix 目录应该按照“日期+用途”来管理。比如:

vsix-backup/ 2024-06-01-work/ ms-python.python@2024.4.1.vsix ms-python.vscode-pylance@2024.4.1.vsix shared/ esbenp.prettier-vscode@10.1.0.vsix

这样做的原因是,插件版本会持续迭代,而你导出的备份是某个时间点的快照。如果三个月后某个插件升级出问题,你想回退到旧版本,有了按日期整理的目录,直接翻历史快照就行。同时,清单文件也应该和 .vsix 文件放在同一个目录下,文件名保持一致。

再说更新策略。离线安装后,VSCode 的扩展自动更新机制一般不会生效,因为自动更新需要连市场查询版本。这反而给版本锁定带来了便利:离线装好的插件,不会在你不知情的情况下偷偷升级。对内网生产环境来说,这其实是优点。但如果你用的是在线安装的清单方式,插件就会跟着市场自动更新。要锁版本的话,可以在 VSCode 设置里找到extensions.autoUpdate,把值改为false,或者在清单安装时统一使用带版本号的命令格式。

5. 常见问题与排查记录

5.1 code 命令找不到怎么办

这是出现频率最高的问题。换了新机器、装完 VSCode 后,在终端输入code --version直接报错“command not found”。原因多半是安装时没有把 VSCode 的 bin 目录加入 PATH。

解决办法,Windows 系统可以在安装时选择“将‘Code’操作添加到 PATH”这个选项,安装完就有code命令;如果已经安装完毕,可以打开 VSCode 的安装目录,找到bin文件夹下的code.cmd,手动把它所在目录加到环境变量 PATH 里。macOS 比较特殊,VSCode 默认不会自动注册code命令。你需要打开 VSCode,按Cmd+Shift+P,输入Shell Command: Install 'code' command in PATH,执行后code命令就生效了。Linux 用官方 .deb 或 .rpm 包安装通常会自动注册,用 AppImage 则可能需要自己添加软链接。

另外一个小细节:如果你在 VSCode 的内置终端里用code命令,它通常一定可用,因为内置终端会继承 VSCode 的 PATH。所以排查命令问题时,先在内置终端里试一下,再回系统终端里试。

5.2 安装了 VSIX 但扩展不出现、被禁用

这个问题也很常见。装完 .vsix 后在扩展面板找不到该插件,或者插件显示“被禁用”状态。

大概率是版本不匹配。点击被禁用的扩展,它会告诉你原因,最常见的就是“This extension is not compatible with this version of Visual Studio Code”。这时候不要盲目找其他版本,先去查目标机器 VSCode 的版本号,再去市场页面找到该扩展的 Version History,选一个支持当前 VSCode 版本的 .vsix 重新安装。

另一种情况是扩展被 VSCode 标记为“废弃”(Deprecated)。有些扩展因为功能合并或发布者停止维护,在市场详情页会提示废弃。这类扩展即使离线装上了,VSCode 也可能强制禁用。遇到这种,我的建议是找替代扩展,而不是硬装。比如很多格式化插件合并到了 Prettier,再单独装旧的格式化扩展就没意义了。

还有一种情况是安装完成后没有重启窗口。VSCode 里插件激活通常需要重新加载窗口,按Ctrl+Shift+P执行Developer: Reload Window试试。别小看这一步,我第一次离线装完插件出现“已下载但未激活”状态时,就是这个操作解决的。

5.3 批量安装时部分插件安装失败

批量脚本跑完,一看日志几十个插件里有两三个失败。这种情况不用慌,看日志定位原因。常见原因有:网络超时、插件 ID 拼写大小写不一致、带版本号的插件在市场上已下架、目标平台不匹配。

我的处理方式是把失败的插件单独圈出来,逐个手动安装。手动安装时优先去市场页面点 Download Extension,下载时注意页面提示的版本和历史版本列表。如果是网络问题,可以把脚本里的连接超时调长一点,或者在目标机器上换一个网络环境再试。

另外,批量脚本失败后重新跑一遍,VSCode 不会对已安装的插件重复执行破坏性操作,它通常只是提示已安装最新版本。所以脚本可以放心重跑,不会产生副作用。

5.4 扩展目录里没有 VSIX,只有解压文件夹

之前说过,本机~/.vscode/extensions下面存的是解压后的扩展文件夹,不是 .vsix。有些插件内部会自带一个子 .vsix 文件,但那不是完整的安装包,通常只是插件内部的某个资源。要导出真正的 .vsix,正确路径是去市场页面下载。确实离线又确实访问不了市场的情况下,把整个扩展目录打包拷到同平台机器属于“最后的应急手段”,但要在交付文档里明确标注这是应急包,不是标准安装包。

5.5 内网机器能装 VSIX 但无法使用依赖的编译器

最后说一个经常被忽略的问题:插件本身装上了,但插件依赖的“外部程序”没有安装,导致插件功能跑不起来。典型的比如 C/C++ 扩展需要本机有编译器,Python 扩展需要 Python 解释器,Java 扩展需要 JDK。这些并不是插件能解决的,离线分发时,必须把 SDK、编译器、运行时这些一并纳入环境准备清单。

我做团队环境标准化时,会专门准备一份“环境依赖说明”,把插件清单和系统依赖分开列:哪些用 .vsix 装,哪些需要手动装 SDK,写在同一个 README 里。这样新入职的同事照着文档操作,十分钟就能把环境拉齐,而不是装完插件后对着报错一头雾水。

我自己现在的工作流是这样:换机时把带版本号的插件清单放进 dotfiles 仓库;做内网环境时,额外跑一遍批量下载脚本把 .vsix 归档到共享目录,顺便写一份依赖说明。这套流程不算复杂,但能把“装插件”这种看起来的小事变成可复现、可审计的工程动作。希望这篇分享能帮你少踩几个坑,特别是版本和依赖这两个最容易出问题的环节,一定要提前规划好。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 16:52:28

UPX脱壳与base62解码:BUUCTF逆向题[GUET-CTF2019]re解析

刷完几道简单题就兴冲冲点开 BUUCTF 的 reverse 列表,看到[GUET-CTF2019]re这种短名字,我第一反应是:又来一道送分题。结果从晚上八点折腾到凌晨一点,中途一度怀疑自己是不是真的适合搞逆向。卡住我的不是复杂算法,而是…

作者头像 李华
网站建设 2026/10/7 16:48:43

Windows下MPI并行计算实战:mpiexec.exe原理与常见问题排查

如果你是在Windows上刚开始接触并行计算,大概率会遇到这种情况:程序装好了、代码编译通过了,可一跑就卡在一条命令上——mpiexec.exe。MPI(Message Passing Interface,消息传递接口)标准本身不复杂&#xf…

作者头像 李华
网站建设 2026/10/7 16:46:53

Django后端开发实战:微信小程序档案管理服务搭建

做了两年多小程序,我越来越觉得:微信小程序这层壳其实不难,难的是背后那套能支撑业务的数据服务。这次分享的“档案宝”正是这样一个项目——前端是原生微信小程序,后端用Django搭了一套完整的档案管理服务,涵盖档案录…

作者头像 李华
网站建设 2026/10/7 16:46:09

MODIS地表温度数据处理全流程:QC解析、坐标配准与不确定性量化

简介:本资源为2022年中国全域1km分辨率地表温度(LST)空间分布数据集,基于NASA MODIS MOD11A2产品加工生成,面向遥感、地理信息、生态与气候研究领域的科研人员及GIS初学者,支撑区域热环境分析、城市热岛评估…

作者头像 李华
网站建设 2026/10/7 16:45:38

Linux线程详解:从pthread创建到同步互斥与死锁排查

刚接触Linux线程时,我犯过一个特别低级的错误:在线程入口函数里直接操作了一个全局变量,两个线程同时跑,结果那个计数器忽大忽小,跟抽风一样。后来慢慢啃完概念、踩过死锁的坑,才算摸清这套东西的脾气。今天…

作者头像 李华