ESP-IDF 工程能力 / 版本管理发布 内容更新

ESP-IDF 组件怎么管理?锁版本、看依赖、换电脑也能构建

用真实led_strip依赖比较registry精确版本、Git完整commit和两份锁;从干净目录重建,并用不存在版本验证失败与恢复。

读完能做什么
得到带明确来源、依赖锁和环境记录的外部组件工程,理解干净重建与换机条件。
开始之前
已完成E02,能区分组件、defaults和本地构建产物。
所需器材
指定v1.1 S3板及板载GPIO38 RGB、USB数据线、可访问registry/Git的电脑
版本组合
SDK:ESP-IDF5.5.5 / esp32s3管理器:IDF Component Manager2.5.2Registry:espressif/led_strip==3.0.2Git:idf-extra-components / 3a49da30e5218ffc55f9bfd2224f8f063a52e266
适用范围

官方 ESP32-S3-DevKitC-1 v1.1 / WROOM-1-N8R8;ESP-IDF5.5.5、esp32s3、8MB Flash、不启用PSRAM;桥接UART115200。GPIO38板载RGB,外部led_strip3.0.2及固定Git方案。

这篇验证到了哪一步

资料核对已通过
docs/esp32-evidence/engineering-expanded.md#e07;具体上游章节、来源与修正记录。验证日期:
构建 / 配置已通过
docs/esp32-evidence/logs/e07-build.log;真实Exit0,干净重建与源/固件SHA另见engineering-expanded-builds.json。对象:官方 ESP32-S3-DevKitC-1 v1.1 / WROOM-1-N8R8版本:ESP-IDF5.5.5 / led_strip3.0.2 / manager2.5.2验证日期:
仿真不适用
未执行器件或ESP32调度仿真;主机纯C输入/依赖求解检查单独留证,不能证明电气与硬件时序。
本站实板待验证
本站尚无这套工程烧录、串口、实体LED/按钮或重启测试;观察CSV为空。

构建通过只说明指定环境中的代码或配置通过检查;实物功能、功耗和稳定性以对应的实板记录为准。

01 / 版本管理

先让工程真的依赖一个外部组件

只有内置SDK的工程难以看清外部依赖。本篇用led_strip驱动指定v1.1板GPIO38的单颗板载RGB,每秒提交低亮红/绿;无外接灯条、不换另一块板的引脚。驱动返回成功仍不是颜色测量,本站没有实体运行结果。

默认来源是registry的espressif/led_strip精确3.0.2;另交付同一应用的固定Git来源。IDF5.5.5、组件管理器实际2.5.2与环境记录分别可查,不用“最新版”概括。下载包提供两套真实生成lock、失败输入和恢复用manifest。

做到这里,你应该看到
明确SDK、组件管理器、组件版本和板载GPIO是四个不同条件。

参考:[1] ESP-IDF5.5.5组件管理:解析、lock与下载目录[2] Component Manager2.5.2 manifest:registry/Git/path/version语义[4] 官方registry:espressif/led_strip3.0.2[5] led_strip固定Git源码:组件版本、依赖、API与许可[7] 指定DevKitC-1 v1.1连接器、USB与板载RGB资料

02 / 版本管理

manifest写约束,lock记解,managed目录放产物

idf_component.yml是人维护的来源和约束;dependencies.lock由管理器生成,记录实际版本、来源、组件hash、manifest_hash与target,应随源代码保存。managed_components是下载结果,不手改、不当成本站原创,也不靠复制旧目录代替干净重建。

组件lock不锁住SDK安装器、Python、编译器、操作系统或所有构建元数据。换电脑还要按E01建立固定SDK环境;有lock也可能因网络或认证不可达而失败。这里在同一电脑的新目录验证,不声称已测另一电脑/OS,更不保证固件SHA跨环境必定相同。

材料负责的事情
manifest精确版本/范围、registry或Git来源
dependencies.lock管理器求得的实际版本与内容hash
managed_components下载后的自动产物,不手改
SDK tools/constraints与环境记录工具与Python等另外的条件
源码/固件/日志SHA本次具体输入与结果的可追溯摘要
做到这里,你应该看到
能指出哪份可编辑、哪份应自动生成,以及什么条件没有被组件lock锁住。

参考:[1] ESP-IDF5.5.5组件管理:解析、lock与下载目录[2] Component Manager2.5.2 manifest:registry/Git/path/version语义[3] Component Manager2.5.2 Git来源解析为实际commit[8] ESP-IDF v5.5.5构建系统:组件注册、main特殊依赖、公开私有头、Kconfig与defaults

03 / 版本管理

从registry取精确版本,保留生成锁再清洁重建

默认manifest精确约束==3.0.2和IDF==5.5.5。首次配置自动下载并生成lock;检查type=service、registry_url、component_hash、target和SDK版本,不只看编译最后一行。

