ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ESP32开发环境搭建:VSCode+PlatformIO避坑指南

ESP32开发环境搭建:VSCode+PlatformIO避坑指南 1. 为什么我最终选了VSCode加PlatformIO这套组合嵌入式开发这行干了快八年从早期的Keil、IAR到后来的Arduino IDE再到现在的VSCode加PlatformIO工具链的迭代速度比我换键盘的速度还快。ESP32这颗芯片刚火起来那阵子身边不少朋友都在问同一个问题到底用什么环境开发最省心我的答案一直没变过——VSCode配PlatformIO也就是圈子里常说的PIO。这套组合最大的好处是把代码编辑、库管理、编译烧录、串口监视全部塞进一个窗口里不用在多个软件之间反复横跳。尤其对于ESP32这种依赖大量第三方库的芯片PIO的库依赖自动解析机制能省掉大量手动配置的时间。但话说回来这套环境搭建的过程并不总是一帆风顺。我自己第一次装的时候卡在插件安装环节整整一个下午后来帮同事配环境又遇到过Python路径冲突、平台包下载超时、串口驱动识别不到等各种幺蛾子。网上很多教程写得过于理想化仿佛点几下鼠标就能跑通实际操作的坑只有踩过的人才知道。这篇内容就是把我这些年反复搭建ESP32开发环境积累的经验整理出来从零开始一步步走重点讲清楚每个环节容易出问题的地方以及怎么绕过去。不管你是刚接触ESP32的新手还是从Arduino IDE转过来的老玩家只要跟着这个思路走基本能避开九成以上的常见问题。我尽量把每个步骤背后的原因也讲明白这样遇到变体情况时你自己也能判断该怎么处理而不是死记硬背操作顺序。1.1 这套环境到底解决了什么问题先说说为什么不用Arduino IDE。Arduino IDE确实上手快安装包一装就能写代码但它有几个硬伤代码补全基本靠猜大型项目文件管理混乱库版本冲突时排查困难而且串口监视器和编辑器是分离的。ESP32项目稍微复杂一点比如要同时用WiFi、蓝牙、文件系统Arduino IDE的短板就暴露得很明显。PlatformIO本质上是一个构建系统它跑在VSCode里面但独立管理自己的工具链。你可以在一个工作区里放多个项目每个项目可以指定不同的开发板、不同的框架、不同的库版本互不干扰。这一点对于同时维护多个ESP32项目的开发者来说非常关键。举个例子你手上有一个基于Arduino框架的老项目和一个基于ESP-IDF的新项目用Arduino IDE就得来回切换版本用PIO只需要建两个工程目录各自配置各自的平台版本就行。VSCode本身作为编辑器代码补全、跳转定义、Git集成这些功能都是现成的配合PIO插件后编译和烧录的快捷键也很顺手。底部状态栏会显示当前开发板型号、串口号、编译状态点一下就能切换比在菜单里翻半天效率高得多。1.2 适合哪些人参考这篇内容如果你符合下面任意一条这篇内容应该能帮到你刚买了一块ESP32开发板不知道从哪开始搭环境之前用Arduino IDE想换到更专业的工具链但怕折腾装PIO时遇到过各种报错搜了半天没找到靠谱的解决方案需要在多台电脑上重复搭建环境想要一个标准化的流程。我会把每一步的操作意图和可能出现的异常都写清楚你照着做的时候心里有底。2. 安装前的准备工作与版本选择逻辑很多人装环境失败根源不在安装过程本身而在于准备工作没做对。我见过太多案例是电脑上已经装了四五个Python版本PATH变量乱成一锅粥然后PIO装上去之后找不到正确的解释器直接罢工。所以这一章先把准备工作讲透后面安装环节就能顺很多。2.1 VSCode的下载与安装要点VSCode的安装本身没什么难度去官网下载对应系统的安装包一路下一步就行。但有几个细节值得注意。Windows系统下安装程序会问你要不要添加到PATH这个选项一定要勾上否则后面命令行调用code命令会找不到。另外安装路径尽量不要选带中文或空格的目录虽然VSCode本身对中文路径的兼容性已经好了很多但PIO在调用底层工具链时偶尔会因为路径问题出岔子能避则避。安装完成后第一次启动建议先把界面语言切成中文。打开扩展面板搜索Chinese安装官方那个简体中文语言包重启后界面就变成中文了。这一步不是必须的但如果你英文阅读速度一般切成中文能减少很多误操作。接下来把自动更新检查一下确保VSCode是最新版本因为PIO插件对VSCode的版本有一定要求太老的版本可能装不上最新插件。还有一个容易被忽略的点VSCode的扩展市场在国内访问有时候不太稳定如果搜索插件时一直转圈可以尝试在设置里配置代理或者换个时间段再试。这个不是PIO本身的问题但会直接影响你的安装体验。2.2 Python环境的处理策略PlatformIO的核心是用Python写的所以它依赖一个可用的Python解释器。这里有个关键决策是用系统自带的Python还是让PIO自己管理一个独立的Python环境我的建议是后者。PIO插件在安装时会自动下载一个内置的Python解释器通常是虚拟环境形式放在用户目录下的.platformio文件夹里。这样做的好处是跟系统的Python完全隔离不会因为系统Python升级或者装了其他包而产生冲突。但问题来了如果你电脑上已经装了Python并且PATH里配置了多个版本PIO在初始化时可能会误判。我遇到过一次系统里同时有Python 3.8和3.11PATH里3.8在前结果PIO用了3.8但某个依赖包只支持3.9以上编译时直接报语法错误。排查了半天才发现是解释器版本的问题。所以我的做法是在安装PIO之前先确认系统PATH里只有一个Python版本或者干脆把Python从PATH里临时移除让PIO完全使用自己内置的解释器。等PIO装好并验证能用之后再把系统Python加回去。这样能最大程度避免版本冲突。如果你确实需要用系统Python来做其他事情那就在VSCode的设置里明确指定PIO使用的Python路径。打开设置搜索platformio找到platformio-ide.pythonPath这个选项填上你希望PIO使用的Python可执行文件完整路径。这个设置优先级高于自动检测能强制PIO用你指定的版本。2.3 驱动与串口工具的提前准备ESP32开发板通常通过USB转串口芯片跟电脑通信常见的芯片有CP2102、CH340、FTDI等。不同芯片需要不同的驱动。Windows 10和11一般能自动识别CP2102和FTDI但CH340有时候需要手动装驱动。如果你插上开发板后设备管理器里出现带黄色感叹号的未知设备大概率就是驱动没装好。我的习惯是在搭建环境之前先把开发板插上打开设备管理器确认串口能正常识别。Windows下看“端口”分类里有没有出现类似“Silicon Labs CP210x USB to UART Bridge”或者“USB-SERIAL CH340”的设备。Mac系统下用ls /dev/tty.*命令看有没有新增的串口设备。Linux下用ls /dev/ttyUSB*或者ls /dev/ttyACM*。确认串口能识别之后再开始装PIO这样后面配置烧录时就不会因为找不到串口而卡住。另外建议装一个独立的串口终端工具作为备用比如Windows下的Putty或者MobaXtermMac下的screen命令。有时候PIO的串口监视器会因为各种原因连不上用独立工具能快速判断是硬件问题还是软件问题。3. PlatformIO插件的安装与初始化配置准备工作做完正式进入安装环节。这一章会详细讲PIO插件的安装过程、首次初始化的注意事项以及如何验证安装是否成功。3.1 插件安装的两种方式与选择建议在VSCode里安装PIO插件有两种方式。第一种是在扩展面板直接搜索PlatformIO IDE点击安装。第二种是通过命令行用code --install-extension platformio.platformio-ide命令安装。两种方式效果一样但第一种更直观适合新手。安装过程中VSCode底部状态栏会出现一个进度提示显示正在下载PIO Core。这个下载量大概在几十兆到一百多兆之间取决于你的网络情况。如果进度条卡住不动大概率是网络问题。PIO Core的下载源在国外国内访问有时候会比较慢。遇到这种情况可以尝试以下几个方法一是换个网络环境比如从WiFi切到手机热点二是等一段时间再试有时候是临时性的网络波动三是在PIO的设置里配置镜像源。关于镜像源的配置PIO支持通过环境变量或者配置文件来指定包下载的镜像地址。具体操作是在用户目录下找到.platformio文件夹里面有个platformio.ini或者可以通过系统环境变量PLATFORMIO_CORE_DIR来指定核心目录。更常用的方式是在项目级的platformio.ini里配置board_build.f_cpu等参数但镜像源的配置需要在全局层面做。我一般是在系统环境变量里加一个HTTP_PROXY和HTTPS_PROXY指向本地可用的代理地址。注意这里说的代理是指网络代理用于加速下载跟其他无关。如果下载实在完不成也可以考虑离线安装。PIO的GitHub仓库有发布离线包下载后手动放到指定目录。不过这种方式比较麻烦除非网络环境实在受限否则不建议走这条路。3.2 首次初始化的关键步骤插件装好之后VSCode左侧活动栏会出现一个蚂蚁头图标那就是PIO的入口。点击它会打开PIO的主页第一次使用会提示你初始化。初始化的过程主要是下载平台包和工具链包括编译器、烧录工具、调试工具等。对于ESP32来说需要下载的是espressif32平台包里面包含了xtensa-esp32的GCC工具链。这个初始化过程可能是整个搭建流程中最耗时的一步。平台包的大小在几百兆左右加上工具链总共可能要下载1GB以上的数据。网络好的话十几分钟网络差的话可能要一个小时甚至更久。我的建议是找个网络稳定的时间段泡杯茶慢慢等不要中途中断否则可能留下不完整的缓存文件后面还得手动清理。初始化完成后PIO主页会显示已安装的平台和开发板列表。你可以在这里看到espressif32平台的状态如果显示已安装说明核心组件就绪了。3.3 验证安装是否成功的三个检查点装完之后怎么确认一切正常我一般做三个检查。第一在VSCode里按CtrlShiftP打开命令面板输入PlatformIO看能不能看到一系列PIO相关的命令比如Build、Upload、Monitor等。如果能正常显示说明插件加载成功。第二打开PIO主页看Platforms列表里espressif32是否显示为已安装状态版本号是多少。第三新建一个最简单的ESP32工程写一个空的setup和loop函数点编译按钮看能不能顺利编译通过。这三个检查都过了环境基本就没问题了。如果编译时报错说找不到工具链那可能是平台包没下载完整。解决办法是在PIO主页里找到espressif32平台点卸载然后重新安装。有时候是缓存文件损坏导致的清理.platformio文件夹下的packages目录再重装也能解决。4. 创建第一个ESP32工程与核心参数配置环境搭好了接下来创建一个实际能跑的工程。这一章会从工程创建开始讲到platformio.ini的配置、代码编写、编译烧录的完整流程。4.1 新建工程的正确姿势在PIO主页点击New Project会弹出一个向导。Name填工程名比如esp32_blink_test。Board这一栏很关键需要选择你的开发板型号。PIO支持搜索输入esp32会列出很多选项。常见的通用选项是Espressif ESP32 Dev Module如果你用的是特定厂家的板子比如DOIT ESP32 DEVKIT V1或者NodeMCU-32S也可以直接搜到。选错开发板会导致编译时的引脚定义和Flash参数不匹配虽然有时候也能跑但可能出现莫名其妙的问题。Framework选择Arduino或者ESP-IDF。对于新手我建议先用Arduino框架上手快库多社区支持好。Location选一个你习惯存放代码的目录路径同样避免中文和空格。点Finish后PIO会自动生成工程结构包括src目录、lib目录、platformio.ini配置文件等。工程创建过程中PIO可能会再次下载一些依赖比如框架包。如果之前初始化时已经下载过这里会很快。如果卡住还是网络问题参考前面的处理方法。4.2 platformio.ini配置文件详解platformio.ini是整个工程的核心配置文件所有编译和烧录相关的参数都在这里设置。一个典型的ESP32 Arduino工程配置大概长这样[env:esp32dev] platform espressif32 board esp32dev framework arduino monitor_speed 115200 upload_speed 921600逐行解释一下。[env:esp32dev]是环境名称可以自定义但建议跟开发板型号对应方便识别。platform指定平台espressif32就是ESP32的官方平台。board是开发板型号必须跟创建工程时选的一致。framework指定框架arduino或者espidf。monitor_speed是串口监视器的波特率ESP32的日志输出默认是115200所以这里填115200。upload_speed是烧录波特率921600是比较快的值如果烧录不稳定可以降到460800或者115200。还有一些常用参数值得了解。board_build.flash_mode可以设置Flash模式常见的有qio和dio一般用默认的就行。board_build.partitions可以指定分区表文件当你需要自定义Flash分区时用得上。lib_deps用来声明项目依赖的库PIO会自动从库仓库下载。比如你要用ArduinoJson库就写lib_deps bblanchon/ArduinoJson^6.21.0版本号可以指定也可以不指定。注意platformio.ini里的参数名和值都区分大小写写错了不会报错但不会生效排查起来很隐蔽。建议每次修改后都编译一次确认。4.3 编写测试代码与编译烧录在src目录下新建main.cpp写一个最简单的LED闪烁程序#include Arduino.h #define LED_PIN 2 void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(115200); Serial.println(ESP32 boot success); } void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500); }ESP32 Dev Module上通常GPIO2连接了一个板载LED所以用GPIO2做测试最方便。代码写好后点底部状态栏的勾号图标编译或者按快捷键CtrlAltB。第一次编译会稍微慢一些因为要编译整个框架。编译成功后点向右的箭头图标烧录或者CtrlAltU。烧录时注意看底部终端输出如果出现Connecting...一直连不上可能是串口选错了或者开发板没进入下载模式。ESP32进入下载模式通常需要按住BOOT键再按一下EN键有些板子会自动进入有些需要手动操作。烧录成功后点插头图标打开串口监视器应该能看到“ESP32 boot success”的输出同时板载LED开始闪烁。5. 常见报错与排查方法实录即使按照上面的步骤走也难免会遇到各种报错。这一章把我这些年遇到过的典型问题整理出来附上排查思路和解决方法。5.1 插件安装失败与PIO Core下载卡住这是最常见的问题表现是插件装好后PIO Core一直下载不完或者下载到一半报错。根本原因通常是网络连接不稳定。排查步骤先看VSCode底部的输出面板选择PlatformIO看具体的错误信息。如果是超时就换个网络环境重试。如果是SSL证书错误可能是系统时间不对校准一下时间再试。如果反复失败可以尝试手动下载PIO Core。在GitHub上找到platformio-core的发布页面下载对应系统的压缩包解压到~/.platformio目录下。然后在VSCode设置里指定platformio-ide.pioCorePath指向这个目录。这种方式绕过了自动下载但需要手动处理依赖稍微麻烦一些。还有一个偏方在VSCode的设置里把platformio-ide.useBuiltinPIOCore设为false然后自己用pip安装platformio再让插件使用系统安装的版本。不过这种方式对Python环境的要求更高不太推荐新手尝试。5.2 编译时报错找不到头文件或库编译时提示fatal error: xxx.h: No such file or directory说明依赖库没装好。如果是Arduino框架自带的库比如WiFi.h、BluetoothSerial.h一般不会缺因为框架包里已经包含了。如果是第三方库需要在platformio.ini的lib_deps里声明。比如用了DHT传感器库就要加lib_deps adafruit/DHT sensor library^1.4.4。有时候库声明了但编译还是找不到可能是库版本跟框架不兼容。PIO会尝试解析依赖但有时候解析出来的版本组合有问题。解决办法是指定更明确的版本号或者去库的GitHub页面看兼容性说明。另外PIO的库管理有个缓存机制有时候缓存里的库文件损坏了会导致编译失败。清理方法是删除.platformio/lib目录下的对应库文件夹重新编译让PIO重新下载。还有一种情况是头文件路径问题。如果你自己写了头文件放在include目录下编译时找不到检查一下platformio.ini里有没有配置build_flags -I include。不过PIO默认会把include目录加入头文件搜索路径一般不需要手动配。5.3 烧录失败与串口识别问题烧录时最常见的报错是Failed to connect to ESP32: Timed out waiting for packet header。这个错误基本可以确定是开发板没进入下载模式或者串口被占用了。排查顺序先确认串口监视器是不是还开着串口是独占资源监视器开着的时候烧录会失败。关掉监视器再试。然后确认串口选对了底部状态栏的串口列表里选的是开发板对应的那个。如果还不行手动让开发板进入下载模式按住BOOT键按一下EN键松开EN键再松开BOOT键然后立刻点烧录。如果设备管理器里根本看不到串口那就是驱动问题。CH340芯片在Windows 11上有时需要手动装驱动去芯片厂商官网下载对应系统的驱动安装包。Mac系统下CH340驱动可能需要允许来自开发者的系统扩展在安全性与隐私设置里放行。还有一种少见情况是USB线的问题。有些USB线只有充电功能没有数据传输功能插上后电脑能供电但识别不到串口。换一根确认能传数据的线试试。这个坑我踩过排查了半天以为是驱动问题结果换根线就好了。5.4 串口监视器乱码或没输出串口监视器打开后显示一堆乱码通常是波特率不对。ESP32的默认日志波特率是115200但如果你在代码里改了Serial.begin()的参数监视器的波特率也要跟着改。PIO的串口监视器波特率由platformio.ini里的monitor_speed控制改完配置后需要重新打开监视器才生效。如果完全没有输出先确认代码里有没有调用Serial.begin()以及有没有在setup()里打印信息。ESP32启动时本身会输出一些ROM日志如果连ROM日志都看不到那可能是串口选错了或者开发板没正常启动。按一下EN键复位看有没有启动日志。如果还是没有检查供电是否充足有些开发板用USB供电时电流不够会导致启动失败换一个供电能力强的USB口或者用外部电源供电。6. 环境搭建完成后的效率提升技巧环境能跑通只是第一步怎么用得顺手才是长期要考虑的。这一章分享几个我日常使用中觉得能明显提升效率的技巧。6.1 多工程管理与工作区配置如果你同时维护多个ESP32项目建议用VSCode的工作区功能。把相关的工程目录添加到一个工作区文件里保存为.code-workspace。这样打开工作区就能看到所有项目切换起来很方便。每个工程的platformio.ini独立配置互不影响。PIO插件会为每个工程单独维护编译缓存和库依赖不会串。工作区文件里还可以配置一些共享的设置比如统一的代码格式化规则、统一的串口监视器波特率等。这样新建工程时不用每次都重复配置。6.2 常用快捷键与自定义任务PIO插件默认的快捷键CtrlAltB编译CtrlAltU烧录CtrlAltS打开串口监视器。这几个我几乎每天都要按几十次。如果觉得默认快捷键不顺手可以在VSCode的键盘快捷方式设置里改。我习惯把烧录改成F5编译改成F7跟其他IDE的习惯保持一致。另外可以配置自定义任务。比如在.vscode/tasks.json里定义一个任务一键完成“编译烧录打开监视器”三个动作。配置方法是在tasks.json里添加一个shell任务命令依次执行pio run、pio run -t upload、pio device monitor。这样按一个快捷键就能走完整个流程调试的时候特别省时间。6.3 库版本锁定与团队协作团队协作时库版本不一致会导致“在我电脑上能跑”的经典问题。解决办法是在platformio.ini里锁定所有依赖库的精确版本号而不是用^或者~这种范围指定。比如写bblanchon/ArduinoJson6.21.0而不是bblanchon/ArduinoJson^6.21.0。这样所有人拉下来的库版本完全一致编译结果也可复现。平台版本也建议锁定。platform espressif326.5.0这样写避免因为平台自动升级导致编译行为变化。虽然PIO默认会缓存已下载的平台版本但新环境搭建时如果不锁定可能会拉到最新版跟老版本有兼容性差异。提示锁定版本后如果想升级手动改版本号再编译确认没问题后提交到版本控制。不要依赖自动升级。6.4 编译速度优化与缓存利用ESP32的完整编译第一次可能要几分钟但后续增量编译通常很快。PIO会把编译中间文件缓存在.pio目录下只要不改动框架层面的代码增量编译只编译修改过的文件。所以不要随意删除.pio目录删了下次编译又要从头来。如果觉得编译还是慢可以检查一下有没有开启编译缓存。在platformio.ini里加build_cache_dir ~/.platformio/build_cache把编译缓存放到用户目录下多个工程可以共享缓存。不过这个功能对SSD的读写寿命有一定影响根据自己情况取舍。另外编译时关闭不必要的功能也能提速。比如不用蓝牙就在配置里禁用蓝牙编译不用文件系统就禁用SPIFFS。具体是在platformio.ini里加build_flags -DCONFIG_BT_ENABLED0这样的宏定义。不过Arduino框架下这些宏不一定生效ESP-IDF框架下更常用。7. 从点亮LED到实际项目环境验证的完整闭环环境搭好、LED闪起来只能说明基础链路通了。真正要确认环境没问题还得跑一个稍微复杂点的项目把WiFi、网络通信、外设驱动这些常用功能都过一遍。这一章用一个简单的WiFi扫描加HTTP请求的示例把整个工具链的各个环节都验证到。7.1 用WiFi扫描验证网络功能在main.cpp里写一段WiFi扫描代码#include Arduino.h #include WiFi.h void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Serial.println(Setup done); } void loop() { Serial.println(Scan start); int n WiFi.scanNetworks(); Serial.println(Scan done); if (n 0) { Serial.println(No networks found); } else { Serial.print(n); Serial.println( networks found); for (int i 0; i n; i) { Serial.print(i 1); Serial.print(: ); Serial.print(WiFi.SSID(i)); Serial.print( (); Serial.print(WiFi.RSSI(i)); Serial.println()); } } delay(5000); }这段代码会每5秒扫描一次周围的WiFi网络并打印出来。编译烧录后打开串口监视器应该能看到附近WiFi的SSID和信号强度。如果能看到说明WiFi模块工作正常天线也没问题。如果扫描不到任何网络检查一下开发板的天线有没有接好有些板子需要外接天线有些是板载天线但需要配置正确的引脚。这个测试同时验证了串口通信、WiFi驱动、FreeRTOS任务调度Arduino框架底层跑在FreeRTOS上这几个关键环节。能跑通这个说明环境的核心功能都没问题。7.2 HTTP请求测试与库依赖管理WiFi扫描通过后再加一个HTTP请求测试验证网络协议栈和第三方库的集成。用HTTPClient库发一个GET请求#include Arduino.h #include WiFi.h #include HTTPClient.h const char* ssid 你的WiFi名称; const char* password 你的WiFi密码; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(\nWiFi connected); Serial.println(WiFi.localIP()); } void loop() { if (WiFi.status() WL_CONNECTED) { HTTPClient http; http.begin(http://httpbin.org/get); int httpCode http.GET(); if (httpCode 0) { Serial.printf(HTTP code: %d\n, httpCode); String payload http.getString(); Serial.println(payload); } else { Serial.printf(HTTP error: %s\n, http.errorToString(httpCode).c_str()); } http.end(); } delay(10000); }这段代码需要把ssid和password换成你实际的WiFi信息。编译烧录后串口应该先输出获取到的IP地址然后每10秒发一次HTTP请求并打印响应。如果能看到JSON格式的响应内容说明TCP/IP协议栈、DNS解析、HTTP客户端库都工作正常。这个测试还顺带验证了lib_deps的库管理功能。HTTPClient是Arduino框架自带的不需要额外声明。但如果你用了外部库比如ArduinoJson来解析响应就需要在platformio.ini里加lib_deps bblanchon/ArduinoJson6.21.0然后重新编译看PIO能不能自动下载并链接这个库。7.3 环境稳定性验证与长期使用建议跑完上面两个测试环境基本可以确认没问题了。但长期使用中还有一些细节值得注意。第一定期更新PIO插件和平台包但不要盲目追新更新前先看更新日志有没有破坏性变更。第二保持.platformio目录的整洁定期清理不再使用的平台和库避免占用过多磁盘空间。第三重要项目一定要把platformio.ini纳入版本控制这样换电脑或者重装系统后能快速恢复环境。我自己的习惯是每半年整理一次开发环境把不用的平台包删掉更新一下常用库的版本检查一下工具链有没有安全更新。这样能保持环境始终处于一个比较健康的状态不会因为长期不维护而积累一堆问题。最后再分享一个小技巧如果你经常需要在多台电脑之间同步开发环境可以把.platformio目录下的platformio.ini全局配置和packages目录做个备份新电脑上装好VSCode和PIO插件后直接把备份恢复过去能省掉大量下载时间。不过要注意不同操作系统的工具链不通用Windows的包不能直接拷到Mac上用得分别备份。
返回列表