Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
[ad_1]
The following pointers will assist you to to create superb CLI instruments, utility apps, server facet tasks or terminal scripts utilizing the Swift language.
Swift
It’s potential to run a Swift file straight from the command line in case you add a hashbang to the start of the file. This fashion you do not have to manually compile the code utilizing the swiftc
command. You possibly can merely give the file the executable permission flag and the system will name the Swift
REPL below the hood, so our app will be evaluated routinely. 🔨
#!/usr/bin/env swift
print("Whats up, world!")
For instance this important.swift
file above will be marked as an executable file, and we will merely name it by way of the ./important.swift
command in a while (you simply have to make use of chmod just one time).
chmod +x important.swift
./important.swift
The great thing about this methodology is that you could quickly check your Swift command line snippets. You possibly can even place the completed Swift scripts below the /usr/native/bin/
listing with out the swift
file extension to make them obtainable “globally” to your working system consumer. 💪
The CommandLine enum makes it very straightforward to fetch the arguments handed to our Swift software or script. You possibly can entry each argument utilizing the arguments
variable as an array of Strings, however it is usually potential to get the uncooked knowledge utilizing the argc
and unsafeArgv
properties.
#!/usr/bin/env swift
let script = CommandLine.arguments[0]
print("Script:", script)
let inputArgs = CommandLine.arguments.dropFirst()
print("Variety of arguments:", inputArgs.depend)
print("Arguments:")
for arg in inputArgs {
print("-", arg)
}
It’s best to word that the primary argument is all the time the trail of the present script, so in case you are solely searching for the enter arguments you need to use the dropFirst()
methodology to return a subset of the enter strings. Normally every argument is separated by an area character.
./important.swift howdy world
In Xcode you possibly can add customized arguments below the Edit Scheme… menu merchandise while you click on on the present scheme, search for the Arguments tab and use the Arguments Handed On Launch part.
Similar to we will entry command line arguments, it’s potential to look at the present course of together with some {hardware} info and setting variables.
#!/usr/bin/env swift
import Basis
let data = ProcessInfo.processInfo
print("Course of data")
print("Course of identifier:", data.processIdentifier)
print("System uptime:", data.systemUptime)
print("Globally distinctive course of id string:", data.globallyUniqueString)
print("Course of title:", data.processName)
print("Software program data")
print("Host title:", data.hostName)
print("OS main model:", data.operatingSystemVersion.majorVersion)
print("OS model string", data.operatingSystemVersionString)
print("{Hardware} data")
print("Lively processor depend:", data.activeProcessorCount)
print("Bodily reminiscence (bytes)", data.physicalMemory)
print("Arguments")
print(ProcessInfo.processInfo.arguments)
print("Surroundings")
print(data.setting)
The setting variables property is a Dictionary the place each the keys and the values can be found as strings, so that you might need to parse them in case you are searching for totally different worth varieties. You possibly can arrange setting customized variables in Xcode similar to arguments, or you possibly can cross them by way of the command line earlier than you execute the Swift script utilizing the export command.
You should utilize the print perform to jot down textual content to the usual output, however you must word that the print perform has a variadic objects definition, so you possibly can cross round a number of arguments and a customized separator & terminator parameter to show extra superior outputs.
There’s additionally a typical error stream, which is a part of the customary streams in fact, however what’s fascinating about it’s that you could additionally write to this channel by the FileHandle.standardError
property there may be fairly a sublime answer on a Stack Overflow thread initially created by Rob Napier, I’ll embrace that one right here as effectively. 🙏
One other nice function of the print perform is the to parameter, which may settle for a customized TextOutputStream
so you possibly can wrap the stderr stream in a customized object or it’s also possible to create customized output handlers and separate your print statements e.g. by context in case you want.
#!/usr/bin/env swift
import Basis
print("This", "is", "enjoyable", separator: "-", terminator: "!")
"This goes to the usual error output"
.knowledge(utilizing: .utf8)
.map(FileHandle.standardError.write)
remaining class StandardErrorOutputStream: TextOutputStream {
func write(_ string: String) {
FileHandle.standardError.write(Information(string.utf8))
}
}
var outputStream = StandardErrorOutputStream()
print("That is additionally an error", to: &outputStream)
func clear() {
print("u{1B}[2J")
print("u{1B}[(1);(0)H", terminator: "")
}
print("foooooooooooooooooooooo")
clear()
print("Hello, world!")
print("u{1b}[31;1mu{1b}[40;1m("Hello, world!")u{1b}[m")
print("u{1b}[32;1m("Hello, world!")u{1b}[m")
print("Please enter your input:")
guard let input = readLine(strippingNewline: true) else {
fatalError("Missing input")
}
print(input)
The second half of the snippet is full of ANSI escape codes which I like quite a lot, because it can make our terminal output quite beautiful. The only problem is that they don’t work in Xcode at all (come-on Apple, please support this…). You can clear the console or change the background / foreground color of the output by using these codes.
There are quite a lot of libraries on GitHub that you can use to print colorful output, for example ColorizeSwift, ANSITerminal, ANSIEscapeCode and many more cool ones.
The very last thing that I’d like to show you is the readLine function, which you can use to read a line from the standard input. This comes handy if you need to get user input from the command line.
If you are looking for a type-safe argument parser written in Swift, you should definitely take a look at the Swift Argument Parser library. It is created and maintained by Apple, so it’s kind of an official solution for this particular issue, but IMHO it lacks some advanced features.
This is the main reason why I prefer the Vapor command API built on top of the ConsoleKit library. Both libraries can parse arguments, options and flags, but ConsoleKit is also capable of displaying progress indicators, it features multiple command groups, secure input, auto-completion, multiple log levels and many more.
import Foundation
import ConsoleKit
final class HelloCommand: Command {
struct Signature: CommandSignature {
@Argument(name: "name", help: "The name to say hello")
var name: String
@Option(name: "greeting", short: "g", help: "Greeting used")
var greeting: String?
@Flag(name: "capitalize", short: "c", help: "Capitalizes the name")
var capitalize: Bool
}
static var name = "hello"
let help = "This command will say hello to a given name."
func run(using context: CommandContext, signature: Signature) throws {
let greeting = signature.greeting ?? "Hello"
var name = signature.name
if signature.capitalize {
name = name.capitalized
}
print("(greeting) (name)!")
let bar = context.console.progressBar(title: "Hello")
bar.start()
bar.succeed()
let foo = context.console.ask("What?")
print(foo)
let baz = context.console.ask("Secure what?", isSecure: true)
print(baz)
let c = context.console.choose("Make a choice", from: ["foo", "bar", "baz"])
print(c)
}
}
import Basis
import ConsoleKit
let console: Console = Terminal()
var enter = CommandInput(arguments: CommandLine.arguments)
var context = CommandContext(console: console, enter: enter)
var instructions = Instructions(enableAutocomplete: true)
instructions.use(HelloCommand(), as: HelloCommand.title, isDefault: false)
do {
let group = instructions.group(assist: "Utilizing ConsoleKit with out Vapor.")
strive console.run(group, enter: enter)
}
catch {
console.error("(error)")
exit(1)
}
You should utilize each answer by the Swift Bundle Supervisor, the setup course of is sort of straightforward, you may discover extra tutorials in regards to the Swift Argument Parser and I feel that it’s more durable to seek out correct docs for ConsoleKit, so yeah… anyway, they’re nice libraries you will not remorse utilizing them. 😉
The Swift Bundle Supervisor is without doubt one of the neatest thing in regards to the Swift programming language. I actually find it irresistible and I take advantage of it virtually on daily basis. The truth that the bundle manifest file is outlined utilizing Swift itself makes it straightforward to make use of & perceive.
import PackageDescription
let bundle = Bundle(
title: "myProject",
platforms: [
.macOS(.v10_15)
],
dependencies: [
.package(url: "https://github.com/vapor/console-kit", from: "4.1.0"),
],
targets: [
.executableTarget(name: "myProject",dependencies: [
.product(name: "ConsoleKit", package: "console-kit"),
]),
.testTarget(title: "myProjectTests", dependencies: ["myProject"]),
]
)
The bundle supervisor advanced quite a bit in the course of the previous few months, in case you check out the Swift Evolution dashboard you possibly can monitor these modifications, the newest replace was the introduction of customized, user-defined Bundle Collections, however in case you are searching for packages you possibly can all the time check out the Swift Bundle Index web site. 👍
[ad_2]