mxcl/swift-sh is one of the mobile-focused repositories TopGit tracks, currently at 1.9k stars, written primarily in Swift. Easily script with third-party Swift dependencies.
Snapshot summary built from the project's own GitHub metadata — there's no written TopGit review yet. The page will update automatically when a full review is published.
WHY NO REVIEW YET
TopGit writes full reviews for the most-starred, most-requested repositories. This page is a snapshot until then — see the READ ME tab for the original README in full.
Sadly, to use third-party dependencies we have to migrate our script to a swift
package and use swift build, a relatively heavy solution when all we wanted
was to whip up a quick script. swift-sh gives us the best of both worlds:
If your company depends on swift-sh please consider sponsoring the project.
Otherwise it is hard for me to justify maintaining it.
Installation
brew install swift-sh
Or you can build manually using swift build.
Installation results in a single executable called swift-sh, the swift
executable will call this (provided it is in your PATH) when you type:
swift sh.
We actively support both Linux and Mac and will support Windows as soon as it is
possible to do so.
Usage
Add the shebang as the first line in your script: #!/usr/bin/swift sh.
Your dependencies are determined via your import lines:
#!/usr/bin/swift sh
import AppUpdater // @mxcl
// ^^ https://github.com/mxcl/AppUpdater, latest version
import PromiseKit // @mxcl ~> 6.5
// ^^ mxcl/PromiseKit, version 6.5.0 or higher up to but not including 7.0.0 or higher
import Chalk // @mxcl == 0.3.1
// ^^ mxcl/Chalk, only version 0.3.1
import LegibleError // @mxcl == b4de8c12
// ^^ mxcl/LegibleError, the precise commit `b4de8c12`
import Path // mxcl/Path.swift ~> 0.16
// ^^ for when the module-name and repo-name are not identical
import BumbleButt // https://example.com/bb.git ~> 9
// ^^ non-GitHub URLs are fine
import CommonTaDa // [email protected]:mxcl/tada.git ~> 1
// ^^ ssh URLs are fine
import TaDa // ssh://[email protected]:mxcl/tada.git ~> 1
// ^^ this style of ssh URL is also fine
import Foo // ./my/project
import Bar // ../my/other/project
import Baz // ~/my/other/other/project
import Fuz // /I/have/many/projects
// ^^ local dependencies must expose library products in their `Package.swift`
// careful: `foo/bar` will be treated as a GitHub dependency; prefix with `./`
// local dependencies do *not* need to be versioned
import Floibles // @mxcl ~> 1.0.0-alpha.1
import Bloibles // @mxcl == 1.0.0-alpha.1
// ^^ alphas/betas will only be fetched if you specify them explicitly like so
// this is per Semantic Versioning guidelines
swift-sh reads the comments after your imports and fetches the requested
SwiftPM dependencies.
It is not necessary to add a comment specification for transitive dependencies.
Editing in Xcode
The following will generate an Xcode project (not in the working directory, we
keep it out the way in our cache directory) and open it, edits are saved to your
script file.
$ swift sh edit ./myScript
Examples
Tweet deleter
PostgreSQL Check
Converting your script to a package
Simple scripts can quickly become bigger projects that would benefit from being
packages that you build with SwiftPM. To help you migrate your project we
provide swift sh eject, for example:
$ swift sh eject foo.swift
creates a Swift package in ./Foo, from now on use swift build in the
Foo directory. Your script is now ./Foo/Sources/main.swift.
Use in CI
If you want to make scripts available to people using CI; use stdin:
brew install mxcl/made/swift-sh
swift sh <(curl http://example.com/yourscript) arg1 arg2
Internal Details
swift sh creates a Swift Package.swift package manager project with
dependencies in a directory below the swift-sh cache directory †,
builds the executable, and then executes it via swift run.
The script is (only) rebuilt when the script file is newer than the executable.
† Specify the cache parent directory using the (FreeDesktop) environment
variable XDG_CACHE_HOME. If unspecified, on macOS swif-sh uses
$HOME/Library/Developer/swift-sh.cache, and otherwise it uses
$HOME/.cache/swift-sh.
Swift Versions
swfit-sh v2 requires Swift 5.1. We had to drop support for Swift v4.2
because maintenance was just too tricky.
swift-sh uses the active tools version, (ie: xcode-select) or whichever
Swift is first in the PATH on Linux. It writes a manifest for the package
it will swift build with that tools-version. Thus Xcode 11.0 builds with Swift 5.1.
Dependencies build with the Swift versions they declare support for, provided
the active toolchain can do that (eg. Xcode 11.0 supports Swift 4.2 and above)
To declare a support for specific Swift versions in your script itself, use
#if swift or #if compiler directives.
Alternatives
Beak
Marathon
Troubleshooting
error: unable to invoke subcommand: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-sh
If you got here via Google, you have a script that uses this tool, if you now
install swift-sh, you will be able to run your script:
No homepage URL was recorded for mxcl/swift-sh in TopGit's last sync. The README tab above frequently contains screenshots and demo links, or check the repository description on GitHub.
How does mxcl/swift-sh compare to other Mobile projects?
mxcl/swift-sh is tracked by TopGit in the Mobile category, with 1.9k GitHub stars and written in Swift. Browse the Mobile topic page on TopGit to compare it against similar projects by stars and activity.
How many stars does mxcl/swift-sh have?
mxcl/swift-sh has 1.9k GitHub stars — refresh the page for the live number, or check github.com/mxcl/swift-sh. TopGit mirrors GitHub's count but does not claim minute-by-minute accuracy.
Is mxcl/swift-sh open source?
Yes — mxcl/swift-sh ships under the Unlicense license, which makes its source code freely readable (and, depending on license terms, forkable and reusable). Source: github.com/mxcl/swift-sh.
What else is in the Mobile space?
mxcl/swift-sh is tracked by TopGit under the Mobile category, alongside 2 GitHub-tagged topics. Trending and Topics pages list peer repositories of comparable stars and language.
What is mxcl/swift-sh?
mxcl/swift-sh (mxcl/swift-sh) is a Swift project on GitHub. From the project's own README: Easily script with third-party Swift dependencies.
Where do I read more about mxcl/swift-sh?
This TopGit page is a snapshot — the READ ME tab shows the project's own README content (links stripped, images preserved). The GitHub repository at github.com/mxcl/swift-sh is the definitive source.
Read full README in the tab above.
Want a second opinion on swift-sh?
Ask an AI that can read this page — one click and you get its take on swift-sh.