跳转至

指令

Vapor 的 Command API 允许你打造自定义命令行函数并且与终端进行交互。Vapor的默认指令,例如 serve, routesmigrate, 都是通过这个 Api 实现的。

默认指令

通过 --help 选项你可以了解更多 Vapor 的默认指令。

swift run App --help

你同样可以使用 --help 在特定的指令上以查看这个指令接受的参数和选项。

swift run App serve --help

Xcode

你可以通过加入参数到 Xcode 的 App scheme 以运行指令。通过一下三步做到这点:

  • 选择 App scheme (在 运行/停止 按钮的右边)
  • 选择 "Edit Scheme"
  • 选择 "App"
  • 选择 "Arguments" 这一栏
  • 将指令的名词添加到 "Arguments Passed On Launch" (例如, serve)

自定义指令

你可以通过一个符合 AsyncCommand 协议的类型创建你自己的命令

import Vapor

struct HelloCommand: AsyncCommand {
    ...
}

将自定义指令加入到 app.asyncCommands 将允许你使用这个指令通过 swift run

app.asyncCommands.use(HelloCommand(), as: "hello")

为了符合 AsyncCommand ,你必须实现 run 方法。这个方法需要你定义一个 Signature 。你还需要提供一个默认的帮助文本。

import Vapor

struct HelloCommand: AsyncCommand {
    struct Signature: CommandSignature { }

    var help: String {
        "Says hello"
    }

    func run(using context: CommandContext, signature: Signature) async throws {
        context.console.print("Hello, world!")
    }
}

这个简单的指令例子没有参数或者选项,所以让 signature 为空。

你可以通过 context 访问当前的 console(控制台)。console 有许多有帮助的方法来提示用户输入,格式化输出,还有更多。

let name = context.console.ask("What is your \("name", color: .blue)?")
context.console.print("Hello, \(name) 👋")

通过运行你的命令来测试:

swift run App hello

Cowsay

看一下这个著名的 cowsay 指令的重制版。它将作为 @Argument@Option 使用的一个例子。

import Vapor

struct Cowsay: AsyncCommand {
    struct Signature: CommandSignature {
        @Argument(name: "message")
        var message: String

        @Option(name: "eyes", short: "e")
        var eyes: String?

        @Option(name: "tongue", short: "t")
        var tongue: String?
    }

    var help: String {
        "Generates ASCII picture of a cow with a message."
    }

    func run(using context: CommandContext, signature: Signature) async throws {
        let eyes = signature.eyes ?? "oo"
        let tongue = signature.tongue ?? "  "
        let cow = #"""
          < $M >
                  \   ^__^
                   \  ($E)\_______
                      (__)\       )\/\
                       $T ||----w |
                          ||     ||
        """#.replacingOccurrences(of: "$M", with: signature.message)
            .replacingOccurrences(of: "$E", with: eyes)
            .replacingOccurrences(of: "$T", with: tongue)
        context.console.print(cow)
    }
}

尝试将这个指令加入到程序然后运行它。

app.asyncCommands.use(Cowsay(), as: "cowsay")
swift run App cowsay sup --eyes ^^ --tongue "U "