SlideShare a Scribd company logo
1 of 32
Download to read offline
Swift na linha de
comando
A Swift Introduction
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
SUMÁRIO
Conteúdo
• Swift Package Manager
• Gerenciando dependencias
• Adicionando código
• Gerando e distribuindo o projeto
#!/usr/bin/swift
import Foundation
// do whatever you want
Swift scripting
Build phases em Swift FTW
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
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.
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
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "MyGreatTool",
dependencies: [
],
targets: [
.target(
name: "MyGreatTool",
dependencies: []),
]
)
Swift Package Manager
Package.swift
// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "MyGreatTool",
dependencies: [
],
targets: [
.target(
name: "MyGreatTool",
dependencies: ["MyGreatToolCore"]
),
.target(name: "MyGreatToolCore")
]
)
Swift Package Manager
Package.swift
Swift Package Manager
Criando módulos
Sources/MyGreatToolCore
• criar novos diretórios define novos módulos
• file system as a source of truth
Gerenciando
dependencias
•Swift Package Manager
•Carthage
•CocoaPods
Gerenciando
dependências
Instalando dependencias
Usando SPM
import PackageDescription
let package = Package(
name: "MyGreatTool",
dependencies: [
.package(
url: "https://github.com/usuario/projeto.git",
from: "1.0.0"
)
],
targets: [
.target(
name: "MyGreatTool",
dependencies: ["MyGreatToolCore"]
),
.target(
name: "MyGreatToolCore",
dependencies: []
)
]
)
Swift Package Manager
$ swift package update
$ swift package generate-xcodeproj
That's it!
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
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
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
Adicionando código
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")
}
}
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
Adicionando código
• lendo da linha de comando:
• readline()
• Imprimindo
• print("The quick brown…")
• Com o Rainbow
• print("The quick brown!!...".red.onBlue)
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
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...
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)
}
Finalizando o programa
Seja um bom cidadão - encerre graciosamente
exit(EXIT_SUCCESS)
exit(EXIT_FAILURE)
NÃO! FAÇA!! ISSO!!! NO!!!! IOS!!!!!
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
Gerando e distribuído
$ 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
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
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
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

More Related Content

What's hot

12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com DockerWellington Silva
 
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com ElixirAmadeu Cavalcante
 
Primeiros passos com o Docker
Primeiros passos com o DockerPrimeiros passos com o Docker
Primeiros passos com o DockerWebSix
 
Otimizando sites com o nosql redis
Otimizando sites com o nosql redisOtimizando sites com o nosql redis
Otimizando sites com o nosql redisAllisson Azevedo
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker ContainersHugo Henley
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)Wellington Silva
 
Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Mario Guedes
 
PHP e PostgreSQL - Dois Elefantes trabalham muito mais !
PHP e PostgreSQL - Dois Elefantes trabalham muito mais !PHP e PostgreSQL - Dois Elefantes trabalham muito mais !
PHP e PostgreSQL - Dois Elefantes trabalham muito mais !William Felipe
 
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...tdc-globalcode
 
Facebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do FacebookFacebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do FacebookRafael Alves
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida realFernando Ike
 
O poder do Docker (7º meetup de Docker SP)
O poder do Docker (7º meetup de Docker SP)O poder do Docker (7º meetup de Docker SP)
O poder do Docker (7º meetup de Docker SP)Wellington Silva
 
Vagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoVagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoDiogo Lucas
 
TDC2018SP | Trilha Containers - Docker Swarm - Os problemas
TDC2018SP | Trilha Containers - Docker Swarm - Os problemasTDC2018SP | Trilha Containers - Docker Swarm - Os problemas
TDC2018SP | Trilha Containers - Docker Swarm - Os problemastdc-globalcode
 
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...Stefan Teixeira
 

What's hot (19)

12 factor app. Melhor com Docker
12 factor app. Melhor com Docker12 factor app. Melhor com Docker
12 factor app. Melhor com Docker
 
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
[CodeBEAM BR 2020] Construindo e Distribuindo CLIs com Elixir
 
Workshop Docker
Workshop DockerWorkshop Docker
Workshop Docker
 
Docker volumes
Docker volumesDocker volumes
Docker volumes
 
Primeiros passos com o Docker
Primeiros passos com o DockerPrimeiros passos com o Docker
Primeiros passos com o Docker
 
