如何为多个 Xamarin 应用构建项目

How to Structure Projects for Multiple Xamarin Apps

我的团队正在努力将多个遗留移动应用程序转换为 Xamarin Forms 应用程序。目前每个应用程序都有自己的解决方案,当涉及到它们都使用一组通用的后端软件库时,这并不理想。我们计划将所有较小的解决方案合并为一个解决方案,其中包含应用程序和公共库。

但是,我的一位队友提出了一个合理的担忧,即如何使用单个 Xamarin Forms 应用程序生成多个项目(核心、Android、iOS 等),其中通常笨拙的解决方案的最终结果。我同意他的观点,随着我们添加更多应用程序,当前设置可能不会很好地扩展——即使我们将项目分组在解决方案文件夹中,Visual Studio 最终会在一定数量的项目存在于解决方案。

所以我们正在考虑回到让每个应用程序都在其自己的解决方案中,每个解决方案都包含该应用程序的几个 Xamarin Forms 项目,如上所述。但这又让我们回到了如何合理管理共享库代码的问题上。我目前的想法是只对库使用共享项目,或者可能 assemble 将它们放入应用程序解决方案将使用的 NuGet 包中。我走在正确的轨道上吗,或者有人知道更好的方法吗?

有几种不同的方法可以使用子树、子模块、NuGet 包等来管理共享代码项目。每种方法各有利弊,因此最好根据该项目的预期用例来决定。

子树本质上是获取远程仓库的副本并将其拉入父仓库。这使得从远程仓库中提取更改变得容易,但如果预计更改将被推迟,那么它可能会更加困难,因为它不知道远程仓库。虽然可以将更改推回,但可能需要花费大量时间才能完成,具体取决于回购历史记录的数量。

子模块类似于子树,除了它不是获取副本,而是根据它指向的特定提交来跟踪远程仓库。这基本上可以被认为是父级内部的另一个回购协议,它使将更改推回远程回购协议变得容易得多,但代价是 pulling/updating 从它变得有点困难。

NuGet 包安装、更新和发布给其他人非常方便,无需制作源代码 public,但它附带了更多的初始设置来生成每个包版本,并在使调试比使用实际源代码更困难的成本。如果共享代码库将分发给其他人,这是一个特别好的选择。

对于大多数项目,如果预期可能会从消费项目对该共享项目进行更改,我建议为每个项目创建一个回购协议,并将共享项目设置为每个项目的子模块。习惯检查和更新子模块的不同过程确实需要一些学习,但实际上并不是那么困难,值得学习所需的几个 git 命令。 docs 提供了一个很好的示例,说明如何开始使用子模块。