很多朋友拿到一块 ESP32 开发板,第一件事就是到处找教程,怎么在 VSCode 里把开发环境装起来。说实话,我当年第一次折腾 ESP32 的时候,也被一串名词劝退过:ESP-IDF、工具链、串口驱动、CMake、Ninja,光看英文文档就觉得头大。但只要完整走通一遍流程你就会发现,所谓“安装”本质就三件事:装好编辑器、装好工具链、让编辑器认得出工具链。这篇保姆级教程我就按最啰嗦的方式写,从 VSCode 下载安装、Python 和 Git 的配置,到 ESP-IDF 扩展用镜像源加速下载,再到新建项目、编译烧录、打开串口监看,一步都不省略,零基础也能一次跑通。文末还把我这两年实际项目里踩过的坑和排查方法整理成了速查表,你遇到报错直接跳到对应段落对照处理就行。
1. 选型思路:为什么是 VSCode + ESP-IDF,而不是 Arduino IDE
1.1 三条主流开发路线的真实对比
先说我自己的结论:如果只是“装个环境随便玩玩”,Arduino IDE 半小时就能跑起来,但如果你准备正儿八经做项目、读官方文档、抠底层细节,VSCode + ESP-IDF 这套组合效率最高,也是目前社区资料最多、最主流的方式。下面把三条路线放在一起对比,你再决定走哪条,免得走到一半才后悔。
| 路线 | 上手难度 | 编译烧录 | 代码提示 | 调试能力 | 适合场景 |
|---|---|---|---|---|---|
| Arduino IDE | 最低 | 点一下按钮 | 很弱 | 基本没有 | 快速原型、学习测试 |
| PlatformIO(VSCode) | 中等 | 点一下按钮 | 中等 | 基础调试 | 依赖大量第三方库的项目 |
| ESP-IDF 扩展(VSCode) | 中上 | 集成按钮 | 强 | JTAG/OpenOCD | 正式产品、深入开发 |
我见过不少朋友在 Arduino IDE 里调 Wi-Fi 和蓝牙,库倒是装了一大堆,一旦遇到协议栈层面的 Bug,比如连接反复掉线、蓝牙广播不稳定,就完全没办法定位问题,因为 Arduino 框架把这些细节都包起来了。而 ESP-IDF 是乐鑫官方的 SDK,FreeRTOS、Wi-Fi 协议栈、蓝牙协议栈全部开放,构建系统用的是 CMake + Ninja,出问题可以从组件日志一路追到驱动层。用一句话概括:Arduino 帮你解决了 80% 的简单需求,但剩下最麻烦的 20% 只有 IDF 能查。
1.2 这套组合到底解决了哪些痛点
用命令行敲idf.py的流程其实很多老玩家都熟悉,但缺点是每次都要开终端、记命令,工程一多还容易记混路径。VSCode 的 Espressif IDF 扩展把这些操作全部图形化、按钮化了,编译、烧录、串口监视器都集成在界面里,还自带代码补全、跳转到定义、语法高亮。它并没有改变底层的编译逻辑,只是把idf.py命令包装成了按钮,所以网上那些命令行教程里的参数、脚本在这里依然全部适用,迁移成本几乎为零。
另外,这个扩展还集成了“SDK Configuration Editor”,也就是 menuconfig 的图形化界面。ESP32 的很多功能开关(比如蓝牙参数、Flash 分区表、主晶振频率)都要在 menuconfig 里配置,命令行里手敲容易看花眼,图形化点选就友好得多。这一点是纯粹 Arduino 路线给不了的,也是我推荐长期项目选 IDF 的核心原因。
2. 安装前准备:VSCode、Python、Git 都别装错
2.1 VSCode 安装:选 User Installer 更省心
第一步打开 VSCode 官网 code.visualstudio.com,页面右上角有醒目的 Download for Windows 按钮,直接下载就行。安装包不大,双击运行,协议页点“我同意”,后面几步保持默认,但到“选择附加任务”那一页记得把“添加到 PATH”勾上,这样以后可以在任意终端里直接敲code命令打开编辑器。如果没有管理员权限,安装器会让你选择安装类型,我建议优先用 User Installer,它不需要管理员,升级也更干净,不会出现装到一半弹权限框的情况。
装完打开 VSCode,按 Ctrl+调出集成终端,输入code --version`,能看到版本号就说明 VSCode 本身没问题了。如果你的电脑是老系统,从官网下载页底部选对应旧版本就行,不过 ESP-IDF 5.x 对系统要求偏高,老设备建议顺手用 4.x 的工具链,后面配置方法完全一样,只是版本号选低一档。
2.2 Python 安装:PATH 勾选是最关键的 5 秒
ESP-IDF 的工具链和构建脚本都依赖 Python,所以电脑上必须有一个能用的 Python。去 python.org 的 Downloads 页下载稳定版即可,我建议用 3.10 或 3.12,这两个版本在 ESP-IDF 5.x 下验证得最充分。别贪新装 3.13 或者更高,少数第三方组件还没来得及适配,编译时容易冒出莫名其妙的语法错误。
安装器打开后,第一步最底下有一个 “Add python.exe to PATH” 复选框,一定记得勾上,然后点 Install Now。这是新手最容易忽略的 5 秒,后面扩展找不到 python 的报错,十有八九就是这里没勾。安装完成后打开终端输入python --version,能打印出版本号就说明 PATH 配好了;如果提示“python 不是内部或外部命令”,说明没勾 PATH,按第 6 章的排查方法补救就行。
2.3 Git 安装:第二个决定成败的 PATH 选项
ESP-IDF 源码本身就是一个 Git 仓库,版本更新、组件拉取全都要靠 Git,所以 Git 必须装。去 git-scm.com 下载 Windows 版,安装界面大部分步骤默认即可,唯一要盯紧的是 “Adjusting your PATH” 那一页,必须选择推荐项 “Git from the command line and also from 3rd-party software”。这个选项会把 git 写进系统 PATH,VSCode 扩展才能正常调用。如果你选成了默认的 “Use Git from Git Bash only”,图形界面可能能用,但集成终端和扩展都找不到 git,后面编译报错会非常难受。
安装途中还会问默认编辑器、是否启用符号链接等选项,保持默认就行,不需要改。装完同样在终端输入git --version验证,能显示版本号就过关。
2.4 顺手再装两个扩展,后面会舒服很多
打开 VSCode 左侧扩展面板(Ctrl+Shift+X),搜索并安装下面几个扩展。第一个是 C/C++,作者是 Microsoft,包名 ms-vscode.cpptools,ESP-IDF 的代码全用 C 写,装上它才有完整的代码补全和跳转;第二个是 Chinese (Simplified) 汉化包,装完右下角会提示切换语言,重启即可;第三个才是重头戏,在搜索框里输入 Espressif IDF,作者是 Espressif Systems,认准这个官方扩展再装。前两个是辅助,第三个没有它,之前装的 Python 和 Git 都发挥不了作用。
提示:VSCode 扩展搜索框里会出现很多名字很像的 IDF 扩展,一定认准发布者为 Espressif Systems 的那个。装错第三方仿冒扩展,轻则配置对不上,重则被塞一堆广告。建议直接看扩展详情页的作者栏确认。
3. 核心环节:安装 Espressif IDF 扩展并下载工具链
3.1 扩展安装完先别急着关界面
装好 Espressif IDF 扩展后,VSCode 底部状态栏会出现一个 ESP-IDF 相关的提示或标签,通常写着 “ESP-IDF: Not Configured” 之类。这是正常的,因为扩展只是壳,真正的 SDK 和工具链还没下载。点击这个标签,或者按 Ctrl+Shift+P 打开命令面板输入 ESP-IDF,会看到一长串以 ESP-IDF 开头的命令,这说明扩展已经加载成功了。
3.2 Express 模式一键配置全流程
在命令面板里选择 “ESP-IDF: Configure ESP-IDF Extension”,扩展会弹出配置向导。第一个界面问你是想用 Express 还是 Advanced,Express 表示由扩展自己完成 ESP-IDF 和全部工具链的下载安装;Advanced 则让你手动指定已经下载好的 ESP-IDF 源码路径。绝大多数新手建议用 Express,这也是官方推荐方式。
选择 Express 后会先弹出 ESP-IDF 版本列表,建议选最新的 release/v5.x,稳定性和资料量都是最好的;如果后续有特殊需求,再考虑 nightly 版本。接着让你选 ESP-IDF 的存放目录和 Tools 存储目录,默认路径是用户目录下的 esp 文件夹和 .espressif 隐藏文件夹,我建议保持默认,除非你的 C 盘空间特别紧张。路径里千万不要出现中文或空格,否则后面 CMake 构建时会有一堆编码和路径解析的坑。
点击 Install 后,扩展会开始下载 ESP-IDF 源码、交叉编译工具链、Python 虚拟环境、OpenOCD 调试器等一大堆东西,总体量在 1GB 上下。下载进度可以在 VSCode 底部 Output 面板切到 “ESP-IDF” 通道查看。整个过程快则十分钟,慢则按小时算,取决于你当前的网络情况。
3.3 下载慢、反复超时?提前切到乐鑫镜像节点
这一步算是全篇最值得记住的操作。如果你直连官方下载服务器总是卡在某一个压缩包上,或者速度只有几十 KB/s,可以提前设置一个环境变量:IDF_DOWNLOAD_SERVER。乐鑫为同一套文件提供了加速节点,地址是 https://dl.espressif.cn,内容和官方服务器完全一致,只是访问速度通常会快很多。
设置方法:在 Windows 的开始按钮上点右键,选择“系统”->“高级系统设置”->“环境变量”,在用户变量里点击“新建”,变量名填 IDF_DOWNLOAD_SERVER,变量值填 https://dl.espressif.cn,一路确定后重启 VSCode,再重新跑一遍 3.2 的 Express 配置。这样整套 IDF 和工具链的下载都会走加速节点。实测下来,用不用这个变量,下载体验完全是两个量级。
如果不想动环境变量,也可以直接在 VSCode 设置里搜索 idf,找到下载服务器相关项手动填,但环境变量方案覆盖面最全,连命令行方式安装的 IDF 也能生效,所以我更推荐。
3.4 配置完成后关键目录别乱动
配置完成后,你会看到两个重要目录。ESP-IDF 源码默认放在用户目录下的 esp 文件夹里,名字通常叫 esp-idf;工具链、Python 虚拟环境、下载缓存则放在同用户目录的 .espressif 隐藏文件夹里。这两个目录的路径会被写进 VSCode 的配置,所以千万不要随意移动、改名或者删掉,否则扩展会立刻失联,重新配置又是一轮下载。想要清理磁盘空间之前,务必先判断这几套工具还要不要继续用。
配置完成后,再次打开命令面板输入 ESP-IDF,你会看到可用命令明显变多,底部状态栏也会出现 IDF 版本号和快捷按钮。到了这一步,环境就算是真正建好了。
3.5 已经有 ESP-IDF 源码?Advanced 模式也能接上
如果你之前用命令行装过 ESP-IDF,或者想用 git clone 的方式自己管理版本,可以走 Advanced 模式。先在任意目录执行git clone -b v5.2 --recursive https://github.com/espressif/esp-idf.git,Git 下载慢也可以换成乐鑫的开源镜像仓库,地址是 https://gitee.com/EspressifSystems/esp-idf.git。然后在配置向导里选 Advanced,把 esp-idf 源码目录和 Tools 目录路径填进去,扩展会接着执行依赖安装脚本,把工具链补全。这个模式适合熟悉命令行的玩家,新手老老实实用 Express 就行。
4. 实操走一遍:创建、编译、烧录第一个项目
4.1 用示例模板创建项目
环境都装好了,现在开始跑第一个真实项目,这一步走完你就彻底“会”了。在命令面板里输入 ESP-IDF,选择 “ESP-IDF: Show Example Projects”(部分版本叫 Create Project from Template,名字有差异),扩展会从本地已经下载好的 esp-idf 示例库里列出一堆模板。这一次我们先选最基础的 hello_world,它编译体积小,烧录后会在串口打印日志,能最快验证整套链路是否通畅。选完模板后,扩展会要求你指定项目存放目录,建议在 D 盘或用户目录下建一个专门的 esp32_workspace 文件夹,把所有项目都放进去,方便管理。
4.2 理解 hello_world 干了什么
hello_world 的主程序在 main 目录下的 hello_world_main.c 里。核心逻辑其实很短:初始化 NVS 分区,然后打印 “Hello world!” 日志,之后每隔一秒打印一次启动次数。第一次看这个工程,你不需要理解每一行代码,但要记住两个概念:app_main是程序入口,相当于标准 C 的 main;ESP-IDF 的所有打印都走 ESP_LOGI 这类日志宏,串口里看到的就是它们输出的。这两个概念在后续所有 IDF 项目里都会反复出现。
4.3 选择芯片型号和烧录串口
编译和烧录之前,扩展需要知道两件事。第一是目标芯片型号,在命令面板里运行 “ESP-IDF: Set Espressif Device Target”,根据你的开发板选择 esp32、esp32s3、esp32c3 等,选错会导致编译出来的固件没法启动。第二是 USB 串口号,把开发板插上电脑,打开 Windows 设备管理器查看端口(COM 和 LPT)一栏,记下实际出现的 COM 号,然后在命令面板运行 “ESP-IDF: Select Port to Use”,选中对应 COM。
这里有个很多人都踩过的坑:开发板插上后设备管理器里根本没有 COM 口。绝大多数开发板用的是 CH340 或 CP2102 这类 USB 转串口芯片,Windows 10 以上系统会自动装驱动,但如果系统没识别,就需要手动装一下芯片厂商的驱动。CH340 去 WCH 官网下,CP2102 去 Silicon Labs 官网下,装完再插拔一次开发板基本就有了。
4.4 编译项目
硬件都认出来之后,点击 VSCode 底部状态栏的 Build 按钮,或者在命令面板运行 “ESP-IDF: Build your project”。第一次编译会初始化 CMake 并生成构建文件,需要几分钟时间,耐心等着就行。编译过程中 Output 面板会滚动大量日志,看到末尾出现类似 “Project build complete” 或固件 .elf/.bin 的路径信息,就是成功了。如果报错,先看第 6 章,别急着到处复制粘贴。
4.5 烧录进 ESP32 并打开串口监视器
点击状态栏的 Flash 按钮,或运行 “ESP-IDF: Flash your project”。扩展会先重新编译,然后把固件通过串口写入开发板,进度条和日志都会实时显示。烧录完成后,运行 “ESP-IDF: Open Serial Monitor”,设置波特率 115200,按一下开发板上的 EN 复位键,串口里就应该出现 “Hello world!” 和不断递增的计数值。
到这一步,你的第一块 ESP32 就算被彻底点亮了。我把整个流程压缩成一句话:创建模板 -> 选芯片 -> 选串口 -> Build -> Flash -> Monitor。以后做任何新项目,骨架都是这六步。
4.6 从打印日志到闪烁 LED,把代码改成自己的
hello_world 只能验证链路,真正有“编程感”的操作是控制 GPIO。把 main 目录下的 hello_world_main.c 清空,替换成下面的代码,然后重新编译烧录:
#include <stdio.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #define BLINK_GPIO 2 #define BLINK_DELAY_MS 500 void app_main(void) { gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); while (1) { gpio_set_level(BLINK_GPIO, 1); vTaskDelay(BLINK_DELAY_MS / portTICK_PERIOD_MS); gpio_set_level(BLINK_GPIO, 0); vTaskDelay(BLINK_DELAY_MS / portTICK_PERIOD_MS); } }代码逻辑讲清楚:app_main执行时先把 GPIO2 配置成推挽输出,然后进入死循环,轮流把电平拉高、延时 500ms、拉低、再延时 500ms,LED 就以 1Hz 的频率闪烁。BLINK_GPIO这个宏就是你要控制的引脚号,如果开发板带着可编程 LED,可以换成对应引脚;如果用的是外接 LED,就按 GPIO2 -> 330Ω 电阻 -> LED 阳极 -> LED 阴极 -> GND 这样接线。vTaskDelay后面的portTICK_PERIOD_MS只是把毫秒换算成 FreeRTOS 的时钟节拍,不用深究。
注意:如果编译时提示找不到 driver/gpio.h 这类头文件,说明 main/CMakeLists.txt 里的组件依赖没写齐。找到
idf_component_register那一行,在括号里补上REQUIRES driver,保存后重新编译即可。
5. 可选路线:Arduino 框架安装 ESP32 支持包
5.1 用 Arduino IDE 加开发板地址
如果你还舍不得 Arduino 生态,或者身边有人用 Arduino,可以在 Arduino IDE 的文件 -> 首选项 -> 附加开发板管理地址里,添加一行 JSON 地址。官方地址是 https://espressif.github.io/arduino-esp32/package_esp32_index.json,如果下载慢,把地址改成阿里云镜像 https://mirrors.aliyun.com/arduino/package_esp32_index.json 也能用。添加地址后,打开工具 -> 开发板 -> 开发板管理器,搜索 esp32,选择 Espressif Systems 的包安装即可。
5.2 两套环境怎么共存,别搞混
同一台电脑上可以同时保留 Arduino 和 VSCode/IDF 两套环境,互不冲突,实际项目更是经常两头切换。只是要清楚一点:Arduino 框架本质上是把 ESP-IDF 的功能又封装了一层,固件写法和编译方式完全不同,而且同一个串口不要同时被两个软件占用,否则烧录时必然报端口占用。如果你非要留在 VSCode 里又用 Arduino 框架写代码,装 PlatformIO 扩展会更合适,它能在 VSCode 里管理 Arduino 和多种嵌入式框架,只是底层调试能力不如原生 ESP-IDF。我的个人建议是,原型验证用 Arduino,正式项目一律切到 IDF,别等代码写到几千行再来换,那才是真的痛。
6. 常见问题定位与避坑实录
6.1 下载一直卡住或反复失败
典型现象:Express 配置跑到某个百分比就不动了,或者 Output 里反复出现某个 URL 超时。八成是网络问题。优先按 3.3 节把 IDF_DOWNLOAD_SERVER 环境变量设置好,再重跑一次。如果已经设置了变量还是失败,检查 VSCode 是不是在设置变量之后才启动的,环境变量改动必须重启软件才生效。另外不要跳过失败直接点完成,免得工具链缺文件,后面编译报一些特别难看的错误。
6.2 提示找不到 python 或 git
报错通常长这样:“python not found” 或 “git not found”。最常见原因就是 2.2 和 2.3 节里说的 PATH 没勾。补救方案有两个:一是回到安装器重新运行一次,把 Add to PATH 勾上;二是手动把 Python 和 Git 的安装目录加到系统环境变量 Path 里,然后重启 VSCode。如果实在不想折腾系统环境,也可以在 VSCode 设置里搜索 idf,分别把idf.pythonBinPath和idf.gitPath指定成实际安装路径,扩展一样能用。
6.3 编译报错源头是路径里的中文
我见过太多同学把工作目录放在“C:\用户\张三\桌面\新建文件夹”这类路径里,结果 CMake 或编译器在解析中文路径时要么编码错乱,要么直接找不到文件。ESP-IDF 对中文路径的支持一直不完美,最省事的办法是新建一个纯英文的 workspace 路径,比如 D:\esp32_workspace,所有项目都放下面。项目名也尽量用字母、数字和下划线,这算是嵌入式开发的通用血泪经验。
6.4 烧录失败:串口被占用、驱动有问题、线材不对
烧录时如果报 “Failed to open port COMx: Access denied”,先检查串口监视器是不是还开着,一个串口同一时刻只能被一个软件占用,关掉监视器再烧。如果设备管理器里看着有 COM 口但一烧就报错,很可能是驱动版本不对,卸载设备后重新装官方驱动。还有一条检验标准:换一根数据线。真的,别小看线,市面上一堆 Type-C 线只能充电不能传数据,插上去电脑根本没反应。至少准备两根能传数据的线做交叉验证,能省下很多时间。
6.5 提示 “Failed to connect to ESP32” 或 “Wrong boot mode”
这个错误也很经典。ESP32 的串口烧录需要芯片进入下载模式,很多开发板有自动下载电路,点一下烧录就能进;但如果你的板子没有自动电路,或者芯片当前状态不对,就需要手动操作:按住开发板上的 BOOT/IO0 按钮不放,点击烧录,看到日志里出现 “Connecting” 提示后再松开 BOOT,烧录就能继续。还不行的话,按一下 EN 复位键再试。口诀是:先按 BOOT,再点烧录,连接上了,松开 BOOT。
6.6 串口监视器乱码或没输出
先确认波特率是不是 115200,扩展默认一般没问题,但如果你改过工程配置就不好说了。其次确认烧录后是否按过 EN 复位,很多板子烧录完不一定自动复位运行,串口自然没输出。如果输出的是乱码,大概率是芯片的 Flash 频率或与板载晶振配置不一致,用菜单里的 “ESP-IDF: SDK Configuration Editor” 打开配置,检查 Component config -> ESP32-specific -> Main XTAL frequency 是否和你的开发板晶振一致,一般是 40MHz。
6.7 典型问题速查表
| 现象 | 可能原因 | 优先排查方向 |
|---|---|---|
| Express 下载停滞 | 网络不稳定 | 设置 IDF_DOWNLOAD_SERVER 镜像 |
| python/git 找不到 | PATH 未配置 | 重装勾选 PATH 或手动加环境变量 |
| 编译报中文路径错乱 | 工作目录含中文 | 新建纯英文 workspace |
| 烧录端口被占用 | 串口监视器未关闭 | 关掉监视器再烧 |
| 连不上芯片 | BOOT 模式不对 | 按住 BOOT 烧录 |
| 串口乱码 | 晶振配置不一致 | 检查 Main XTAL frequency |
| 串口没输出 | 未按复位键 | 按 EN 复位 |
6.8 踩坑心得:先跑官方示例,再改自己代码
说句大实话,我见过太多新手一上来就拷一段网上代码进工程,然后编译报错问遍全群。ESP-IDF 的坑几乎都集中在“环境没配好”和“路径有中文”这两个大类,真正属于代码逻辑的问题反而是少数。所以我的建议是:第一次学,永远先用官方自带模板跑通一次,再开始改装自己的功能。如果连 hello_world 都编译不过,先对照前 6 小节排查环境;如果 hello_world 能过、你的代码不过,那就回头检查自己的代码,别拿环境撒气。
7. 装好之后能玩什么:从点灯到智能硬件
7.1 系统自带 examples 就是最好的课本
ESP-IDF 安装目录下有大量官方示例,按功能分文件夹存放:peripherals(外设)、wifi、bluetooth、storage、protocols 等等。建议按这个顺序刷例子:blink(GPIO)、uart(串口)、i2c(传感器)、spi(屏幕/存储)、wifi sta 和 softap(连接路由器和开热点)。每一个例子都短小完整,能编译能烧录,是最系统、最不容易踩坑的学习路径。
7.2 三个马上能落地的项目方向
第一,内嵌 Web 网页。ESP32 的 Wi-Fi 加 httpd 组件可以让你把网页代码烧进 Flash,路由器给 ESP32 分配一个 IP,手机浏览器打开就能控制开发板,做局域网智能开关、插排控制都很方便。第二,BLE 蓝牙控制。手机 App 扫描连接后,通过 GATT 服务控制 GPIO,配合点灯项目改几行代码就能实现,做小玩具、产品原型都很合适。第三,温湿度采集上报。把 DHT11 或 DS18B20 接在 GPIO 上,用 RMT 或 1-Wire 协议读数据,再通过 MQTT 上报到服务器,一个标准的物联网数据链路就完整了。这些方向在网上都有大量开源项目,今天装的这套环境,每一个都能直接跑。
7.3 进阶玩法:串口桥接与更复杂的系统
如果你后续要做 ROS2 小车、机械臂控制这类偏机器人方向的项目,ESP32 最常见的分工就是负责底层电机和传感器采集,通过串口协议和上位机通讯。这种模式下,你今天的编译烧录环境完全沿用,只需要在 IDF 工程里实现一个串口协议解析就行。道理还是那句话:环境一旦搭好,往后的项目都是怎么组织代码的问题,再也不用为了“装不上开发环境”浪费时间。
就我个人来说,从第一次用 VSCode 搭好 ESP32 环境到今天,这套流程我重新走过不下二十遍,帮朋友、学生和同事都排过障,几乎每一个卡点都能落在我上面列出的某一条里。所以如果你现在正卡在某一步,别慌,回到第 6 章按顺序对照一下,大概率能找到原因。最后再分享一个小习惯:我每次新换电脑,都会把 IDF_DOWNLOAD_SERVER 这个环境变量第一时间配好,再把第 2、3 两章的操作存成一个 Markdown 清单,装环境的时候对着清单打勾,十分钟就能回到满血状态。这个习惯会帮你省下很多本该花在调环境上的时间,把精力留给真正有意思的项目代码。