Wiederkehrende Aufgaben in Swift automatisieren

10. April 2018

Beak automatisiert wiederkehrende Aufgaben

Ich habe kürzlich ein Framework entdeckt, das mich richtig begeistert: https://github.com/yonaskolb/Beak

Der große Vorteil von Beak ist, dass wir Methoden in Swift schreiben und sie sehr einfach über die Kommandozeile ausführen können. Beak anaylsiert die Swift-Datei automatisch, findet alle public Methoden sowie ihre Parameter und stellt die Methoden als Subcommands zur Verfügung. Hier seht ihr eine beak.swift Beispiel-Datei:

import Foundation 

public func hello(name: String, useExclamationMark: Bool = true) { 
    let output = "Hello \(name)" 
    let suffix = useExclamationMark ? "!" : "." 
    print(output + suffix) 
} 

Wenn Beak installiert ist, könnt ihr die Methode so über die Kommandozeile ausführen:

$ beak run hello --name "World" 
// Hello World! 
$ beak run hello --name "World" --useExclamationMark false 
// Hello World. 

Beachtet, dass der Parameter name nicht optional ist, da er in der Methodendeklaration keinen Default-Wert hat.

Externe Bibliotheken nutzen

Aber das ist noch nicht alles, was Beak kann. Wir haben gerade ein "Hello World"-Beispiel gesehen, aber in der realen Welt müssen wir anspruchsvollere Aufgaben erledigen. Das bedeutet, es wäre wirklich nützlich, externe Bibliotheken einbinden zu können. Beak unterstützt auch das. Also fügen wir mal ein paar nützliche Bibliotheken für Kommandozeilenprogramme hinzu:

// beak: kareman/SwiftShell @ .upToNextMajor(from: "4.0.0") 
// beak: onevcat/Rainbow @ .upToNextMajor(from: "3.0.3") 

import Foundation 
import SwiftShell 
import Rainbow 

// MARK: - Tasks 
/// Installs project dependencies. 
public func installDependencies() throws { 
    let command = "carthage bootstrap --platform ios --cache-builds" 
    print("Installing dependencies via Carthage: '\(command)'", level: .info) 
    try runAndPrint(bash: command) 
} 

/// Updates project dependencies. 
public func updateDependencies() throws { 
    let command = "carthage update --platform ios --cache-builds" 
    print("Updating dependencies via Carthage: \(command)", level: .info) 
    try runAndPrint(bash: command) 
} 

// MARK: - Helpers 
private enum PrintLevel { 
    case info 
    case warning 
    case error 
} 

private func print(_ message: String, level: PrintLevel) { 
    switch level { 
    case .info: 
        print("ℹ️ ", message.lightBlue) 

    case .warning: 
        print("⚠️ ", message.yellow) 

     case .error: 
        print("❌ ", message.red) 
    } 
} 

Abhängigkeiten installieren

Jetzt können wir eine einfache, kurze Aufgabe ausführen, um Projekt-Abhängigkeiten mit Carthage zu installieren:

$ beak run installDependencies 
// ℹ️  Installing dependencies via Carthage: 'carthage bootstrap --platform ios --cache-builds' 
// *** Checking out Nimble at "v7.0.3" 
// *** Checking out HandyUIKit at "1.6.0" 
// *** Checking out HandySwift at "2.4.0" 

Beeindruckend! Beak hat gerade zwei Abhängigkeiten installiert (SwiftShell und Rainbow), sie automatisch in die Datei integriert und den Code wie erwartet ausgeführt. Das war einfach! Beak kann alle Bibliotheken, die den Swift Package Manager unterstützen, installieren – und davon gibt es viele.

Aber unsere Datei wird lang und Code-Vervollständigung für eine einzelne Datei in Xcode ist nicht so gut, insbesondere funktioniert sie für externe Bibliotheken gar nicht. Beak macht sogar das zum Kinderspiel. Einfach beak edit ausführen und es generiert ein Xcode-Projekt und hängt alle externen Bibliotheken in das Projekt ein. Jetzt können wir einfach die main.swift Datei innerhalb des Projekts editieren und wenn wir fertig sind im Anschluss in der Kommandozeile c (wie copy) und Enter eintippen. Dann kopiert Beak automatisch die main.swift-Datei aus dem Projekt und ersetzt unsere beak.swift-Datei damit. Auf diese Art und Weise können wir Xcode-Autovervollständigungen voll ausnutzen und die Komplilier-Warnungen und Fehler unmittelbar während des Programmiervorgangs sehen.

Vergleichsbeispiel - Programmieren mit und ohne Beak

Hier ist ein Einsatzbeispiel aus der wirklichen Welt mit einer Beak-Datei für unser NewProjectTemplate Github-Projekt:
https://github.com/JamitLabs/NewProjectTemplate-iOS/blob/stable/beak.swift

Seht ihr, wieviel einfacher Beak es im Vergleich zu vorher gemacht hat, ein neues Projekt zu erstellen?

Ist das nicht genial? Vielen Dank, Yonas Kolb!