在命令行工具中获取资源路径

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.mainBundle.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 编程,它确实有效。您可以使用它来测试导入测试文件。您可以使用项目的真实绝对路径更正我的示例。正如我所说,只是一种解决方法。

以上是关于在命令行工具中获取资源路径的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows 命令行获取文件夹大小

android命令行在哪?

node rename绝对路径

《现代命令行工具指南》5. 路径瞬移:让路径跳转变得更加智能 - z

Kubernetes 命令行工具之kubctl

求Windows Terminal(命令行终端工具) V1.5.3142.0 官方版网盘资源