之后在新解压目录保留相同manifest+lock,但不带build/sdkconfig/managed_components再build。本站实际完成这次干净构建并比较lock;需要联网取得依赖,不把下载缓存成功说成离线包可用。^、~、>=允许范围,有意update-dependencies可能重算,升级应单独审核。

代码 / 配置
dependencies:
  idf: "==5.5.5"
  espressif/led_strip:
    version: "==3.0.2"
做到这里,你应该看到
lock确实对应这份manifest和esp32s3,干净目录能取得同一审核解。

参考:[1] ESP-IDF5.5.5组件管理:解析、lock与下载目录[2] Component Manager2.5.2 manifest:registry/Git/path/version语义[4] 官方registry:espressif/led_strip3.0.2[6] Component Manager2.5.2版本范围与精确版本说明

04 / 版本管理

Git方案固定仓库子目录与完整commit

第二份新目录切换到Git模板与对应Git lock。path=led_strip相对仓库根;version给完整40位commit,而不是省略后跟随默认分支。Git的version语义与registry的语义版本不同,branch/tag名称可能移动。

本次Git源码内manifest也标3.0.2,12个C/H与registry包实际逐字一致;但两个source和component_hash不同,不能据版本名认定整个源包相同。两套方案是替代关系,不同时激活,不手工把一个lock版本字段改成另一方案。

操作在第二份新目录执行
选择Git来源cp manifests/idf_component.git.yml main/idf_component.yml
使用对应锁cp locks/git.dependencies.lock dependencies.lock
构建idf.py build
检查source.type=git;version为完整commit;path为led_strip
代码 / 配置
dependencies:
  idf: "==5.5.5"
  espressif/led_strip:
    git: "https://github.com/espressif/idf-extra-components.git"
    path: "led_strip"
    version: "3a49da30e5218ffc55f9bfd2224f8f063a52e266"
做到这里,你应该看到
来源与真实lock一致,Git commit可追溯到实际仓库内容。

参考:[2] Component Manager2.5.2 manifest:registry/Git/path/version语义[3] Component Manager2.5.2 Git来源解析为实际commit[4] 官方registry:espressif/led_strip3.0.2[5] led_strip固定Git源码:组件版本、依赖、API与许可[6] Component Manager2.5.2版本范围与精确版本说明

05 / 版本管理

故意请求不存在版本,确认先在求解阶段失败

第三份副本使用invalid模板,把版本设成99.99.99。本站实际reconfigure得到“no versions … match ==99.99.99”,Exit2;尚未编译,更没有接触串口。不要为了这个错误重刷板或随意升级全部依赖。

用registry模板和匹配锁恢复后,reconfigure实际成功。出现下载错误先保留URL、版本与错误,再查网络/代理/认证;私有Git使用本机凭据工具,不把token写入公开manifest。需要改第三方实现时保存修改为本地组件或固定fork,不手改自动目录的component_hash来消音。

代码 / 配置
cp manifests/idf_component.invalid.yml main/idf_component.yml
idf.py reconfigure
# 恢复已审核的registry方案
cp manifests/idf_component.registry.yml main/idf_component.yml
cp locks/registry.dependencies.lock dependencies.lock
idf.py reconfigure
idf.py build
做到这里,你应该看到
失败输入、求解错误、对应恢复都明确;恢复版本后仍须重新构建。

参考:[1] ESP-IDF5.5.5组件管理:解析、lock与下载目录[2] Component Manager2.5.2 manifest:registry/Git/path/version语义[3] Component Manager2.5.2 Git来源解析为实际commit[4] 官方registry:espressif/led_strip3.0.2

06 / 版本管理

两种来源共用同一份实际应用

下方main.c真正包含led_strip API,并通过CMake组件属性记录选定来源的版本标识。官方20220413版v1.1原理图p2的D6标注SK68XXMINI-HS,接3.3V;不要把库枚举LED_MODEL_WS2812当作实物料号。代码使用该枚举的名义0码0.3/0.9µs、1码0.9/0.3µs、reset280µs及GRB,与通用Rev04手册的编码表对照。该手册VDD为3.7…5.5V、部分电参测试4.5…5.5V,与板图3.3V条件不同,这只是名义编码参考,不证明整板电气兼容。指定板的兼容性与颜色仍待实测;不因此修改板供电。GPIO38、10MHz RMT与单像素也不能套给任意开发板。

构建使用组件公开API,外部源码由管理器按manifest取得。初始化失败明确记录并返回;每次set/refresh结果单独报告,低亮红/绿只是应观察的实体目标,不是本站已测颜色。升级3.x下一版仍要重新读API、依赖和板级效果。

