O documento discute como criar ferramentas de linha de comando em Swift usando o Swift Package Manager. Ele explica como iniciar um projeto, adicionar dependências, escrever código, gerar builds e distribuir a ferramenta concluída.
3. Tales Pinheiro de Andrade
• Chapter leader na Concrete
• Estamos contratando (SP, RJ, BH e Recife)
• Organizador do CocoaHeads SP
• Mestre em computação pelo IME (USP)
• @talesp, tales.andrade@concrete.com.br
6. Por que?
• Ferramental em outras linguagens
• Fastlane, CocoaPods, Slather, mergepbx,
jazzy, lynx, fui, xcode-install, act, etc
• Outras ferramentas
• Swift é poderosa na linha de comando
•Script e SPM
7. Swift Package Manager
The Swift Package Manager is a tool
for managing the distribution of Swift
code. It’s integrated with the Swift
build system to automate the process
of downloading, compiling, and linking
dependencies.
8. Swift Package Manager
$ swift package init !--type executable
•Nome do diretório atual = nome do projeto
•Conteúdo criado:
• Package.swift: arquivo de definição do pacote e
suas dependências
• Sources: diretório com fontes do seu projeto
• Tests: diretório com código de testes
• .gitignore
16. Dependencias úteis
• commandant - Type-safe command line argument
handling
• Carthage, SourceKitten
• Commander - Compose beautiful command line
interfaces in Swift
• QueryKit
• CommandLineKit - A pure Swift library for creating
command-line interfaces
• Guaka - The smartest and most beautiful (POSIX
compliant) Command line framework for Swift
17. Dependencias úteis
• Files - A nicer way to handle files & folders in Swift
• Guitar - A Cross-Platform String and Regular
Expression Library written in Swift
• Rainbow - Delightful console output for Swift
developers
• Releases - A Swift package for resolving released
versions from a Git repository
18. Dependencias úteis
• ShellOut - Easily run shell commands from a Swift
script or command line tool
• Xgen - A Swift package for generating Xcode
workspaces & playgrounds
• Yams - A Sweet and Swifty YAML parser
20. Swift Package Manager
Definido ponto de entrada
Evite adicionar conteúdo no main.swift
• Isolamento para testes
Crie um arquivo no diretório MyGreatToolCore
public final class MyGreatTool {
public func run() throws { !// sua magica acontece aqui
print("Hello world")
}
}
21. Evite adicionar conteúdo no main.swift
• Facilita testes
Crie um arquivo no diretório MyGreatTool
let tool = MyGreatTool()
do {
try tool.run()
} catch {
print("Whoops! An error occurred: (error)")
}
Swift Package Manager
Definido ponto de entrada - main.swift
22. Adicionando código
• lendo da linha de comando:
• readline()
• Imprimindo
• print("The quick brown…")
• Com o Rainbow
• print("The quick brown!!...".red.onBlue)
23. if CommandLine.argc < 2 {
// Expecting a string but didn't receive it
}
else {
let arg = CommandLine.arguments[1]
}
Versus
if ProcessInfo.processInfo.arguments.isEmpty == false {
// Expecting a string but didn't receive it
}
else {
let arg = ProcessInfo.processInfo.arguments[1]
}
Adicionando código
Parâmetros e argumentos
24. Vantagens do ProcessInfo
• ProcessInfo
• variáveis de ambiente - environment
• argumentos - arguments
• nome da maquina - hostName
• versão do SO
• operatingSystemVersionString
• operatingSystemVersion
• memoria, uptime, numero de CPUs, etc...
25. Streams de entrada e saída
// normalmente usado para mensagens de erro
let stderr = FileHandle.standardError
// normalmente usado para mensagens para usuário
let stdout = FileHandle.standardOutput
// usado para ler dados do terminal
let stdin = FileHandle.standardInput
Necessário encoding:
if let data = str.dataUsingEncoding(NSUTF8StringEncoding) {
stderr.writeData(data)
}
26. Finalizando o programa
Seja um bom cidadão - encerre graciosamente
exit(EXIT_SUCCESS)
exit(EXIT_FAILURE)
NÃO! FAÇA!! ISSO!!! NO!!!! IOS!!!!!
27. Criando
$ mkdir Tests/MyGreatToolTests
$ touch Tests/MyGreatToolTests/MyGreatToolTests.swift
Adicione o Target de teste ao array de targets do Package.swift
.testTarget(
name: "MyGreatToolTests",
dependencies: ["MyGreatToolTestsCore", "Projeto"]
)
• XCTestCase liberado!
• $ swift test
Testes
29. $ swift build -c release -Xswiftc -static-stdlib
$ cd .build/release
$ cp -f CommandLineTool /usr/local/bin/commandlinetool
Pariametros -Xswiftc -static-stdlib usados pra linkar
estáticamente as bibliotecas do Swift - projeto auto contido
Compilando e gerando o projeto
30. HomeBrew 🍺
$ brew create http:!//myserver.com/
mygreattool.tgz # url do fonte
Cria Formula (definição de pacote) que pode ser
instalado a partir de um Tap (repositório git da formula),
podendo ser o código fonte (sob algumas condições/
configurações) ou de uma Bottle (distribuição pré-
compilada de uma Keg - prefixo/caminho de instalação
de uma formula)
Formula Cookbook - Acceptable Formulae
31. Swift scripting resources
Command Line Tool in swift
Building a command line tool using the Swift Package Manager
Building Command-Line Tools with Swift
Command Line Programs on macOS Tutorial
32. Centro
Av. Presidente Wilson,
231 - 29º andar
(21) 2240-2030
Cidade Monções
Av. Nações Unidas,
11.541 - 3º andar
(11) 4119-0449
Savassi
Av. Getúlio Vargas, 671
Sala 800 - 8º andar
(31) 3360-8900
www.concrete.com.br