多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

EOSIO 源码下载指南:克隆 eos 仓库与子模块(Submodule)完整解析

EOSIO 源码下载指南:克隆 eos 仓库与子模块(Submodule)完整解析 EOSIO 源码下载指南克隆 eos 仓库与子模块Submodule完整解析【免费下载链接】eosAn open source smart contract platform项目地址: https://gitcode.com/gh_mirrors/eo/eos本篇技术指南以 EOSIOeos 仓库从源码构建的第一步——下载源码为核心系统讲解git clone --recursive克隆方式、子模块更新git submodule update --init --recursive与增量拉取git pull --recurse-submodules的标准操作流程并结合本仓库的.gitmodules配置、构建脚本与 CI 流水线源码深入说明子模块缺失或过期会导致构建失败的根本原因。读完本文你将掌握 EOSIO 源码获取与版本同步的完整命令体系并能独立排查子模块相关的构建前置问题。适用前提本文面向希望从源码构建 EOSIO 的高级开发者。EOSIO 官方文档建议若你是新手或仅需快速部署节点优先安装预编译二进制包而非从源码构建。从源码构建支持的操作系统包括 macOSDarwin以及 Amazon Linux、CentOS、Ubuntu 等主流 Linux 发行版可由 eosio_build.sh 中的系统分发判断逻辑确认。为什么 EOSIO 源码离不开子模块EOSIO 是一个大型 C 工程其源码并非全部位于主仓库中而是通过Git Submodule子模块将大量第三方库与自研基础库挂载到仓库的libraries/等目录下。打开仓库根目录的 .gitmodules 可以确认本仓库共声明了 9 个子模块子模块路径远端仓库在本工程中的角色libraries/softfloateosio/berkeley-softfloat-3软浮点实现供 WASM 合约运行时使用libraries/yubihsmYubico/yubihsm-shellYubiHSM 硬件钱包支持libraries/eos-vmeosio/eos-vmWebAssembly 虚拟机运行时eosio-wasm-spec-testsEOSIO/eosio-wasm-spec-testsWASM 规范测试集libraries/abieosEOSIO/abieosABI 序列化解析库libraries/rocksdbfacebook/rocksdb嵌入式 KV 存储RocksDBlibraries/amqp-cppCopernicaMarketingSoftware/AMQP-CPPAMQP 消息队列客户端libraries/fceosio/fc基础工具库日志、序列化、加密等libraries/chainbaseeosio/chainbase链上状态数据库内存映射数据库libraries/appbaseeosio/appbase插件化应用框架nodeos 等程序的基础从源码结构看这些子模块覆盖了区块链节点程序的底层存储chainbase、rocksdb、智能合约执行引擎eos-vm、softfloat、ABI 编解码abieos以及程序骨架appbase、fc任何一个子模块目录为空或版本不匹配都会导致后续的 CMake 配置或编译阶段失败。因此下载源码与保持子模块同步是构建 EOSIO 的硬性前置条件。第一步规划目录并克隆主仓库官方文档建议先创建一个统一的eosio目录作为所有 EOSIO 相关软件的家园再在其中克隆仓库mkdir -p ~/eosio cd ~/eosio git clone --recursive https://github.com/EOSIO/eos要点说明--recursive等价于--recurse-submodules会在克隆主仓库后立即递归拉取所有子模块一次性完成初始化与检出避免后续手工处理。克隆完成后主仓库位于~/eosio/eos所有后续构建操作如执行构建脚本、手动 cmake都以此为根目录REPO_ROOT。如果你通过镜像或其他方式同步本仓库同样需要在仓库根目录执行子模块初始化见下一节确保 .gitmodules 中声明的 9 个子模块被完整拉取。验证克隆结果进入仓库目录后可以用以下命令检查子模块状态是否正常cd ~/eosio/eos git submodule status --recursive正常状态下每个子模块行的开头是空格而不是-或若某行以-开头表示该子模块尚未初始化以开头表示子模块检出的提交与仓库记录不一致可能指向了错误的提交。第二步未加 --recursive 克隆时的子模块补拉如果克隆时遗漏了--recursive标志例如早期克隆或从压缩包解压子模块目录会处于空壳状态必须在构建前补齐cd ~/eosio/eos git submodule update --init --recursive参数拆解--init根据 .gitmodules 中记录的 URL 初始化尚未注册的子模块等价于执行git submodule init--recursive对子模块内部嵌套的子模块如果有也递归执行同样的操作保证整棵依赖树完整该命令会在.git/config中写入子模块 URL 记录并检出主仓库中锁定的子模块提交。这也是 EOSIO 官方 CI 的标准做法在 .cicd/build-scripts.yml 中流水线构建命令即为git clone ... git checkout -f $BRANCH git submodule update --init --recursive可见该命令贯穿于 EOSIO 官方自动化构建的每个环节。第三步日常开发中的拉取与分支切换EOSIO 子模块的提交指针随主仓库的提交一起被记录。当你在主仓库执行git pull或切换分支后主仓库记录的期望子模块提交可能已经变化此时必须同步更新子模块否则本地代码会处于版本错位的状态。官方文档给出的标准做法如下[git checkout branch] # 可选先切换分支 git pull --recurse-submodulesgit pull --recurse-submodules会执行拉取并在需要时自动更新子模块。如果你更习惯显式控制也可以在拉取后单独执行git pull git submodule update --init --recursive为什么不更新子模块会导致构建失败构建脚本对子模块状态有强制校验。在 scripts/helpers/general.sh 中ensure-submodules-up-to-date函数会执行git submodule status --recursive | grep ^[\-]只要存在任何以或-开头即未初始化或版本不一致的子模块脚本就会输出错误信息并立即退出git submodules are not up to date: Please run the command git submodule update --init --recursive.也就是说eosio_build.sh 在正式安装依赖和编译之前第 139 行调用ensure-submodules-up-to-date会主动拦截子模块不同步的仓库。此外脚本还通过ensure-git-clonegeneral.sh校验仓库必须是通过git clone获得存在.git目录压缩包解压得到的源码目录将无法直接运行构建脚本。这两处校验共同保证了构建环境的一致性。第四步下载完成后的下一步源码与子模块就绪后即可进入构建环节。官方文档推荐的后续步骤为构建 EOSIO 二进制参见 Build EOSIO Binaries在~/eosio/eos下执行./scripts/eosio_build.sh脚本会自动安装依赖并编译构建产物位于eos/build/programs安装二进制构建成功后强烈建议执行安装脚本将二进制复制到/usr/local/bin等统一位置使本地开发更友好测试与卸载可用make test验证功能需要时通过eosio_uninstall.sh卸载。整个从源码构建的流程概览下载 → 构建 → 安装 → 测试 → 卸载可参考源码构建入口文档其中也再次提示新手优先使用预编译二进制。常见问题速查现象原因解决办法git submodule status出现-前缀行子模块未初始化git submodule update --init --recursivegit submodule status出现前缀行子模块检出提交与主仓库记录不一致重新执行git submodule update --init --recursive构建脚本报 git submodules are not up to date切换分支/拉取后未同步子模块按报错提示先补拉子模块再构建构建脚本报 only works with sources cloned from git源码来自压缩包而非git clone改用git clone获取带.git的完整仓库克隆很慢或子模块拉取失败网络原因导致某个子模块远端不可达重试git submodule update --init --recursive或先git submodule init再逐个子模块 update小结EOSIO 从源码构建的第一步——源码下载绝非简单的git clone了事其关键在于子模块体系的完整性与同步性克隆时使用git clone --recursive、遗漏时补跑git submodule update --init --recursive、拉取与切分支后通过git pull --recurse-submodules保持同步。这些操作受 .gitmodules 中的 9 个子模块声明约束并被 eosio_build.sh 及其辅助函数 general.sh 强制校验。确保子模块状态干净是后续依赖安装与编译顺利进行的先决条件。【免费下载链接】eosAn open source smart contract platform项目地址: https://gitcode.com/gh_mirrors/eo/eos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表