问题描述
我知道,对于某些OS源集而言,依赖于安装JVM是一个很奇怪的用例,请允许我仔细阅读一下用例。
我正在编写一个简单的实用程序来包装对steamCMD(https://developer.valvesoftware.com/wiki/SteamCMD)的调用,该程序具有依赖于平台的安装过程。所以,我自然应该拥有
// commonMain / steamCmdGetter.kt
expect interface SteamCmdGetter {
fun installClient()
}
// [OS] / steamCmdGetter.kt
actual interface SteamCmdGetter { /* ... */ }
另一方面,我的实用程序还需要处理文件存储(例如,下载并检查客户端在存储中是否存在),因此我也可以使用文件类。
// commonMain / File.kt
expect interface File
我知道JB团队在其教程中有明确的建议。
我们建议您仅将期望和实际声明用于具有平台特定依赖性的Kotlin声明。最好在共享模块中实现尽可能多的功能,即使这样做会花费更多时间。
但是,在警告的警告下,我不想编写MyFile
实现来避免为这种常见任务而重新设计轮子,但是java.io.File
在现场如此占主导地位,以至于我无法在Gradle / Maven上找到任何Kotlin替代品。
这是否意味着我被迫最后写MyFile
?还是有将Java库导入Kotlin MPP平台sourceSets的解决方法?
解决方法
首先,一个人只能将Java库用于jvm
和android
目标,而不能用于Kotlin / Multiplatform提供的其他库。实际上,这正是使用Kotlin / JVM的目标子集。 Kotlin / JS和Kotlin / Native都不提供与Java的互操作性,它们具有自己的互操作功能。有关差异的详细信息,请参见this page。
关于特别处理文件。答案很可能是肯定的,您将必须针对每个目标实施它。这种工作通常是特定于平台的,因为它几乎不依赖于OS实施。但是,您搜索的部分功能肯定应该在platform.posix.*
platform library中找到,即使它看起来更像C风格。
P.S。网上快速搜索使我进入了这个社区图书馆list,也许会有所帮助。另外,kotlinlang Slack社区(查找链接here)可能有一些有趣的解决方案可供分享。