代码 / 配置
// SPDX-License-Identifier: MIT
#include <inttypes.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "esp_system.h"
#include "led_strip.h"
#ifndef DEMO_LED_STRIP_VERSION
#define DEMO_LED_STRIP_VERSION "unknown"
#endif
void app_main(void) {
    const char *tag="E07";
    ESP_LOGI(tag,"IDF=%s led_strip=%s target=DevKitC-1-v1.1 N8R8 GPIO38; source determined by manifest+lock",esp_get_idf_version(),DEMO_LED_STRIP_VERSION);
    led_strip_handle_t strip=NULL;
    led_strip_config_t config={.strip_gpio_num=38,.max_leds=1,.led_model=LED_MODEL_WS2812,.color_component_format=LED_STRIP_COLOR_COMPONENT_FMT_GRB};
    led_strip_rmt_config_t rmt={.clk_src=RMT_CLK_SRC_DEFAULT,.resolution_hz=10000000,.flags.with_dma=false};
    esp_err_t err=led_strip_new_rmt_device(&config,&rmt,&strip);
    if(err!=ESP_OK){ESP_LOGE(tag,"init failed: %s; no successful LED action claimed",esp_err_to_name(err));return;}
    ESP_ERROR_CHECK(led_strip_clear(strip));
    for(uint32_t seq=0;;++seq){
        if(seq%2==0)err=led_strip_set_pixel(strip,0,2,0,0);
        else err=led_strip_set_pixel(strip,0,0,2,0);
        if(err==ESP_OK)err=led_strip_refresh(strip);
        ESP_LOGI(tag,"seq=%" PRIu32 " driver_result=%s expected_color=%s; physical color unverified",seq,esp_err_to_name(err),seq%2==0?"dim-red":"dim-green");
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

参考:[4] 官方registry:espressif/led_strip3.0.2[5] led_strip固定Git源码:组件版本、依赖、API与许可[7] 指定DevKitC-1 v1.1连接器、USB与板载RGB资料[8] ESP-IDF v5.5.5构建系统:组件注册、main特殊依赖、公开私有头、Kconfig与defaults[9] 官方v1.1原理图20220413 p2:D6=SK68XXMINI-HS及3.3V供电[10] SK68XX MINI-HS Rev04 p5/6/8:电压条件、名义时序与GRB(通用器件资料)

07 / 版本管理

换电脑前,先把“可重建”做成一份记录

把源码、公开defaults、两类manifest、对应lock与环境版本记录一起保存;不要打包整个SDK和本地managed缓存。新电脑按E01安装固定5.5.5,再用当前审核方案构建,保存完整命令、求解解、日志与固件摘要。不同环境的构建元数据可能变化,先比较来源和配置,不能只靠文件名判断相同。

本站已完成registry默认、同lock干净registry、固定Git构建及失败/恢复配置;没有另一OS、烧录、真实RGB或串口记录。observations.csv为空;主机求解和源文件比较不构成器件仿真。对外发布前保留上游Apache许可与新应用MIT归属,后续有意升级需重新审查与构建。

做到这里,你应该看到
每个通过项能指向实际执行记录,未做的换机与实板步骤保持pending。

参考:[1] ESP-IDF5.5.5组件管理:解析、lock与下载目录[2] Component Manager2.5.2 manifest:registry/Git/path/version语义[3] Component Manager2.5.2 Git来源解析为实际commit[4] 官方registry:espressif/led_strip3.0.2[5] led_strip固定Git源码:组件版本、依赖、API与许可[6] Component Manager2.5.2版本范围与精确版本说明[7] 指定DevKitC-1 v1.1连接器、USB与板载RGB资料

BACK TO THE SOURCE

资料来源与版本说明

按固定SDK、组件源码与指定板级核对;实际构建和主机输入检查另有证据,没有本站烧录、GPIO或串口运行结果。干净构建在同一电脑的新目录执行,不冒充换机或跨OS实测。资料核对日期:。资料核对、程序构建与实板测试分别记录,不互相替代。

  1. ESP-IDF5.5.5组件管理:解析、lock与下载目录
  2. Component Manager2.5.2 manifest:registry/Git/path/version语义
  3. Component Manager2.5.2 Git来源解析为实际commit
  4. 官方registry:espressif/led_strip3.0.2
  5. led_strip固定Git源码:组件版本、依赖、API与许可
  6. Component Manager2.5.2版本范围与精确版本说明
  7. 指定DevKitC-1 v1.1连接器、USB与板载RGB资料
  8. ESP-IDF v5.5.5构建系统:组件注册、main特殊依赖、公开私有头、Kconfig与defaults
  9. 官方v1.1原理图20220413 p2:D6=SK68XXMINI-HS及3.3V供电
  10. SK68XX MINI-HS Rev04 p5/6/8:电压条件、名义时序与GRB(通用器件资料)