更新Swift Package版本后报Missing package product及无Package.swift错误
核心误区澄清
你完全不需要为每个版本单独创建新的Package.swift文件,也不需要在Package.swift里手动标记当前版本号。
Swift Package的版本识别完全依赖Git仓库打的标签实现,和Package.swift文件本身没有绑定关系。你遇到的两个报错本质是同一个根源:你标记的1.0.1版本,没有对应到一个真的存在、且仓库根目录带有合法Package.swift的提交。其中“Missing package product 'MyPackage1'”是版本识别失败后的连锁反应——SPM根本没成功加载到1.0.1版本的清单文件,自然读不到你在Package.swift里声明的对应产品。
常见触发场景
- 标签打在了错误的提交上。哪怕你当前开发分支的根目录已经放了Package.swift,只要
1.0.1标签没有指向这个带正确文件的提交,SPM拉取对应标签的代码时,自然会报找不到Package.swift的错。很多人会把标签错打在没有上传过Package.swift的历史提交上,触发这类问题。 - 本地打了标签但没有推送到远程仓库。SPM只会从远程仓库拉取对应版本的代码,你本地的标签它完全感知不到。如果远程仓库根本不存在
1.0.1对应的标签,SPM遍历整个远程仓库都找不到匹配的版本,自然会报错。 - 标签命名不符合SPM规范。SPM要求版本标签必须是严格的纯数字语义化格式,也就是
主版本.次版本.修订号的结构,不能带任何额外字符。如果你给标签加了v、release-这类前缀后缀,SPM会直接判定这个版本不存在,触发找不到清单的报错。
修复步骤
你之前尝试的重置包缓存、重新添加包这些操作都没有效果,因为问题根源在远程仓库的标签配置上,本地操作无法修复。
- 先登录远程代码托管平台的对应仓库页面,进入标签列表,确认
1.0.1标签真实存在。点开这个标签对应的代码提交,检查根目录是否真的存在Package.swift文件。如果标签根本不在远程仓库里,就在本地打完标签后执行git push origin 1.0.1把单个标签同步上去,或者执行git push origin --tags一次性把所有本地未推送的标签同步到远程。 - 如果点进标签对应的提交发现根目录没有Package.swift,说明标签打错了位置。删掉本地和远程上错误的
1.0.1标签,重新把标签指向那个包含合法Package.swift的最新代码提交,再重新推送到远程。 - 检查标签命名,确保是纯数字的
1.0.1格式,没有多余字符。如果之前用了带额外前缀的标签,要么改成纯数字格式,要么在引用包的项目里手动指定提交哈希关联,绕开SPM的自动版本匹配逻辑。 - 完成远程标签修正后,回到引用包的项目,再执行一次清空本地SPM包缓存、重新拉取包的操作即可正常识别。
内容的提问来源于stack exchange,提问作者ScottyBlades
相关产品推荐
相关产品推荐

