如何在 Swift 5.9 Macro 中访问应用程序的 Bundle.main 或 info.plist?

How to get access to the application's Bundle.main or info.plist in Swift 5.9 Macro?

提问人:bodich 提问时间:9/15/2023 最后编辑:bodich 更新时间:9/19/2023 访问量:81

问:

如何访问宏中应用程序的 Bundle.main?基本上我需要阅读 info.plist。更具体地说,我在那里有链接到我的道具的道具,并希望在编译时读取和验证配置。.xcconfig

我试过:

let bundle = Bundle.main

并获取宏本身的捆绑包

我也试过:

let bundle = Bundle(identifier: "com.myorg.AppName")
//"com.myorg.AppName" is the correct identifier of my app bundle, which I've double checked from the app itself

并获得nil

有什么方法可以在宏中获取应用程序的 bundle/info.plist? 我们不能只是将对象传递给宏 props,因为它是预编译操作。

swift-宏

评论

0赞 Sweeper 9/15/2023
我怀疑这是否可能。宏在沙盒环境中运行,无法访问文件系统或网络。

答:

0赞 Soumya Mahunt 9/19/2023 #1

在此处使用宏时,需要注意以下几种情况:

  1. 宏在编译时运行,而 bundle 仅在运行最终编译的应用程序时可用。因此,宏不能在此处使用捆绑包,因为在编译过程中它不可用。

  2. 您的下一个选择是使用当前文件系统访问文件,但截至目前,宏无法访问文件系统,但计划在未来添加以下内容:

宏扩展操作是异步的,以考虑最终将添加到 中的潜在异步操作。例如,需要与编译器进行额外通信以获取子表达式类型、访问程序中的文件等的操作。MacroExpansionContext

因此,到目前为止,您的选择是改用 swift 包插件,创建一个构建工具插件,在应用程序的构建阶段执行验证。您可以获得有关如何实现所需目标的以下资源的更多详细信息: