如何发布带有子模块依赖的工作区crate-sys至crates.io?
解决Rust工作区中crate-sys发布时包含vendor目录代码的问题
由于crates.io不支持Git子模块,且你的子模块配置在工作区根目录而非crate-sys内部,要让发布到crates.io的crate-sys包含vendor目录的代码,核心思路是将子模块的实际内容嵌入crate-sys仓库,而非依赖子模块引用,具体操作步骤如下:
嵌入子模块内容到crate-sys
- 在工作区根目录拉取完整子模块内容:
git submodule update --init --recursive - 进入
crate-sys/vendor目录,删除其中的.git文件夹(这是子模块的独立仓库标识) - 回到工作区根目录,执行
git add crate-sys/vendor,将vendor目录下的所有文件作为普通文件纳入仓库追踪 - 提交变更:
git commit -m "Embed vendor submodule content into crate-sys"
- 在工作区根目录拉取完整子模块内容:
调整忽略规则与Cargo配置
- 检查工作区及
crate-sys目录下的.gitignore文件,确保没有忽略vendor目录的规则,若有则删除对应条目 - 在
crate-sys/Cargo.toml中显式配置include字段,确保vendor目录被包含在发布包内:include = [ "src/**/*", "vendor/**/*", "Cargo.toml", "build.rs" # 若有构建脚本也需包含 ]
- 检查工作区及
本地验证发布包
在crate-sys目录下执行cargo package生成本地发布包,再用cargo package --list查看包内文件,确认vendor目录的所有内容都已被包含。如果存在遗漏,检查.gitignore和Cargo.toml的配置后重新验证。发布到crates.io
确认本地包内容无误后,执行cargo publish(需提前登录crates.io)完成发布。
后续若原始子模块有更新,需手动拉取最新代码,重复上述嵌入步骤后再发布crate-sys的新版本。
内容的提问来源于stack exchange,提问作者Netwave
相关产品推荐
相关产品推荐