Otimizando sites com o nosql redis
Otimizando sites com o nosql redisOtimizando sites com o nosql redis
Otimizando sites com o nosql redis
 
Deploying Docker Containers
Deploying Docker ContainersDeploying Docker Containers
Deploying Docker Containers
 
O poder do Docker (7 Masters)
O poder do Docker (7 Masters)O poder do Docker (7 Masters)
O poder do Docker (7 Masters)
 
Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!Paralelismo na prática: Threads de uma vez por todas e sem medo!
Paralelismo na prática: Threads de uma vez por todas e sem medo!
 
PHP e PostgreSQL - Dois Elefantes trabalham muito mais !
PHP e PostgreSQL - Dois Elefantes trabalham muito mais !PHP e PostgreSQL - Dois Elefantes trabalham muito mais !
PHP e PostgreSQL - Dois Elefantes trabalham muito mais !
 
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
TDC2018SP | Trilha Containers - Provisionando um cluster Kubernetes multi-mas...
 
Facebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do FacebookFacebook's Hack programming language / Linguagem de programação Hack do Facebook
Facebook's Hack programming language / Linguagem de programação Hack do Facebook
 
Docker na vida real
Docker na vida realDocker na vida real
Docker na vida real
 
O poder do Docker (7º meetup de Docker SP)
O poder do Docker (7º meetup de Docker SP)O poder do Docker (7º meetup de Docker SP)
O poder do Docker (7º meetup de Docker SP)
 
Vagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolsoVagrant & Docker: carregue seus ambientes no bolso
Vagrant & Docker: carregue seus ambientes no bolso
 
TDC2018SP | Trilha Containers - Docker Swarm - Os problemas
TDC2018SP | Trilha Containers - Docker Swarm - Os problemasTDC2018SP | Trilha Containers - Docker Swarm - Os problemas
TDC2018SP | Trilha Containers - Docker Swarm - Os problemas
 
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
TDC 2015 Floripa - Testes Automatizados de todos os tipos utilizando bibliote...
 
Seminário: Delphi
Seminário: DelphiSeminário: Delphi
Seminário: Delphi
 
Protegendo Docker
Protegendo DockerProtegendo Docker
Protegendo Docker
 

Similar to Swift na linha de comando

utilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythonutilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythontdc-globalcode
 
OpenShift: NoSQL "a la carte" num PaaS 100% Open Source
OpenShift: NoSQL  "a la carte"  num PaaS 100% Open SourceOpenShift: NoSQL  "a la carte"  num PaaS 100% Open Source
OpenShift: NoSQL "a la carte" num PaaS 100% Open SourceEdgar Silva
 
Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Getup Cloud
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2PrinceGuru MS
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHPRangel Javier
 
O bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsO bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsNuno Paz
 
Java Fundamentos
Java FundamentosJava Fundamentos
Java FundamentosWilson Lima
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Jaime Neto
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorAllyson Barros
 
Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...
Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...
Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...Renato Groff
 
Painel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGPainel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGiMasters
 
[Curso Java Básico] Aula 06: Passando argumentos para o programa
[Curso Java Básico] Aula 06: Passando argumentos para o programa[Curso Java Básico] Aula 06: Passando argumentos para o programa
[Curso Java Básico] Aula 06: Passando argumentos para o programaLoiane Groner
 

Similar to Swift na linha de comando (20)

utilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em pythonutilitários de linha de comando bonitos em python
utilitários de linha de comando bonitos em python
 
OpenShift: NoSQL "a la carte" num PaaS 100% Open Source
OpenShift: NoSQL  "a la carte"  num PaaS 100% Open SourceOpenShift: NoSQL  "a la carte"  num PaaS 100% Open Source
OpenShift: NoSQL "a la carte" num PaaS 100% Open Source
 
Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014
 
Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Aula1
Aula1Aula1
Aula1
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 
Slide Aula - Curso CakePHP
Slide Aula - Curso CakePHPSlide Aula - Curso CakePHP
Slide Aula - Curso CakePHP
 
O bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.jsO bom, o mau, o vilão... e o node.js
O bom, o mau, o vilão... e o node.js
 
Java Fundamentos
Java FundamentosJava Fundamentos
Java Fundamentos
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
POO - Aula 1 introducao
POO - Aula 1   introducaoPOO - Aula 1   introducao
POO - Aula 1 introducao
 
