A package manager that installs and runs Swift command line tool packages.
$ mint run realm/SwiftLint@0.22.0 swiftlint
This would install and run SwiftLint version 0.22.0
Mint is designed to be used with Swift command line tools that build with the Swift Package Manager. It makes installing, running and distributing these tools much easier.
- ✅ easily run a specific version of a package
- ✅ install a package globally
- ✅ builds are cached by version
- ✅ use different versions of a package side by side
- ✅ easily run the latest version of a package
- ✅ distribute your own packages without recipes and formulas
- ✅ specify a list of versioned packages in a Mintfile for easy use
Homebrew is a popular method of distributing Swift executables, but that requires creating a formula and then maintaining that formula. Running specific versions of homebrew installations can also be tricky as only one global version is installed at any one time. Mint installs your package via SPM and lets you run multiple versions of that package, which are globally installed and cached on demand.
If your Swift executable package builds with SPM, then it can be run with Mint! See Support for details.
Why is it called Mint?
Swift Packager Manager Tools -> SPMT -> Spearmint -> Mint! 🌱😄
Mint: a place where something is produced or manufactured
Make sure Xcode 9.2 is installed first.
$ brew install mint
$ git clone https://github.com/yonaskolb/Mint.git $ cd Mint $ make
Using Mint itself!
$ git clone https://github.com/yonaskolb/Mint.git $ cd Mint $ swift run mint install yonaskolb/mint
$ mint install yonaskolb/mint
Swift Package Manager
$ git clone https://github.com/yonaskolb/Mint.git $ cd Mint $ swift run mint
Use as dependency
Add the following to your Package.swift file's dependencies:
.package(url: "https://github.com/yonaskolb/Mint.git", from: "0.1.0"),
And then import wherever needed:
mint --help to see usage instructions.
- install: Installs a package, so it can be run with
runlater, and also links that version globally
- run: Runs a package. This will install it first if it isn't already installed, though won't link it globally. It's useful for running a certain version.
- update: Installs a package while enforcing an update and rebuild. Shouldn't be required unless you are pointing at a branch and want to update it.
- list: Lists all currently installed packages and versions.
- uninstall: Uninstalls a package by name.
- bootstrap: Installs all the packages in your Mintfile without linking them globally
Run, install and update commands have 1 or 2 arguments:
- package (required): This can be a shorthand for a github repo
install realm/SwiftLintor a fully qualified git path
install https://github.com/realm/SwiftLint.git. In the case of
runyou can also just pass the name of the repo if it is already installed
run swiftlint. This will do a lookup of all installed packages. An optional version can be specified by appending
@version, otherwise the newest tag or master will be used. Note that if you don't specify a version, the current tags must be loaded remotely each time.
- command (optional): The command to install or run. This defaults to the the last path in the repo (so for
realm/swiftlintit will be
swiftlint). In the case of
runyou can also pass any arguments to the command eg
mint run realm/swiftlint swiftlint --path source
$ mint run yonaskolb/XcodeGen@1.2.4 xcodegen --spec spec.yml # pass some arguments $ mint install yonaskolb/XcodeGen@1.2.4 --prevent-global # installs a certain version but not globally $ mint install yonaskolb/XcodeGen # install newest tag $ mint run yonaskolb/XcodeGen@1.2.4 # run 1.2.4 $ mint run XcodeGen # use newest tag and find XcodeGen in installed packages
By default Mint symlinks your installs into
update are used, unless
--prevent-global is passed. This means a package will be accessible from anywhere, and you don't have to prepend commands with
mint run. Note that only one global version can be installed at a time though. If you need to run a specific older version use
Mintfile can specify a list of versioned packages. It makes installing and running these packages easy, as the specific repos and versions are centralized.
Simply place this file in the directory you're running Mint in. The format of the
Mintfile is simply a list of packages in the same form as the usual package parameter:
Then you can simply run a package with:
mint run xcodegen
Or install all the packages in one go with:
- You can use
mint runto silence any output from mint itself. Useful if forwarding output somewhere else.
- You can set
MINT_INSTALL_PATHenvs to configure where mint caches builds, and where it symlinks global installs. These default to
If your Swift command line tool builds with the Swift Package Manager than it will automatically install and run with mint! You can add this to the
Installing section in your readme:
### [Mint](https://github.com/yonaskolb/mint) ``` $ mint install github_name/repo_name ```
If your executable name is different from your repo name then you will need to append the name to the above command.
The Swift Package Manager doesn't yet have a way of specifying resources directories. If your tool requires access to resources from the repo you require a custom
Package.resources file. This is a plain text file that lists the resources directories on different lines:
If this file is found in you repo, then all those directories will be copied into the same path as the executable.
A list of popular Mint compatible packages 🌱
- mint install realm/SwiftLint
- mint install JohnSundell/Marathon
- mint install yonaskolb/XcodeGen
- mint install yonaskolb/SwagGen
- mint install Carthage/Carthage
- mint install krzysztofzablocki/Sourcery
- mint install toshi0383/cmdshelf
- mint install LinusU/RasterizeXCAssets
- mint install jkmathew/Assetizer assetize
Feel free to add your own!
Help us keep the lights on
0.10.2 - Jun 23, 2018
- Don't overwrite install path of already installed version until after successful build
- Fixed version number output
- Updated SwiftCLI 5.2.1 to allow nested help commands like
mint help install
0.10.1 - Jun 7, 2018
- Fixed environment variables not being passed via
mint bootstrapoutput referring to the wrong path for
0.10.0 - Jun 6, 2018
mint bootstrapcommand for installing all the packages in your
--mintfileargument for custom
Mintfilepath #79 @yonaskolb
mint run#78 @yonaskolb
- Improved error output #78 @yonaskolb
- As global installs are now the default, replaced
- Fixed output in run not being silenced when using a Mintfile #77 @yutailang0119
- Removed dotfiles from
mint listoutput @yonaskolb
- Print errors to stderr #78 @yonaskolb
0.9.1 - Apr 13, 2018
Mintfilepackage lookup case insensitive @yonaskolb
Minfilelookup by simple name on
0.9.0 - Apr 12, 2018
Mintfilefor adding a list versioned dependencies #72 @Lutzifer
MINT_INSTALL_PATHenvironment variables #65 @yonaskolb
- fixed build errors not being logged #71 @yonaskolb