这里有几个想法:
首先,如果您当前手动将 Parse 代码更改从一个项目复制到另一个项目,您可以通过编写一个您运行的脚本来加快该过程,该脚本会将某些文件克隆到另一个项目。或者您可以编写一个 grunt 脚本,在检测到更改时自动复制文件。
现在,这是另一种将 Parse 代码存储在一个项目中但跨平台共享的方法:
问题:我使用共享项目而不是 PCL 来存放我的 Xamarin.Forms 和 Parse 代码。 Parse 代码工作得很好,但是当我尝试在 XAML 的 ContentPage 中使用我自己的自定义 ContentView 时遇到了问题。我想要一个解决方案,它可以让我的自定义 ContentView 和我的 Parse 代码一样工作——两者都来自同一个项目。
解决方案:我已切换到现在将我的 Xamarin.Forms 和 Parse 代码存放在 PCL 中。但有一个小问题。在我解释这个问题之前,只需要知道它确实可以在没有 Parse 代码重复的情况下工作(除了每个平台特定项目中的一行 Parse 初始化代码)。
有什么问题?问题是,在您的可移植类库中,您必须根据编译的内容手动换入和换出 Parse.iOS.dll 或 Parse.Android.dll在当时。
它会增加文件大小吗? 不会。我使用共享项目(它使用平台项目对 Parse dll 的引用)与可移植类库(你有在平台的项目和 PCL 中添加对 dll 的引用)并发现这样做不会增加应用程序文件的大小。
以下是目前为我工作的项目结构(为保密起见,项目名称已重命名)。 (仅供参考:我正在为 Mac 使用 Xamarin。)
MyProject.iOS
- Reference to Parse.iOS.dll
- Reference to the Portable Class Library
MyProject.Android
- Reference to Parse.iOS.dll
- Reference to the Portable Class Library
Portable Class Library
- Parse Code
- Xamarin Forms Code
- Reference to either Parse.iOS.dll or Parse.Android.dll
重要提示:在PCL中换出DLL时,我发现如果我在References菜单下右键单击DLL,然后单击Delete,就会导致我的项目中出现iOS项目将不再编译,因为它仍在寻找 Parse.Android.dll,反之亦然。我尝试清理解决方案,从解决方案的文件系统中删除 bin 和 obj 文件夹,但无济于事。我通过这样做让它再次工作:右键单击引用,单击编辑引用,然后取消选中一个 Parse DLL 并选中另一个框。但是,在那之后,我再次尝试了“删除”方法,编译没有问题。谁知道呢,也许这个问题会再次出现在我面前。
这不会烦人吗?根据您在平台之间切换的频率,手动交换 DLL 可能会也可能不会烦人。不管这有多烦人,它不会比重复代码更糟糕。 (也许这个交换过程可以用脚本自动化?我认为如果你用脚本修改 .csproj,你必须卸载 PCL 并重新加载它。有人愿意挑战吗?或者也许有办法根据正在为其编译的平台对 DLL 进行条件引用。有人想过吗?)
我希望这会有所帮助。如果您比目前正在做的更喜欢这些想法中的任何一个,请接受这个作为答案,并让我们知道您决定采取哪条路线。