Comandos¶
La API de comandos de Vapor te permite crear funciones de línea de comandos personalizadas e interactuar con la consola (terminal). Es en lo que se basan los comandos predeterminados de Vapor como serve
, routes
y migrate
.
Comandos Predeterminados¶
Puedes obtener más información sobre los comandos predeterminados de Vapor usando la opción --help
.
swift run App --help
Puedes usar --help
en un comando específico para ver qué argumentos y opciones acepta.
swift run App serve --help
Xcode¶
Puedes ejecutar comandos en Xcode agregando argumentos al esquema App
. Para hacerlo, sigue estos pasos:
- Elige el esquema
App
(a la derecha de los botones play/stop) - Haz clic en "Edit Scheme"
- Elige el producto "App"
- Selecciona la pestaña "Arguments"
- Agrega el nombre del comando a "Arguments Passed On Launch" (por ejemplo,
serve
)
Comandos Personalizados¶
Puedes crear tus propios comandos creando tipos que conformen a AsyncCommand
.
import Vapor
struct HelloCommand: AsyncCommand {
...
}
Agregar el comando personalizado a app.asyncCommands
lo hará disponible mediante swift run
.
app.asyncCommands.use(HelloCommand(), as: "hello")
Para conformar con AsyncCommand
, debes implementar el método run
. Esto requiere declarar una Signature
. También debes proporcionar el texto de ayuda predeterminado.
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!")
}
}
Este ejemplo de comando simple no tiene argumentos ni opciones, así que deja la firma vacía.
Puedes obtener acceso a la consola actual a través del contexto proporcionado. La consola tiene muchos métodos útiles para solicitar la entrada del usuario, el formato de salida y más.
let name = context.console.ask("What is your \("name", color: .blue)?")
context.console.print("Hello, \(name) 👋")
Prueba tu comando ejecutando:
swift run App hello
Cowsay¶
Aquí tienes una recreación del famoso comando cowsay
para ver un ejemplo de cómo usar @Argument
y @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)
}
}
Intenta agregar esto a tu aplicación y ejecútalo.
app.asyncCommands.use(Cowsay(), as: "cowsay")
swift run App cowsay sup --eyes ^^ --tongue "U "