在多个项目之间共享Swift代码

8
所以我们有一些共享代码的项目,它们现在必须保持与iOS7兼容。目前我们使用本地Cocoapods在不同应用程序之间共享代码。这种做法的缺点是所有共享的代码都被放在一个组中。此外,Cocoapods团队解释了为什么Swift Pod将不可用于iOS7项目:
“CocoaPods仅支持OS X 10.9及更高版本和iOS 8及更高版本上的Swift。”
原因如下:
如Apple多次声明的那样,Swift在OS X 10.9/iOS 7及更高版本上得到支持。没有支持使用Swift构建静态存档的功能。动态框架在所有版本的OS X上都受支持。但是,在iOS 8之前,动态框架不受支持。
(来源:http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/
考虑到这一信息,我们想尝试使用Cocoa Touch Framework项目来共享代码。
我的操作步骤如下:
在工作区中创建一个新项目-> Cocoa Touch Framework
在此添加/移动Swift代码,并将所需函数/等定义为public
在主构建目标中将新项目添加为“嵌入式框架”
在需要使用已定义库中的类时,使用导入语句,其中构建目标名称是模块名称(在我的情况下是import Cobra)
这看起来能够正常工作,甚至可以在iOS7上运行。这很奇怪,因为无论我在网上读到什么警告,都会确保该应用程序无法在iOS7设备上运行:
embedded dylibs/frameworks only run on iOS 8 or later

然而,在我们的iOS 7测试设备上,它似乎可以正常工作。此外,这让我感到担忧:
框架路径似乎直接链接到我的本地DerivedData文件夹。我并没有特别选择我的DerivedData文件夹,我只是从Xcode中添加了建议的框架,然后它自己决定从我的DerivedData文件夹中获取它。
我们与多个程序员一起开发这个项目。
在我走向这条路并将代码移动到这个新设置之前:
这种嵌入共享库的方式会给我的团队带来问题吗?(换句话说:我做错了什么吗?)
这种嵌入库的方式会在提交应用程序到App Store时引起任何问题吗?
如果需要:是否有其他替代方法来在项目之间共享代码/文件,而不是简单地来回复制?我无法相信没有人遇到过这个问题。

1
我建议您直接使用GIT,避免使用_cocoapod_带来的额外麻烦;您不需要担心哪个版本的Xcode、OSX或iOS支持它 - 它可以正确地支持您所需的一切,并且设置和使用它的过程比浪费时间在_cocoapods_上要容易得多,我认为_cocoapods_并不是专业人士使用的,而是针对书呆子极客的。 (我不想引发任何争论,谢谢,正如我所说“在我看来”!) - holex
Cocoapods确实有优势,它会自动修复项目配置以添加新的源。当使用类似GIT子模块的东西时,您将不得不手动管理这种事情。个人认为,想要手动管理这种琐碎的事情似乎更像是一项极客任务 ;)。 - Kevin R
2个回答

5

更新于2015年2月3日:

为了在内部分享代码,我建议使用git子模块,这需要你将代码提交到托管存储库中,可以是公共的或私有的。


Git子模块

这是一种将存储在仓库中的代码分发给任何具备访问权限的人的方式。它的好处是您可以将更改推送到仓库,其他用户可以选择更新自己的子模块仓库。它需要使用Git作为项目的源代码控制,并且需要将代码推送到消费者具有访问权限的仓库中。

要将代码用作Git子模块,您需要使用以下命令将代码的仓库添加到受Git控制的项目中:

git submodule add https://github.com/user/submoduleProject

https://github.com/user/submoduleProject 替换为您自己的存储库 URL。

添加后,您可以使用以下命令:

git submodule init

并且

git submodule update

从存储库中拉取代码到用户的工作区。
如果您想要添加任何更改或更新子模块,可以这样做并将其推送到存储库。用户可以使用git submodule update获取最新更改来更新他们的代码。
有关Git子模块的更多信息,请参阅官方文档
希望这可以帮助您。
如果在支持iOS 8以下版本的应用中使用动态框架,当提交到应用商店时,Application Loader或Xcode将不会接受此应用。这很不幸,因为如你所说,在设备上测试时它确实适用于iOS 7。
我能想到的最好的方法是将代码文件夹交给团队,并将其包含在项目中,而不是包含动态框架。如果您希望保持名称空间一致,以便在未来可以使用动态框架并迁移到iOS 7之外,建议使用一个结构体来获取公共方法和类的命名空间。例如:
public struct MyFrameworkName {
    public func doSomethingAmazing() {
         // Code...
    }

    public class DecentClass: NSObject {
         // Code..
    }

    public var terribleString: String
}

这将使您能够像使用动态框架一样调用其余应用程序中的方法。
var myObject = MyFrameworkName.DecentClass()
myObject.doMethod()

MyFrameworkName.doSomethingAwesome()

MyFrameworkName.terribleString = "HEY";

回答你关于直接从派生数据目录链接框架的担忧,这通常是一种不正确的方法。理想情况下,您应该将框架复制到项目目录中,然后链接到该版本。这样可以将项目的源目录分发给其他人,并且框架将保持相对于项目源文件夹的正确位置。希望这能帮助回答您的问题。

这确实有所帮助,但我的最大问题仍然存在:共享代码。我必须说,简单地复制和粘贴代码不能被视为可行的解决方案。所有涉及的项目都在快速发展,因此这将成为一场噩梦。必须有某种方法可以在项目之间共享代码,而不会破坏Swift支持或iOS 7支持。 - Kevin R
你说得对,复制粘贴并不是最好的解决方案。我建议使用私有的CocoaPods仓库或Git子模块。我会更新我的答案以反映这一点。 - Elliott Minns
这些选项有点符合我的期望。然而,由于CocoaPods使用动态框架,因此它不支持在iOS7下使用Swift,是吗?如果只是使用git子模块添加文件,那么新文件如何被检测到并添加到“编译源”中呢?或者这意味着手动添加新文件? - Kevin R
这是正确的。在这种情况下,Cocoapods不适合Swift,因此我建议使用git子模块。关于您希望如何检测新文件等。你可以创建一个自动将它们添加到编译源代码的脚本。我个人没有尝试过这种方法,所以无法发表评论。最可靠但不幸的是,会给目标自动添加文件到编译源可能会变得繁琐。我知道这可能看起来很麻烦,但不幸的是支持iOS 7确实限制了可用选项。 - Elliott Minns

0

你的示例 Git 存储库基本上是空的。 - vikingosegundo
抱歉。仓库现在已经是最新的了! - Michael Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接