我在我的应用程序中使用Alamofire,我想在应用程序启动时将版本号打印到日志中。是否有方法可以以图解方式访问版本号?
xwmevbvl1#
Alamofire的版本是它默认的User-Agent头的一部分,所以如果你记录你的网络请求,版本应该已经是它的一部分。我可以看到它是公共的,所以它可以是自定义日志或其他头的一部分,所以我会考虑使它公开。
User-Agent
insrf1ej2#
由于你使用的是Swift包管理器,并且正如Jon Shier的in previous answer所述,该版本不可公开使用。它是there,但只能在框架内访问。在此之前(正如Alamofire可能会在未来公开该版本),这是一个围绕步骤的小工作。我还没有完全测试它,我只是检查了解码和“字符串输出”,我没有去构建阶段部分,但我会给你给予我认为应该使它工作的主指令。你可以做的是在构建阶段有一个小脚本,它将读取Package.resolved并生成一个包含所有版本的文件。将该文件添加到你的Target,这应该是好的。SwiftGen等使用此行为来生成“安全”资产(在模板等的帮助下)你需要先找到你的Package.resolved。我的是在./MyProject.xcworkspace/xcshareddata/swiftpm/Package.resolved,因为我使用的是工作区。如果只有一个PBX项目,我会让你找到它。你可以为脚本使用不同的语言,但由于我们是Swift开发人员,我会这样做。
Package.resolved
./MyProject.xcworkspace/xcshareddata/swiftpm/Package.resolved
代码可以是:
struct ResolvedPackage: Decodable { let packages: [Package] struct Package: Decodable { let name: String let state: State struct State: Decodable { let version: String } enum CodingKeys: String, CodingKey { case name = "identity" case state } } enum CodingKeys: String, CodingKey { case packages = "pins" } } do { let path = "pathOfThePackage.resolved" let jsonData = try Data(contentsOf: URL(fileURLWithPath: path)) let decoded = try JSONDecoder().decode(ResolvedPackage.self, from: jsonData) var lines: [String] = [] lines.append("//AutoGenerated Code\n") lines.append("#import Foundation\n") lines.append("struct SPMVersion {") decoded.packages.forEach { lines.append("\t static let \($0.name) = \"\($0.state.version)\"") } lines.append("}") let output = lines.joined(separator: "\n") print(output) try output.write(toFile: "PathOfTheNewSwiftFileYouWant.swift", atomically: true, encoding: .utf8) } catch { print("Error while retrieving Package.resolved content: \(error)") }
字符串示例输出:
//AutoGenerated Code #import Foundation struct SPMVersion { static let alamofire = "5.6.4" static let alamofireimage = "4.2.0" }
型
#!/usr/bin/swift
#import Foundation
chmod
New Script Phase
当然,这段代码目前是“快速和肮脏的”,你可以通过参数化来深入研究它:
init(from decoder:)
注意Package.resolved似乎没有列出依赖项(在我的最后一次测试中),所以你不应该能够获得这些版本。
2条答案
按热度按时间xwmevbvl1#
Alamofire的版本是它默认的
User-Agent
头的一部分,所以如果你记录你的网络请求,版本应该已经是它的一部分。我可以看到它是公共的,所以它可以是自定义日志或其他头的一部分,所以我会考虑使它公开。insrf1ej2#
由于你使用的是Swift包管理器,并且正如Jon Shier的in previous answer所述,该版本不可公开使用。它是there,但只能在框架内访问。
在此之前(正如Alamofire可能会在未来公开该版本),这是一个围绕步骤的小工作。我还没有完全测试它,我只是检查了解码和“字符串输出”,我没有去构建阶段部分,但我会给你给予我认为应该使它工作的主指令。
你可以做的是在构建阶段有一个小脚本,它将读取Package.resolved并生成一个包含所有版本的文件。将该文件添加到你的Target,这应该是好的。
SwiftGen等使用此行为来生成“安全”资产(在模板等的帮助下)
你需要先找到你的
Package.resolved
。我的是在./MyProject.xcworkspace/xcshareddata/swiftpm/Package.resolved
,因为我使用的是工作区。如果只有一个PBX项目,我会让你找到它。你可以为脚本使用不同的语言,但由于我们是Swift开发人员,我会这样做。
主代码:
代码可以是:
字符串
示例输出:
型
用途:
#!/usr/bin/swift
和#import Foundation
,并使其可使用chmod
执行)。New Script Phase
来执行脚本,并从“Bash code”调用它。更进一步:
当然,这段代码目前是“快速和肮脏的”,你可以通过参数化来深入研究它:
init(from decoder:)
)。注意Package.resolved似乎没有列出依赖项(在我的最后一次测试中),所以你不应该能够获得这些版本。