从源代码管理 XCode 中删除 Swift 包

Posted

技术标签:

【中文标题】从源代码管理 XCode 中删除 Swift 包【英文标题】:Removing Swift Packages from Source Control XCode 【发布时间】:2021-04-25 03:38:50 【问题描述】:

我最近将一些 Swift 包手动添加到我的 Xcode 11.3 项目中,方法是将它们拖放到项目导航器中。这使我可以编辑源代码中的一些错误。

通过这样做,Xcode 会自动将这些添加到源代码管理中。

我似乎找不到任何方法从 Xcode 中的源代码管理中删除它们。我更愿意将它们保留为依赖项,但将它们提交给我自己的源代码管理并忽略主/远程。

从 Git 获取和刷新状态收益率:

Apple 在此处指示此行为:Editing a Package Dependency as a Local Package

要将 Swift 包作为本地包添加到您的项目中:

    从 Git 中查看您的包依赖项的源代码 存储库。

    打开您应用的 Xcode 项目或工作区。

    在 Finder 中选择 Swift 包的文件夹并将其拖入 项目导航器。此操作将您的依赖项的 Swift 包添加为 项目的本地包。

    对本地包和您的应用进行更改,然后通过 构建和运行您的应用。

    编辑完本地包后,将更改推送到其 远程 Git 存储库。

    当更改进入软件包的下一个版本时,删除 项目中的本地包,并更新包依赖项 到新版本。

这里的第 5 步被破坏了。我没有对该仓库的写入权限。

我尝试过的其他事情。

我已尝试删除清理、重建和删除派生数据

我试过this SO answer 但是Blueprint.xcscmblueprint 不存在。

【问题讨论】:

组织者是什么?您是说项目 Navigator 吗? 啊,是的,确实如此。谢谢,已编辑。 好的,很好。现在你能解释一下“将它们提交到我自己的源代码管理并忽略主/远程”是什么意思吗?这些是你的 Swift 包吗?你负责他们的 GitHub 存储库吗?如果没有,您期望/希望通过“您自己的源代码控制”来处理它们吗? 感谢您的提问。我必须对源中的文件进行更改以解决包的问题。我无法将这些更改提交到我自己的 repo,Xcode 想要推送给这些 repo 的主人。所以我要么删除这些包,要么分叉,然后合并一个 PR,除非我可以在我自己的仓库中自己管理这些框架的源代码,这就是我在这里要问的。 正确。其中一个包中存在堆缓冲区溢出问题。这是 2018 年在 github 上提出的,至今仍未解决。 【参考方案1】:

您似乎试图解决的问题是:您想以可维护的方式对包源文件进行更改,而这些不是您的包。

显然,这本身就是一个完全的非首发。这些文件不属于你,无论如何。一旦新版本从远程仓库中下来,您的更改无论如何都会被覆盖。

当您依赖第三方代码时,这种事情总是是个问题,尤其是在像 pod 或包这样的依赖架构中。如果代码有问题,则无法修复;这不是你的代码。

一种选择是在 GitHub 上创建一个问题,并尝试让代码的所有者解决任何问题。

另一种可能性是尝试在您的代码中编写“shim”代码,例如通过以某种方式涂抹来解决任何问题。

或者,由于这个包 repo 大概位于 GitHub,您可以fork repo。现在它你的包,你可以建立一个对那个的依赖并做出改变并将它们推送到你的fork。当然,原始(“上游”)存储库可能会更改,但随后您会将这些更改与您的更改作为单独的操作进行协调。

当然,还有一种可能性是完全放弃包管理和依赖的概念,直接将所需的源文件合并到您的项目中。现在它们是你的了,你可以随心所欲地使用它们。 (当然,要注意版权问题。您可能仍然需要在应得的情况下给予信用。)

【讨论】:

谢谢马特。是的,这似乎是依赖管理器架构的问题。所以你是说我需要从分叉的回购中制作我自己的包?我的更改基本上是一个修补程序,以避免自 2018 年以来一直未解决的堆缓冲区溢出问题,查看 github 问题。这是在一个包中,它是另一个包的依赖项。 是的,听起来分叉是最简单的解决方案。我有点不清楚如何处理依赖链;也许你必须在整个链条上分叉所有东西。因此,如果您依赖 A 并且 A 依赖于 B 并且 B 有故障,我猜您需要分叉 B,然后分叉 A 以使您的 A 分叉依赖于您的 B 分叉,然后使您的应用程序依赖于您的分叉A. 当然,如果 B 的维护者正确地做到了这一点,你就可以从你的 fork 提交你的修复作为一个 Pull Request 并且他们会接受它(如果你正在做的事情是正确的)。 谢谢马特。是的,现在我认为我在阐明问题的复杂性方面做得更好。我认为我根本不希望我的包被托管,因为这需要整个依赖链井井有条。正如我们所知,在开源中,情况并非总是如此。不幸的是,Swift 包管理器正变得越来越普遍/不可避免。 好吧,您可以合并源文件并完全丢弃包管理器和依赖项部分。当然,您不会自动跟上上游的任何更改,但也许您并不关心这一点;你只想要代码。这很好,它是开源的。我会将其添加到我的答案中。【参考方案2】:

下载第三方库一次。进行更改。创建补丁文件。将补丁文件放在你的源代码控制中。当您想要切换到第三方库的不同版本时,接下来需要进行大量手动工作。

【讨论】:

谢谢,听起来不错。为了清楚起见,您可以快速参考这个“补丁文件”吗?

以上是关于从源代码管理 XCode 中删除 Swift 包的主要内容,如果未能解决你的问题,请参考以下文章

从现有 Xcode 项目中为 Swift 包管理器导出 Package.swift

自动取消选中 Nuget 包源

我错误地从项目导航器中删除了一个文件,现在 xcode 说左上角没有方案

当Apple从设置中删除时,如何在Xcode 9 Simulator中访问Twitter?

删除 Bridging Header 后从 Interface Builder 拖动时 Xcode 崩溃

我从项目中删除了一些核心数据生成文件,但 Xcode 仍然尝试编译它们