在命令行工具中获取资源路径
Posted
技术标签:
【中文标题】在命令行工具中获取资源路径【英文标题】: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 的评论后,我最终选择了这个方向:***.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.main
和 Bundle.main.resourceURL
给出了包含命令行二进制文件的目录。我不确定如何访问其他文件。
【参考方案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 编程,它确实有效。您可以使用它来测试导入测试文件。您可以使用项目的真实绝对路径更正我的示例。正如我所说,只是一种解决方法。以上是关于在命令行工具中获取资源路径的主要内容,如果未能解决你的问题,请参考以下文章