Download - Александр Воронов | Building CLI with Swift
IT Saturday • @aleks_voronov • Stanfy
BUILDING CLI WITH SWIFTALEXANDER VORONOV, STANFY
@aleks_voronov
IT Saturday • @aleks_voronov • Stanfy
REASON WHY?
IT Saturday • @aleks_voronov • Stanfy
OTHER PLATFORMS
IT Saturday • @aleks_voronov • Stanfy
JAVASCRIPT
NODEJS NPM
BOWER GULP
GRUNT
IT Saturday • @aleks_voronov • Stanfy
RUBY
RACK RAILS
SINATRA RUBYGEMS
RAKE
IT Saturday • @aleks_voronov • Stanfy
PYTHONPYPI PIP …
IT Saturday • @aleks_voronov • Stanfy
SWIFT
COCOAPODS CARTHAGE
SPM PERFECT
COMMANDANT
IT Saturday • @aleks_voronov • Stanfy
FULLSTACK MULTIPLATFORM
IT Saturday • @aleks_voronov • Stanfy
FULLSTACK MULTIPLATFORM
IT Saturday • @aleks_voronov • Stanfy
WHAT IS CLI?
IT Saturday • @aleks_voronov • Stanfy
WHAT IS CLI?
IT Saturday • @aleks_voronov • Stanfy
CLI ARGUMENTS
IT Saturday • @aleks_voronov • Stanfy
POSIX STANDARD 📘SHORT FLAGS
$ ls -a
$ ruby -v
$ git commit -m "..."
IT Saturday • @aleks_voronov • Stanfy
GNU STANDARD 📙LONG FLAGS
$ ls --all
$ ruby --version
$ git commit --message "..."
IT Saturday • @aleks_voronov • Stanfy
COMBINED FLAGS 🏴$ git commit -a -m "..."
$ git commit -am "..."
IT Saturday • @aleks_voronov • Stanfy
SUBCOMMANDS 🏘$ git log -2
$ git status
$ git commit -am "..."
IT Saturday • @aleks_voronov • Stanfy
STANDARD IO 📥📤0 - STDIN
1 - STDOUT 2 - STDERR
IT Saturday • @aleks_voronov • Stanfy
0 - STDIN 1 - STDOUT 2 - STDERR
$ cat nofile
> cat: nofile: No such file or directory
IT Saturday • @aleks_voronov • Stanfy
0 - STDIN 1 - STDOUT 2 - STDERR
$ cat nofile 2>>err.log
IT Saturday • @aleks_voronov • Stanfy
0 - STDIN 1 - STDOUT 2 - STDERR
$ cat nofile 2>&1
IT Saturday • @aleks_voronov • Stanfy
0 - STDIN 1 - STDOUT 2 - STDERR
$ cat nofile 2>>err.log 1>>out.log
IT Saturday • @aleks_voronov • Stanfy
0 - STDIN 1 - STDOUT 2 - STDERR
$ cat nofile 2>/dev/null
IT Saturday • @aleks_voronov • Stanfy
0 - STDIN 1 - STDOUT 2 - STDERR
$ cat nofile 2>&1 | grep kernel
IT Saturday • @aleks_voronov • Stanfy
UNIX PIPELINES ⛓$ ls -l | grep "Mar" | sort
IT Saturday • @aleks_voronov • Stanfy
UNIX PIPELINES ⛓$ ps aux | grep Xcode | awk '{print $2}'
IT Saturday • @aleks_voronov • Stanfy
UNIX PIPELINES ⛓$ git branch | xargs git branch -D
😈
IT Saturday • @aleks_voronov • Stanfy
CLI WITH SWIFT 🖥
IT Saturday • @aleks_voronov • Stanfy
SWIFT REPL 🔃(READ-EVALUATION-PRINT-LOOP)
$ swift
IT Saturday • @aleks_voronov • Stanfy
IMMEDIATE MODE 🚀$ swift script.swift
IT Saturday • @aleks_voronov • Stanfy
SWIFT COMPILE ⚙$ swiftc script.swift $ ./script
IT Saturday • @aleks_voronov • Stanfy
SWIFT COMPILE ⚙$ swiftc script.swift -o myscript $ ./myscript
IT Saturday • @aleks_voronov • Stanfy
EXECUTABLE SCRIPTS 💾
IT Saturday • @aleks_voronov • Stanfy
EXECUTABLE SCRIPTS
#!/USR/BIN/SWIFT
HASHBANG
IT Saturday • @aleks_voronov • Stanfy
EXECUTABLE SCRIPTS
CHMOD +X SCRIPT.SWIFT
IT Saturday • @aleks_voronov • Stanfy
SCALING OUR CLI 🏗WORKING WITH MULTIPLE FILES
IT Saturday • @aleks_voronov • Stanfy
MAIN.SWIFT 👑
IT Saturday • @aleks_voronov • Stanfy
EXECUTING MULTIPLE FILES📄📄$ swift main.swift script.swift
IT Saturday • @aleks_voronov • Stanfy
$ swiftc main.swift script.swift -o script
EXECUTING MULTIPLE FILES📄📄
IT Saturday • @aleks_voronov • Stanfy
$ swiftc script.swift main.swift -o script
EXECUTING MULTIPLE FILES📄📄
IT Saturday • @aleks_voronov • Stanfy
$ swiftc *.swift -o script
EXECUTING MULTIPLE FILES📄📄
IT Saturday • @aleks_voronov • Stanfy
$ find . -iname '*.swift' | xargs swiftc -o script
EXECUTING MULTIPLE FILES📄📄
IT Saturday • @aleks_voronov • Stanfy
EXTERNAL RESOURCES 🎁
IT Saturday • @aleks_voronov • Stanfy
SYSTEM DEPENDENCIES 💼$ swiftc script.swift
$ xcrun -sdk macosx swiftc script.swift
IT Saturday • @aleks_voronov • Stanfy
CUSTOM DEPENDENCIES 🛠-F
$ swift -F /Carthage/Build/Mac script.swift
IT Saturday • @aleks_voronov • Stanfy
CUSTOM DEPENDENCIES
#!/USR/BIN/SWIFT -F Carthage/Build/Mac
HASHBANG
IT Saturday • @aleks_voronov • Stanfy
COMPILING DEPENDENT SCRIPT 🤖
IT Saturday • @aleks_voronov • Stanfy
$ xcrun \ -sdk macosx swiftc \ -F Carthage/Build/Mac script.swift
COMPILING DEPENDENT SCRIPT
> dyld: Library not loaded: @rpath
IT Saturday • @aleks_voronov • Stanfy
$ xcrun \ -sdk macosx swiftc \ -F Carthage/Build/Mac script.swift \ -Xlinker -rpath \ -Xlinker @executable_path/Carthage/Build/Mac
COMPILING DEPENDENT SCRIPT
IT Saturday • @aleks_voronov • Stanfy
DEPENDENCIES MANAGEMENT 🍴
IT Saturday • @aleks_voronov • Stanfy
COCOAPODS 🤔
IT Saturday • @aleks_voronov • Stanfy
CARTHAGE 😏
IT Saturday • @aleks_voronov • Stanfy
SPM 😳SWIFT PACKAGE MANAGER
IT Saturday • @aleks_voronov • Stanfy
PARSING ARGUMENTS 📬
IT Saturday • @aleks_voronov • Stanfy
PARSING ARGUMENTS
$ ./script one two three
$ ./script one\ two\ three
$ ./script "one two three"
3 args
1 arg
1 arg
IT Saturday • @aleks_voronov • Stanfy
PROCESS ENUMProcess.arguments == [ "./script.swift", "one", "two", "three"
]
IT Saturday • @aleks_voronov • Stanfy
FILESYSTEM 🗄
IT Saturday • @aleks_voronov • Stanfy
FILESYSTEMNSFILEMANAGER NSFILEHANDLER
NSTASK NSPIPE
IT Saturday • @aleks_voronov • Stanfy
HANDY LIBRARIES🏛
COMMANDER OPTIONKIT
COMMANDANT REACTIVETASKS PRETTYCOLORS
IT Saturday • @aleks_voronov • Stanfy
REAL WORLD EXAMPLES 🌍
CARTHAGEKITCARTHAGE CLI
IT Saturday • @aleks_voronov • Stanfy
THANK YOU!
IT Saturday • @aleks_voronov • Stanfy
Q/A
@ALEKS_VORONOV A-VORONOV