如何从系统中读取 swift 文件作为配置文件,就像 Swift 包管理器一样?



我正在创建一个命令行工具,在 Xcode 中使用 Swift。 我想像 grunt 一样使用配置文件,但我希望它是像 Swift 包管理器的package.swift文件一样的 swift 代码。

我的问题是:我能否拥有一个可以从磁盘读取的 swift 配置文件,并可以访问其中的变量,就像它在编译之前导入的那样?

为了澄清,配置文件将由我的实用程序的用户创建,以配置我的实用程序的行为方式。 我希望该文件使用 swift 代码来声明各种变量,以便我可以在我的 swift 代码中干净地读取这些变量。

实现这一目标的最佳方法是什么?

这可能不会以完全相同的方式回答您的问题,但它可以帮助您以另一种方式实现您想要的。

您可以为其他人提供一个模板来配置您的参数文件,如下所示

IN_VER_APP="1.5.10"
USERNAME="admin"
PASSWORD="test"

并要求他们将其保存在一个文件中,比如"输入文件.txt">

然后接下来创建sh文件,该文件将负责获取此文件和您的工具。 您的SH文件内容可能如下所示

source InputFile.txt
./YourTool "${USERNAME}" "${PASSWORD}" "${IN_VER_APP}"

现在,在您的 swift 工具中,您可以在下面以数组和顺序接收这些参数。

let arguments = CommandLine.arguments
let username = arguments[0]
let password = arguments[1]
let version = arguments[2]

现在,您只需运行sh文件即可启动工具,该工具将读取输入文件以向swift命令行工具提供参数

这是可能的,你的配置需要符合Decodable,然后你需要编译swift配置文件,然后你可以在运行时读取数据:

// MARK: - Private
private func loadManifest<T: Decodable>(_ manifest: Manifest, at path: AbsolutePath) throws -> T {
let manifestPath = path.appending(component: manifest.fileName)
guard FileHandler.shared.exists(manifestPath) else {
throw GraphManifestLoaderError.manifestNotFound(manifest, path)
}
let data = try loadManifestData(at: manifestPath)
return try decoder.decode(T.self, from: data)
}
private func loadManifestData(at path: AbsolutePath) throws -> Data {
let projectDescriptionPath = try resourceLocator.projectDescription()
var arguments: [String] = [
"/usr/bin/xcrun",
"swiftc",
"--driver-mode=swift",
"-suppress-warnings",
"-I", projectDescriptionPath.parentDirectory.pathString,
"-L", projectDescriptionPath.parentDirectory.pathString,
"-F", projectDescriptionPath.parentDirectory.pathString,
"-lProjectDescription",
]
arguments.append(path.pathString)
arguments.append("--dump")
guard let jsonString = try System.shared.capture(arguments).spm_chuzzle(),
let data = jsonString.data(using: .utf8) else {
throw GraphManifestLoaderError.unexpectedOutput(path)
}
return data

这是Tuist项目的例子。

最新更新