搞嵌入式开发的同学,尤其是用Arduino做项目的老手,应该都遇到过这种尴尬:手头一台新电脑,或者实验室、公司内网一台完全没外网权限的机器,想装个VSCode加PlatformIO来写代码,结果卡在“下载平台包”“下载工具链”这种地方,一卡就是半小时,最后直接失败。网上搜“PlatformIO离线安装”,翻来覆去就是“复制粘贴.pio目录”这种零散思路,根本不成体系。我自己在离线环境里折腾过无数次,从Windows到Linux都有,整理出了一套能在绝大多数机器上复现、成功率接近百分百的离线安装流程。这篇就把整个思路、步骤、踩坑记录全部分享出来,照着抄就行。
这套方案面向的读者很明确:被内网限制、网络不稳定、或者干脆没有外网的嵌入式开发者,以及想在课堂、实验室里批量部署Arduino开发环境的教学场景。文章不扯大道理,直接讲清楚“缺什么”“从哪弄”“怎么装”。
1. 离线安装的核心痛点在哪儿
先说结论:Arduino + VSCode + PlatformIO这“三件套”的离线安装,真正的难点从来不是VSCode本身,而是PlatformIO的依赖下载。VSCode就是个普通的桌面软件,官网下载离线安装包就能装,扩展插件也可以下载VSIX文件手动安装。但PlatformIO不一样,它分为IDE插件和Core命令行工具两层,Core在启动时会根据工程配置去拉取对应的平台包、工具链、编译器、烧录工具,这一层才是真正的“联网重灾区”。
1.1 “三件套”的依赖关系
很多人搞不清楚这三者的关系,先说清楚:
- Arduino:指Arduino生态,包含Arduino硬件、Arduino框架、库文件,以及你熟悉的
arduino-avr-core这类底层工具。 - VSCode:编辑器外壳,本身不包含任何编译能力,全靠扩展插件来干活。
- PlatformIO:由
platformio IDE插件(装在VSCode里)和platformio Core(命令行工具)组成。IDE插件负责界面交互,Core负责真实的工程管理、依赖解析、编译上传。
离线安装PlatformIO,本质是两件事:一是把IDE插件这个VSIX包装进去,二是把Core运行时所有需要的平台包、工具链预先准备好,让Core在断网情况下也能创建工程、编译代码。
1.2 为什么直接在目标机器上装PlatformIO十有八九会卡住
直接在有网的机器上装PlatformIO,过程看起来很顺畅——装插件、打开工程、点击“Build”,然后就等它自动下载。但这套流程在离线环境下断在每一步都可能:
第一次打开PlatformIO插件,它会尝试下载PlatformIO Core的安装包;创建工程时会拉取platforms和toolchains;编译时SDK、编译器、烧录工具、Python依赖一个接一个地下载,任何一个超时都会导致失败。最麻烦的是PlatformIO对下载的完整性和校验工作要求很高,下载到一半断了,它不会自动从断点续传,而是清理掉重新下,在弱网环境下基本是死循环。我见过不少人卡在“Please wait, installing PlatformIO”这个界面几个小时,最后只能关掉。
所以,离线安装的正确思路应该是:在任意一台有网络的机器上(哪怕是临时的虚拟机)先把所有依赖下载齐全,再把整套环境原样搬到目标机器。下面这套方案就是围绕这个思路展开的。
2. 离线安装方案选型与整体设计
2.1 最小可行方案:只装能用的
先确认目标机器上到底需要什么,避免一次性拉一大堆用不到的东西。我的经验是先明确目标开发板型号、框架、第三方库列表。比如你只做一块ESP32开发板的Arduino开发,那需要准备的其实是espressif32平台及其对应的工具链、arduino框架、一个串口驱动(比如CH340或CP210x),外加你用的第三方库。硬要把所有平台全部打包,体积会膨胀到几十个GB,而且很多包在离线环境下压根用不上,纯粹浪费时间。
2.2 版本匹配是离线安装的关键
离线安装最头疼的就是版本问题。PlatformIO Core或者说整个Arduino生态有一个特点:不同版本的平台包对应不同版本的工具链,互不兼容。所以,必须严格锁版。
什么方式锁版最稳?我在每台机器上都固定使用platformio.ini里的版本声明。在有网机器上先确定好全套依赖的确切版本号,然后在目标机器上按同样的版本来验证。这里的关键是:不要用最新版,尽量用自己验证过组合可行的那组版本。比如我之前实测过的一套稳定组合是:
| 组件 | 版本 |
|---|---|
| PlatformIO Core | 6.1.16 |
| Espressif32平台 | 6.7.0 |
| Arduino框架(espressif32) | 3.0.7 |
| VSCode | 1.90以上 |
| PlatformIO IDE插件 | 3.3.3 |
这个组合不一定适合所有人,但它能说明问题:版本锁死以后,离线环境的迁移会简单一个量级。因为Core在解析平台依赖时,会优先读取platforms/espressif32/platform.json里声明的版本范围,只要包管理器本地已经有对应版本,它就不会联网去找。
2.3 离线包完整清单
下面这份清单是核心中的核心。准备离线安装包时,至少要包含:
- VSCode安装包:Windows下是
.exe,Linux下是.deb或.tar.gz,建议去官网下载稳定版。 - PlatformIO IDE插件VSIX:这是VSCode扩展的安装文件。下载方式有几种:在VSCode Marketplace网页找到插件页,选择Download Extension;或者有网机器上直接用
code --install-extension platformio.platformio-ide装一下,扩展会缓存在本地; - PlatformIO Core运行时包:完整的
~/.platformio(Windows下是C:\Users\用户名\.platformio)目录,里面包含penv(Python虚拟环境)、platforms、packages、cache等。 - 第三方库文件:放好到
lib目录或做成pio lib的离线包格式。 - 串口驱动安装包:这是很多人容易漏掉的。Windows下CH340、CP210x驱动是必须的,否则后面上传程序会卡在“找不到串口”。
清单准备好以后,就可以在有网机器上开始制作离线包了。
3. 在有网机器上制作离线安装包
这里我把完整的“造包”过程写一遍。假设你手头有一台能正常访问外网的Windows机器,且已经装好了Python 3.9以上版本。
3.1 下载VSCode安装包与PlatformIO扩展VSIX
VSCode的安装包没啥好说的,去官网下就行。比较关键的是拿到PlatformIO插件的VSIX文件。一个比较快的拿法:
- 打开VSCode的扩展市场网页,搜索“PlatformIO IDE”;
- 在右侧点“Download Extension”,会下载到
.vsix文件; - 把这个VSIX文件保存到移动硬盘或者U盘。
如果你所在环境连VSCode市场网页都打不开,还有一个办法:在有网机器上执行:
code --install-extension platformio.platformio-ide然后去VSCode的扩展目录下找回VSIX的缓存副本。Windows路径一般是:
C:\Users\用户名\.vscode\extensions\platformio.platformio-ide-3.3.3\这个目录虽然已经解压过了,但你可以重新打包成VSIX,方法是在该目录下执行:
npx @vscode/vsce package不过说实话,这个流程没必要搞复杂,直接在网页端拿VSIX最省事。
3.2 安装PlatformIO Core并预下载全部平台依赖
这一步是整套离线方案的核心。我的做法是:
- 先在有网机器的命令行里安装PlatformIO Core:
pip install platformio装完查看版本:
pio --version这一步会把~/.platformio/penv这个Python虚拟环境也建出来,里面包含了pio运行所需的全部Python依赖。
- 临时创建一个测试工程,声明要用的板子、框架、库:
[env:esp32dev] platform = espressif32@6.7.0 framework = arduino board = esp32dev lib_deps = adafruit/DHT sensor library@1.4.4- 在有网状态下运行:
pio project init pio run这一步会触发PlatformIO下载完整工具链:platform(平台主包)、toolchain-xtensa-esp32、esp32工具链SDK、烧录工具、Python调试工具等。第一次会比较久,但只有这一次。等编译成功后,~/.platformio下面的内容就是一套可以整体搬走的“离线环境”。
- 把第三方库也下载好,塞进
lib目录,或者在~/.platformio/lib下面确认已经缓存。
3.3 打包与转移离线包
离线环境制作完成后,把~/.platformio目录整体压缩,再加上VSCode安装包、VSIX插件文件、串口驱动,一起拷到目标机器。这里有一个重要细节:压缩前先把~/.platformio/cache清掉一部分不用的缓存,否则体积容易虚胖。cache里是下载过的中间文件,迁移时其实用不到,保留platforms、packages、penv、lib即可。
其实还有个更轻量的做法,只打包你需要的部分:
- 保留
~/.platformio/platforms/下用到的平台(如espressif32); - 保留
~/.platformio/packages/下对应工具链; - 保留
~/.platformio/penv/完整目录; - 保留
~/.platformio/lib/下面的库缓存。
其他的平台、无关的包、cache都可以删掉,体积能从十多个G减到2G左右。我们实际部署时,一个只含ESP32+Arduino环境的最小离线包大约在1.5GB到2GB之间,完全能放U盘。
4. 目标机器上的完整安装实操
到了目标机器上,按顺序操作。注意:目标机器最好是全新环境,或者确认没有安装过PlatformIO,避免旧配置干扰。
4.1 安装VSCode与离线扩展
先安装VSCode。Windows下双双击VSCodeSetup.exe,建议勾选“添加到PATH”,后面命令行的使用会方便很多。安装完成后,在VSCode扩展面板的右上角,点开“...”,选择“Install from VSIX...”,选中拷贝进来的platformio.platformio-ide-3.3.3.vsix,几秒就装好。
这一步要确认扩展确实生效:按Ctrl+Shift+P,输入PlatformIO: Home,如果能看到PlatformIO Home界面正常打开,说明插件本体没问题。注意,先别急着建工程,因为这时候Core还没就位。
4.2 配置PlatformIO Core离线环境
我们刚才拷贝过来的~/.platformio目录,现在要放到目标机器的用户目录下。Windows上通常是:
C:\Users\你的用户名\.platformio直接把整个.platformio目录移动过去,不要改名字。关键点来了:因为~/.platformio/penv里面的Python虚拟环境路径是在有网机器上生成的,里面有些pyvenv.cfg和脚本里的路径可能是写死的。稳妥的做法是改掉路径后重新激活试试。
如果你只是换用户,路径结构完全一致,直接能跑;如果换了盘符或用户名,常见问题是home路径带了老用户名。遇到这种情况,打开C:\Users\新用户名\.platformio\penv\pyvenv.cfg,检查里面的home键指向是否正确,通常把这一项改成目标机器Python安装路径即可。同时检查penv\Scripts下所有.exe是否被系统拦截,有些杀毒软件会误删python.exe和platformio.exe,需要加白名单。
验证Core是否可用,在命令行执行:
pio --version如果能正常输出版本号,说明Core已经跑起来了。
4.3 离线创建工程并编译
Core能用之后,在VSCode里打开一个空文件夹,通过PlatformIO Home创建一个新工程。但离线环境下的新工程向导可能会出现卡顿,我教大家一个更稳的方式:手动创建工程目录结构。
工程目录如下:
MyProject/ ├── platformio.ini ├── include/ ├── lib/ ├── src/ │ └── main.cpp └── test/platformio.ini示例:
[env:esp32dev] platform = espressif32@6.7.0 framework = arduino board = esp32dev monitor_speed = 115200main.cpp随便写下Arduino代码,比如:
#include <Arduino.h> void setup() { Serial.begin(115200); } void loop() { delay(1000); Serial.println("Hello offline PlatformIO"); }然后在VSCode里打开这个文件夹,PlatformIO插件会自动识别工程。点底部状态栏的“Build”按钮(或者命令行里执行pio run),编译过程是完全离线的,整个过程不会请求外网。
第一次编译可能会比平时慢,因为Core要解压工具链、建立索引。但结束后,.pio\build\esp32dev\firmware.bin这个固件文件就生成了。只要这一步成功,离线安装的核心也就成功了。
4.4 上传烧录与串口监视
编译成功后,板上才能写入固件。此时先把开发板通过USB连到电脑,安装好串口驱动(CH340或CP210x)。然后在platformio.ini里确认upload_port是否指定,一般建议手动指定,避免多个串口冲突:
upload_port = COM7 monitor_port = COM7点状态栏的“Upload”按钮,或者命令行执行:
pio run -t upload如果一切正常,控制台会输出“Connecting....”然后开始烧写。烧完以后,打开串口监视器(状态栏的“Serial Monitor”图标),能看到板子发来的Hello信息。
5. 常见问题与排查技巧实录
离线安装PlatformIO说起来简单,但实际执行中总是有一堆小问题。下面是我实操中踩过的高频坑,按现象分类整理成速查表:
| 现象 | 直接原因 | 解决办法 |
|---|---|---|
| PlatformIO Home打不开 | Core未识别或环境变量问题 | 检查pio --version;确认.platformio路径;重启VSCode窗口 |
编译时提示Unknown platform或Please add platform | 平台包没有完整拷入 | 检查~/.platformio/platforms下面有没有对应平台目录 |
Build时提示toolchain not found | packages缺失或版本不符 | 检查~/.platformio/packages;和造包机器对比目录结构 |
上传时报No serial port found | 串口驱动没装、板子没识别、端口被占用 | 装CH340驱动;重新插拔USB;换一个COM口;在platformio.ini里手动指定端口 |
| 扩展右下角提示“PlatformIO needs to be installed” | VSCode的扩展和Core分离状态不对 | 确认pio命令可用;手动重启VSCode;必要时卸载扩展重装VSIX |
| Python运行时版本报错 | penv复制后Python路径变了 | 检查pyvenv.cfg里的home;或用本机Python重新pip install platformio后把platforms/packages拷过去 |
5.1 “Please wait…”卡死问题
这是最经典的问题。打开PlatformIO插件后,右下角一直转圈,提示“Please wait, installingPlatformIO Core”。原因是扩展程序检查Core不存在,试图联网下载,但网络又不通。解决思路很简单:先满足它的检查条件——把Core完整装好且pio命令在全局PATH可用——然后重启VSCode。只要Core的版本信息和插件期望一致,它就不会再去联网安装。如果仍然卡死,检查是否插件在尝试更新Core版本,可以在VSCode设置里搜索platformio-ide.autoUpdate,关掉自动更新。
5.2 编译时提示找不到工具链
最常见的是编译到一半报错:
Error: Could not find the package with 'toolchain-xtensa-esp32' requirements这个直接指向的问题就是packages目录不完整。PlatformIO的包管理器不是一次性把所有工具链都下载,而是按平台声明按需下载。造包机器上如果没有成功编译过,那它就不会下载对应工具链。所以我在前面专门强调:必须在有网机器上真正完成一次pio run,这一步是确定所有依赖完整性的关键。
5.3 上传失败或串口不识别
上传失败的原因里,很大比例不是PlatformIO本身,而是串口驱动没装。Windows 10以后系统一般会自动装常见的USB转串口驱动,但国内很多便宜板子用的是CH340,系统经常识别成未知设备。手动把CH340驱动装上,再看设备管理器里是不是多了一个“COM口”。还有一点容易忽略:部分有线USB口供电不足,板子连接后串口识别了但烧录时断连,这时候换一个USB口或换根短数据线,能解决大部分诡异问题。
5.4 其他零散坑点
- 杀毒软件误删:PlatformIO的
penv和packages目录里有大量可执行文件,某些杀毒软件会当作风险处理。离线部署时建议先把杀毒软件退出,装完后加白名单。 - 路径带中文:工程路径、用户名路径如果带了中文,某些工具链在解析时会出问题,编译报错还没头绪。最好统一用英文路径,这是老经验但依然有效。
- VSCode版本太旧:PlatformIO插件更新较快,太旧的VSCode版本可能兼容不上,插件会直接拒绝启动。离线环境下建议直接用VSCode官方最新稳定版,避免这层问题。
- 移动硬盘供电:把离线包从U盘或移动硬盘直接解压时,偶尔会解压出错。压缩包最好先放到本地磁盘再解压,U盘读取出错率比想象中高。
最后说一点我个人的心得。离线安装这东西,很多人一开始想的都是“找一个精简的方案,少拷点东西”,但实际操作下来,最省时间的反而是“在有网机器上完整跑一遍,原样搬走”。因为PlatformIO的默认目录结构混乱、版本依赖多,手工拼装很容易漏掉某一块,出了问题排查反而更花时间。这套流程我前前后后在不同电脑上部署过不下二十次,只要能严格按步骤走,报告“99%成功”并不夸张。唯一一次失败是目标机器连公共库都缺失(Windows Server Core这种极度精简系统),先装了基础运行库后问题也解决了。如果你只是在一台普通的Windows或Ubuntu机器上部署,放心照着走,基本不会出幺蛾子。