繁体   English   中英

swift 命令行工具,用于 git 命令,但它没有

[英]swift command line tool for git commands, but its no

我想使用 swift 为 git 命令创建一个工具。

  • 我收到 git 错误用法: git [--version] [--help] [-C ] [-c =]

  • 有没有办法将它作为命令行 package 分发并在swift文件中使用?


import Foundation

struct Task {
    static let shared = Task()

    func run(with args: String...){
        let task = Process()
        task.launchPath = "/usr/bin/git"
        task.arguments = ["-c", args.joined(separator: " ")]

        let pipe = Pipe()
        task.standardOutput = pipe
        task.launch()

        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        let output = String(data: data, encoding: .utf8)!
        print(output)
        task.waitUntilExit()
    }
}


let task = Task.shared
task.run(with: "status")
task.run(with: "fetch --all")
task.run(with: "add --all")

您在代码中使用了不推荐使用的方法,并且缺少其他一些东西。

首先我们应该设置 shell 使用

func run(with args: String...){
    let task = Process()
    task.executableURL = URL(fileURLWithPath: "/bin/zsh")

然后,我们不使用已弃用的启动路径,而是使用完整命令构建一个字符串,并将其设置为任务的launchPath

let arguments = "/usr/bin/git \(args.joined(separator: " "))"
task.arguments = ["-c", arguments]

我也认为通过检查标准错误来处理任何错误是个好主意

let pipe = Pipe()
let errorPipe = Pipe()
task.standardOutput = pipe
task.standardError = errorPipe

不要使用已弃用的launch方法,而是使用run并读取标准输出和标准错误

do {
    try task.run()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    if !data.isEmpty {
        if let output = String(data: data, encoding: .utf8) {
            print(output)
        }
    }

    let error = errorPipe.fileHandleForReading.readDataToEndOfFile()
    if !error.isEmpty {
        if let errorMessage = String(data: error, encoding: .utf8) {
            print(errorMessage)
        }
    }
} catch {
    print(error)
}

对于一个简单的命令,可能值得在if/else中处理标准 output 和标准错误,因此请随意更改,但对于更复杂的命令,例如处理多个文件,它可能会同时产生 output 和错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM