【问题标题】:Getting path for resource in Command Line Tool在命令行工具中获取资源路径
【发布时间】:2016-11-20 05:16:30
【问题描述】:

我正在尝试在 Xcode (8 beta 2) 的命令行工具中获取资源的路径。这是我得到的:

  • 资源 file.xyz 已被拖入项目,并且目标成员资格与主项目匹配。
  • 在构建阶段 -> 复制文件下,​​目标设置为“资源”并且子路径为空。 “仅在安装时复制”未选中,file.xyz 列在下表中。
  • 在我的 main.swift 文件中,我有以下代码:

    guard let filePath = Bundle.pathForResource("file",
                                             ofType: "xyz",
                                             inDirectory: "Resources") else{
        fatalError("Could not find file")
    }
    

fatalError 每次都会触发。有任何想法吗?我知道命令行工具没有应用程序包,这就是为什么将资源复制到 Resources 文件夹中的原因,但我的 inDirectory 参数有点疯狂……感谢阅读。

编辑:我的主要目标是从 CLT 访问资源文件(在本例中为文本文件)——我不喜欢这种特定的方式,所以如果有另一种方法也很好!

【问题讨论】:

  • 由于 CLI 没有捆绑包(Bundle.main()nil!),文件夹 Resources 应该从哪里来,或者该文件夹应该位于哪里?参数inDirectory 指定包中Resources 文件夹的有效子文件夹。
  • @vadian 感谢您的评论。在阅读 capikaw 的评论后,我最终选择了这个方向:stackoverflow.com/a/3950218/1781058,他说 Bundle 仍然可以用于链接 CLT 目标中的文件。
  • 可以链接要编译的文件,甚至可以嵌入文件,但不能通过(NS)Bundle访问文件
  • 命令行工具使用Bundle结构:换句话说,Bundle.main为包含命令行可执行文件的目录返回一个有效的包。 Bundle.main.resourceURL 返回父目录的 url。 Bundle.main.pathForResource("file", ofType:"xyz") 将返回一个有效路径,前提是 file.xyz 被复制到与命令行工具相同的目录中。
  • @NSGod 对我来说,Bundle.mainBundle.main.resourceURL 给出了包含命令行二进制文件的目录。我不确定如何访问其他文件。

标签: swift xcode command-line


【解决方案1】:

使用 Xcode 13.2 和 Swift 5,我遇到了同样的问题:我已将 JSON 文件拖到我的命令行工具项目中,但无法直接在我的代码中使用它。由于 CLT 似乎没有 Bundle,我找到了解决方法。

我创建了一个结构,它只有一个静态 let 属性,其中包含我的 JSON 作为字符串:

struct CategoriesJSON {
    static let string = """
... my JSON is here as plain text ...
"""
}

现在我可以通过简单地调用它来使用它:CategoriesJSON.string。 我知道这有点难看,但现在我的 JSON 在我需要的项目中。

【讨论】:

    【解决方案2】:

    作为一种解决方法,您可以使用源文件的绝对路径 例如,如果在 iCloud 驱动器上:

    let path = "/Users/myName/Library/Mobile Documents/com~apple~CloudDocs/myDirectory/file.xyz"

    【讨论】:

    • 我不知道为什么这被否决了。如果您正在为 Mac 编程,它确实有效。您可以使用它来测试导入测试文件。您可以使用项目的真实绝对路径更正我的示例。正如我所说,只是一种解决方法。
    猜你喜欢
    • 2022-11-08
    • 2011-09-12
    • 1970-01-01
    • 2021-04-24
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多