当我使用终端命令capp gen MyProject创建新的 Cappuccino 项目时,我得到了 AppController.j,它使用了许多 Foundation 和 AppKit 类,但只有一个 import 语句
@import <Foundation/CPObject.j>
卡布奇诺导入系统如何工作?应用程序如何知道 AppController.j 中使用的 CPNotification、CPWindow、CPTextField 和其他类。
谢谢!
当我使用终端命令capp gen MyProject创建新的 Cappuccino 项目时,我得到了 AppController.j,它使用了许多 Foundation 和 AppKit 类,但只有一个 import 语句
@import <Foundation/CPObject.j>
卡布奇诺导入系统如何工作?应用程序如何知道 AppController.j 中使用的 CPNotification、CPWindow、CPTextField 和其他类。
谢谢!
大多数导入都是多余的,但拥有它们很好,因为它有助于我们的静态分析工具在您构建生产时帮助去除代码。
index.html 和 index-debug.html 页面上定义了两个“环境”变量。见这里。
OBJJ_INCLUDE_PATHS 基本上是 objj 在导入框架/库代码时要查看的位置列表。因此,例如,您这样做:
@import <Foundation/CPObject.j>
代替:
@import "Foundation/CPObject.j>
那是因为Foundation/CPObject.j存在于Frameworks中。所以 Doing@import "Frameworks/Foundation/CPObject.j
与使用尖括号完全相同。
这意味着您将框架代码移动到您想要的任何目录,并且通过使用尖括号语法,我们能够在没有真实路径的情况下找到这些文件。
那么,您的应用程序如何知道所有其他未直接导入的类呢?好吧,如果您注意到我在上面链接到的索引文件中,还有另一行指定 objj 可以在哪里找到 main()。在该文件的顶部 main.j 导入 Foundation 和 AppKit 框架:请参阅此处。
我们可以跟踪这些导入,并看到 CPWindow.j 在 AppKit.j 的第 109 行被导入。
因此,由于 AppKit.j 为您导入了大部分 AppKit,因此依赖于 CPWindow(例如)的类不应该手动导入它……但它肯定不会受到伤害(文件永远不会被导入两次)。
但由于 AppKit 和 Foundation 对您自己编写的类一无所知,因此您确实需要手动导入这些类。