swift 通过图解确定Alamofire的版本号?

nmpmafwu  于 5个月前  发布在  Swift
关注(0)|答案(2)|浏览(59)

我在我的应用程序中使用Alamofire,我想在应用程序启动时将版本号打印到日志中。是否有方法可以以图解方式访问版本号?

xwmevbvl

xwmevbvl1#

Alamofire的版本是它默认的User-Agent头的一部分,所以如果你记录你的网络请求,版本应该已经是它的一部分。我可以看到它是公共的,所以它可以是自定义日志或其他头的一部分,所以我会考虑使它公开。

insrf1ej

insrf1ej2#

由于你使用的是Swift包管理器,并且正如Jon Shierin previous answer所述,该版本不可公开使用。它是there,但只能在框架内访问。
在此之前(正如Alamofire可能会在未来公开该版本),这是一个围绕步骤的小工作。我还没有完全测试它,我只是检查了解码和“字符串输出”,我没有去构建阶段部分,但我会给你给予我认为应该使它工作的主指令。
你可以做的是在构建阶段有一个小脚本,它将读取Package.resolved并生成一个包含所有版本的文件。将该文件添加到你的Target,这应该是好的。
SwiftGen等使用此行为来生成“安全”资产(在模板等的帮助下)
你需要先找到你的Package.resolved。我的是在./MyProject.xcworkspace/xcshareddata/swiftpm/Package.resolved,因为我使用的是工作区。如果只有一个PBX项目,我会让你找到它。
你可以为脚本使用不同的语言,但由于我们是Swift开发人员,我会这样做。

主代码:

代码可以是:

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"
}

用途:

  • 将该代码作为“Swift脚本”(我会让你深入研究:在新的.swift文件的开头或多或少地添加#!/usr/bin/swift#import Foundation,并使其可使用chmod执行)。
  • 在构建阶段通过添加New Script Phase来执行脚本,并从“Bash code”调用它。
  • 将PathOfTheNewSwiftFileYouWant.swift添加到目标。

更进一步:

当然,这段代码目前是“快速和肮脏的”,你可以通过参数化来深入研究它:

  • 脚本参数中的PackageResolved的路径
  • 脚本参数中输出Swift文件的路径
  • 使用一个更“干净的Swift代码”输出,使用Stenchmark或我认为是SwiftSyntax
  • 如果需要的话,从Package.resolved中获取其他参数,或者修改解码(我做得很快,不想使用自定义init(from decoder:))。
  • 如果需要的话,也可以解析CocoaPods/Carthage解析的文件,以获得所有的libs版本(但是如果它们没有生成一个“用户友好”的版本恢复,请事先检查)。

注意Package.resolved似乎没有列出依赖项(在我的最后一次测试中),所以你不应该能够获得这些版本。

相关问题