A package manager that installs and runs Swift command line tool packages.
mint run realm/[email protected]
This would install and runSwiftLintversion 0.40.3
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 specificversionof a package
- ✅linka packageglobally
- ✅ builds arecachedby version
- ✅ usedifferent versionsof a package side by side
- ✅ easily run thelatestversion of a package
- ✅ distribute your own packageswithout recipes and formulas
- ✅ specify a list of versioned packages in aMintfilefor 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 installed and cached in a central place.
If your Swift executable package builds with SPM, then it can be run with Mint! SeeSupportfor details.
Swift Package Manager Tools -> SPMT -> Spearmint -> Mint! 🌱😄
Mint: a place where something is produced or manufactured
Make sure Xcode 10.2 is installed first.
brew install mint
git clone https://github /yonaskolb/Mint.git
cdMint
make
git clone https://github /yonaskolb/Mint.git
cdMint
swift run mint install yonaskolb/mint
mint install yonaskolb/mint
Use CLI
git clone https://github /yonaskolb/Mint.git
cdMint
swift run mint
Use as dependency
Add the following to your Package.swift file's dependencies:
.package(url:"https://github /yonaskolb/Mint.git",from:"0.15.0"),
And then import wherever needed:import MintKit
Until 1.0 is reached, minor versions will be breaking.
Runmint help
to see usage instructions.
- install:Installs a package, so it can be run with
run
later, 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.
- list:Lists all currently installed packages and versions.
- which:Print the path to an installed package executable.
- uninstall:Uninstalls a package by name.
- bootstrap:Installs all the packages in yourMintfile,by default, without linking them globally
Package reference
run
andinstall
commands require a package reference parameter. This can be a shorthand for a github repo (mint install realm/SwiftLint
) or a fully qualified git path (mint install https://github /realm/SwiftLint.git
). In the case ofrun
you can also just pass the name of the repo if it is already installed (run swiftlint
) or in the Mintfile.
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.
$ mint run yonaskolb/[email protected]#run the only executable
$ mint run yonaskolb/[email protected] --spec spec.yml#pass some arguments
$ mint run yonaskolb/[email protected] xcodegen --spec spec.yml#specify a specific executable
$ mint run --executable xcodegen yonaskolb/[email protected] --spec spec.yml#specify a specific executable in case the first argument is the same name as the executable
$ mint install yonaskolb/[email protected] --no-link#installs a certain version but doesn't link it globally
$ mint install yonaskolb/XcodeGen#install newest tag
$ mint install yonaskolb/XcodeGen@master --force#reinstall the master branch
$ mint run yonaskolb/[email protected]#run 2.18.0
$ mint run XcodeGen#use newest tag and find XcodeGen in installed packages
By default Mint symlinks your installs into~/.mint/bin
onmint install
,unless--no-link
is passed. This means a package will be accessible from anywhere, and you don't have to prepend commands withmint run package
,as long as you add~/.mint/bin
to your$PATH
.Note that only one linked version can be used at a time. If you need to run a specific older version usemint run
.
AMintfile
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 theMintfile
is simply a list of packages in the same form as the usual package parameter:
yonaskolb/[email protected]
yonaskolb/[email protected]
Then you can simply run a package using:
mint run xcodegen
Note that mint will find the version declared in your Mintfile and run that version, even if you have multiple versions installed.
Or install all the packages (without linking them globally) in one go with:
mint bootstrap
If you prefer to link them globally, do such with:
mint bootstrap --link
- You can use
--silent
inmint run
to silence any output from mint itself. Useful if forwarding output somewhere else. - You can set
MINT_PATH
andMINT_LINK_PATH
envs to configure where mint caches builds, and where it symlinks global installs. These default to~/.mint
and~/.mint/bin
respectively - You can use
mint install --force
to reinstall a package even if it's already installed. This shouldn't be required unless you are pointing at a branch and want to update it.
Mint works on Linux but has some limitations:
- linux doesn't support building with a statically linked version of Swift. This means when a new version of swift comes out the old installs won't work on linux.
- Linux is case sensitive so you must specify the correct case for repo urls as well as executables.
If your Swift command line tool builds with the Swift Package Manager than it will automatically install and run with mint!
Make sure you have defined anexecutable
product type in theproducts
list within yourPackage.swift
.
letpackage=Package(
name:"Foo",
products:[
.executable(name:"foo",targets:["Foo"]),
],
targets:[
.target(name:"Foo"),
...
]
)
You can then add this to theInstalling
section in your readme:
### [Mint](https://github /yonaskolb/mint)
```
mint run github_name/repo_name
```
Since Swift 5.3 resources are now built into the Swift Package manager, so if you're targetting that version or above the
Package.resources
file is no longer necessaryhttps://github /apple/swift-evolution/blob/master/proposals/0271-package-manager-resources.md
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 customPackage.resources
file. This is a plain text file that lists the resources directories on different lines:
MyFiles
MyOtherFiles
If this file is found in you repo, then all those directories will be copied into the same path as the executable.
- mint installjkmathew/Assetizer
- mint installCarthage/Carthage
- mint installJohnSundell/Marathon
- mint installLinusU/RasterizeXCAssets
- mint installkrzysztofzablocki/Sourcery
- mint installyonaskolb/SwagGen
- mint installnicklockwood/SwiftFormat
- mint installSwiftGen/SwiftGen
- mint installrealm/SwiftLint
- mint installyonaskolb/XcodeGen
- mint installartemnovichkov/Carting
- mint installnum42/icon-resizer-swift
- mint installMakeAWishFoundation/SwiftyMocky
- mint installthii/xcbeautify
- mint installmono0926/LicensePlist
- mint installChargePoint/xcparse
- mint installscribd/Weaver
- mint installarthurpalves/coherent-swift
Feel free to add your own!