什么是Kotlin模块?

53
在 Kotlin 文档中,他们提到了某种模块,例如在 internal 修饰符的文档中。
但我找不到术语“模块”的定义。那么“模块”是什么意思?

何时使用 internal 修饰符?https://dev59.com/elYN5IYBdhLWcg3wJFNm - Ben Butterworth
4个回答

37
一个模块是一组Kotlin源代码的编译集合,可以包含以下内容:
  • IntelliJ IDEA 模块;
  • Maven 项目;
  • Gradle 源代码集;
  • 使用 Ant 任务一次编译生成的文件集合。
该内容来自于关于可见性修饰符的同一文档文章。 :)

29
请问可以更具体些吗?这是 Kotlin 文档中的内容,但它具体是什么意思呢? - Lalit Behera
4
对于一个Android项目,如果声明为"internal",这是否意味着它可以被整个Android应用程序访问? - s-hunter
4
@s-hunter,不会的。Android项目是使用Gradle构建的,因此“internal”可见性意味着Gradle源集(测试源集除外,它们可以访问它们测试的源集中的内部内容)。 - hotkey
5
@hotkey,我明白了。如果整个Android项目只包含一个Gradle源集,通常情况下这是为简单应用程序设计的,那么"internal"表示它可以在整个Android项目中被访问。我的理解正确吗? - s-hunter
1
是的,这基本上是正确的:internal 声明不能在其他 Kotlin 模块中使用,但由于 JVM 方面的支持不足,它仍然暴露给非 Kotlin 代码(例如可以在依赖于 JAR 的 Java 代码中使用)。因此,访问权限在运行时不会像 private/protected/package-private 声明一样由 JVM 进行检查,而是 Kotlin 编译器在使用位置检查访问权限。 - hotkey
显示剩余7条评论

11
根据 Kotlin 的文档,模块是一组编译在一起的 Kotlin 文件:
  • IntelliJ IDEA 模块
  • Maven 项目;
  • Gradle 源码集
  • 使用一次 <kotlinc> Ant 任务编译的一组文件。
这是@hotkey的回答,但我想补充一下。
根据 Kotlin 的首席语言设计师Andrey Breslav的说法:

Kotlin 模块与 IntelliJ 的模块(iml 文件)一一对应。

根据 IntelliJ 的文档

模块允许您在一个应用程序中结合多种技术和框架。在 IntelliJ IDEA 中,您可以为一个项目创建多个模块,每个模块可以负责自己的框架。

当涉及到 Maven 项目或命令行编译时,根据Andrey 的说法

默认情况下,每次编译都是一个单独的模块:所有二进制依赖项都被视为不在当前正在编译的模块中。

此外,Gradle 源码集是一个模块,除了 test 源码集可以访问 main 的内部声明之外。
这意味着,如果您在 Gradle 配置中有不同的构建变体导致不同的源码集,例如生产和调试版本,则一个源码集中的内部类不能在另一个源码集中使用。

0

根据Kotlin语言规范§10.2模块

模块是代码本身和生成的应用程序之间边界上的概念,因此它依赖于并影响着两者。Kotlin模块是一组被认为是相互依赖且在编译期间必须一起处理的Kotlin文件。

在简单情况下,模块是在给定项目中同时编译的一组文件。

  • 使用单个Kotlin编译器调用编译的一组文件
  • Maven模块
  • Gradle项目

在涉及多平台项目的更复杂情况下,一个模块可能分布在几个编译、项目和/或平台上

对于Kotlin/Core来说,模块对于internal可见性非常重要。模块如何影响特定平台在本规范的各自部分中有所描述。


-1

我认为你可能在提到org.koin.core.module.Module

Koin模块是一个“空间”,用于收集Koin定义。它使用module函数声明。

val myModule = module {
    // Your definitions ...
}

这个文档在这种情况下会很有帮助。


1
谢谢您的回答!不过,如果我没记错的话,我是在 Koin 实际存在之前就提出了这个问题。 - ubuntudroid

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