Seu framework é melhor pra quê?
Seu framework é melhor pra quê?Seu framework é melhor pra quê?
Seu framework é melhor pra quê?
 
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem DorPlay Framework - Desenvolvendo Aplicações Web com Java sem Dor
Play Framework - Desenvolvendo Aplicações Web com Java sem Dor
 
UTools Unite Brasil
UTools Unite BrasilUTools Unite Brasil
UTools Unite Brasil
 
Manual
ManualManual
Manual
 
Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...
Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...
Tecnologias Microsoft em Linux: .NET Core, SQL Server e Visual Studio Code - ...
 
Painel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNGPainel HHVM, Zephir, PHPNG
Painel HHVM, Zephir, PHPNG
 
[Curso Java Básico] Aula 06: Passando argumentos para o programa
[Curso Java Básico] Aula 06: Passando argumentos para o programa[Curso Java Básico] Aula 06: Passando argumentos para o programa
[Curso Java Básico] Aula 06: Passando argumentos para o programa
 

More from Tales Andrade

Debugging tips and tricks - coders on beers Santiago
Debugging tips and tricks -  coders on beers SantiagoDebugging tips and tricks -  coders on beers Santiago
Debugging tips and tricks - coders on beers SantiagoTales Andrade
 
Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Tales Andrade
 
Delegateless Coordinator
Delegateless CoordinatorDelegateless Coordinator
Delegateless CoordinatorTales Andrade
 
Debugging tips and tricks
Debugging tips and tricksDebugging tips and tricks
Debugging tips and tricksTales Andrade
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação FuncionalTales Andrade
 
Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?Tales Andrade
 
Debugging fast track
Debugging fast trackDebugging fast track
Debugging fast trackTales Andrade
 

More from Tales Andrade (8)

Debugging tips and tricks - coders on beers Santiago
Debugging tips and tricks -  coders on beers SantiagoDebugging tips and tricks -  coders on beers Santiago
Debugging tips and tricks - coders on beers Santiago
 
Delegateless Coordinators - take 2
Delegateless Coordinators - take 2Delegateless Coordinators - take 2
Delegateless Coordinators - take 2
 
Delegateless Coordinator
Delegateless CoordinatorDelegateless Coordinator
Delegateless Coordinator
 
Debugging tips and tricks
Debugging tips and tricksDebugging tips and tricks
Debugging tips and tricks
 
Usando POP com Programação Funcional
Usando POP com Programação FuncionalUsando POP com Programação Funcional
Usando POP com Programação Funcional
 
Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?Swift!.opcionais.oh!.my()?!?
Swift!.opcionais.oh!.my()?!?
 
Debugging fast track
Debugging fast trackDebugging fast track
Debugging fast track
 
Tales@tdc
Tales@tdcTales@tdc
Tales@tdc
 

Swift na linha de comando

  • 1.
  • 2. Swift na linha de comando A Swift Introduction
  • 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
  • 4. SUMÁRIO Conteúdo • Swift Package Manager • Gerenciando dependencias • Adicionando código • Gerando e distribuindo o projeto
  • 5. #!/usr/bin/swift import Foundation // do whatever you want Swift scripting Build phases em Swift FTW
  • 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
  • 9. // swift-tools-version:4.0 import PackageDescription let package = Package( name: "MyGreatTool", dependencies: [ ], targets: [ .target( name: "MyGreatTool", dependencies: []), ] ) Swift Package Manager Package.swift
  • 10. // swift-tools-version:4.0 import PackageDescription let package = Package( name: "MyGreatTool", dependencies: [ ], targets: [ .target( name: "MyGreatTool", dependencies: ["MyGreatToolCore"] ), .target(name: "MyGreatToolCore") ] ) Swift Package Manager Package.swift
  • 11. Swift Package Manager Criando módulos Sources/MyGreatToolCore • criar novos diretórios define novos módulos • file system as a source of truth
  • 14. Instalando dependencias Usando SPM import PackageDescription let package = Package( name: "MyGreatTool", dependencies: [ .package( url: "https://github.com/usuario/projeto.git", from: "1.0.0" ) ], targets: [ .target( name: "MyGreatTool", dependencies: ["MyGreatToolCore"] ), .target( name: "MyGreatToolCore", dependencies: [] ) ] )
  • 15. Swift Package Manager $ swift package update $ swift package generate-xcodeproj That's it!
  • 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