Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Swift Package Managerを使って作成したコマンドをMintでインストールする

Swift Package Managerを使って作成したコマンドをMintでインストールする

MintはSwift Package Managerで作成したコマンドラインツールのインストール、実行、配布を簡単にすることを目的としたツールです。 Homebrewでのformula管理の煩わしさの無さ、同一コマンドをバージョン指定で実行可能というところが売りのようです。

ここでは簡単なコマンドラインツールをSwift Package Managerで作成し、Mintで実行する流れを確認します。 SPMでCLIツールを作る手順を既に知ってる場合は「Mintをインストール」から確認するとよいでしょう。

Swift Package Managerでコマンドラインツールを作成する

基本的には以下のリンクの内容と同じことをしています。

swift package init

> ~/s/g/koyachi mkdir HelloMint                                                                                                      08:28:11
⋊> ~/s/g/koyachi cd HelloMint                                                                                                         08:28:15
⋊> ~/s/g/k/HelloMint swift package init --type executable                                                                             08:28:18
Creating executable package: HelloMint
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/HelloMint/main.swift
Creating Tests/
⋊> ~/s/g/k/HelloMint

main.swiftを変更

print("Hello, Mint!")

ビルドして実行

> ~/s/g/k/HelloMint swift build                                                                                                      08:30:20
Compile Swift Module 'HelloMint' (1 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/HelloMint
⋊> ~/s/g/k/HelloMint .build/debug/HelloMint                                                                                           08:30:29
Hello, Mint!> ~/s/g/k/HelloMint

git init & git tag

> ~/s/g/k/HelloMint git init                                                                                                         08:34:36
Initialized empty Git repository in /Users/koyachi/src/github.com/koyachi/HelloMint/.git/
⋊> ~/s/g/k/HelloMint on master ⨯ git status                                                                                           08:34:40
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	.gitignore
	Package.swift
	README.md
	Sources/

nothing added to commit but untracked files present (use "git add" to track)
⋊> ~/s/g/k/HelloMint on master ⨯ git add .                                                                                            08:34:43
⋊> ~/s/g/k/HelloMint on master ⨯ git commit -m 'first commit'                                                                         08:35:01
[master (root-commit) 543d197] first commit
 4 files changed, 27 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 Package.swift
 create mode 100644 README.md
 create mode 100644 Sources/HelloMint/main.swift

あとでMintからコマンドバージョン指定して実行を確認したいので、ここで最初のバージョンのリリースタグを設定します。

> ~/s/g/k/HelloMint on master  git tag 0.0.1                                                                                         08:36:12
⋊> ~/s/g/k/HelloMint on master  git tag                                                                                               08:36:32
0.0.1
⋊> ~/s/g/k/HelloMint on master

github上でcreate new repositoryし、そこへpushする。tagも。

github上ではkoyachi/HelloMintというリポジトリを作成しました。 作成したリモートリポジトリを登録し、そこへpushします。

> ~/s/g/k/HelloMint on master  git remote add origin git@github.com:koyachi/HelloMint.git                                            08:37:50
⋊> ~/s/g/k/HelloMint on master  git push -u origin master                                                                             08:37:56
Enter passphrase for key '/Users/koyachi/.ssh/id_rsa':
Counting objects: 8, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (8/8), 863 bytes | 863.00 KiB/s, done.
Total 8 (delta 0), reused 0 (delta 0)
To github.com:koyachi/HelloMint.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
⋊> ~/s/g/k/HelloMint on master ◦ git push origin --tags                                                                               08:38:39
Enter passphrase for key '/Users/koyachi/.ssh/id_rsa':
Total 0 (delta 0), reused 0 (delta 0)
To github.com:koyachi/HelloMint.git
 * [new tag]         0.0.1 -> 0.0.1

Mintをインストール

ここではbrewを使ってインストールします。

> ~ brew tap yonaskolb/Mint https://github.com/yonaskolb/Mint.git
⋊> ~ brew install mint

mint runで今回作ったコマンド HelloMint を実行

mint installを実行する前にmint runをしても最新版のコマンドをインストールして実行してくれるようです。

> ~ mint run koyachi/HelloMint                                                                                                       08:43:28
🌱  Using HelloMint "0.0.1"
🌱  Cloning https://github.com/koyachi/HelloMint.git "0.0.1"...
🌱  Building HelloMint. This may take a few minutes...
🌱  Installing HelloMint...
🌱  Installed HelloMint "0.0.1"
🌱  Running HelloMint "0.0.1"...
Hello, Mint!> ~

作成コマンドのバージョンを上げたあとのMintの挙動確認

作成コマンドのバージョンアップ

コマンドの出力内容を修正し、

> ~/s/g/k/HelloMint on master ⨯ git diff                                                                                             09:14:36
diff --git a/Sources/HelloMint/main.swift b/Sources/HelloMint/main.swift
index b98d024..9fd557b 100644
--- a/Sources/HelloMint/main.swift
+++ b/Sources/HelloMint/main.swift
@@ -1 +1,9 @@
-print("Hello, Mint!")
+print(
+"""
+    __  __     ____           __  ____       __  __
+   / / / /__  / / /___       /  |/  (_)___  / /_/ /
+  / /_/ / _ \\/ / / __ \\     / /|_/ / / __ \\/ __/ /
+ / __  /  __/ / / /_/ /    / /  / / / / / / /_/_/
+/_/ /_/\\___/_/_/\\____( )  /_/  /_/_/_/ /_/\\__(_)
+                     |/
+""")
⋊> ~/s/g/k/HelloMint on master ⨯                                                                                                      09:15:09

修正した動作を確認し、

> ~/s/g/k/HelloMint on master ⨯ swift build                                                                                          09:14:29
Compile Swift Module 'HelloMint' (1 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/HelloMint
⋊> ~/s/g/k/HelloMint on master ⨯ .build/debug/HelloMint                                                                               09:14:31
    __  __     ____           __  ____       __  __
   / / / /__  / / /___       /  |/  (_)___  / /_/ /
  / /_/ / _ \/ / / __ \     / /|_/ / / __ \/ __/ /
 / __  /  __/ / / /_/ /    / /  / / / / / / /_/_/
/_/ /_/\___/_/_/\____( )  /_/  /_/_/_/ /_/\__(_)
                     |/

動作を確認できたので0.0.2としてリリース(githubへpush)します。

> ~/s/g/k/HelloMint on master ⨯ git add .                                                                                            09:15:54
⋊> ~/s/g/k/HelloMint on master ⨯ git commit -m 'change message'                                                                       09:15:56
[master 109097c] change message
 1 file changed, 9 insertions(+), 1 deletion(-)
⋊> ~/s/g/k/HelloMint on master ↑ git tag 0.0.2                                                                                        09:16:02

⋊> ~/s/g/k/HelloMint on master ↑ git push origin master                                                                               09:16:20
Enter passphrase for key '/Users/koyachi/.ssh/id_rsa':
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 467 bytes | 467.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:koyachi/HelloMint.git
   543d197..109097c  master -> master
⋊> ~/s/g/k/HelloMint on master ◦ git push origin --tags                                                                               09:17:11
Enter passphrase for key '/Users/koyachi/.ssh/id_rsa':
Total 0 (delta 0), reused 0 (delta 0)
To github.com:koyachi/HelloMint.git
 * [new tag]         0.0.2 -> 0.0.2
⋊> ~/s/g/k/HelloMint on master ◦

最新版(0.0.2)をMintから実行

バージョン指定なしで実行すると、最新版が実行されます。

> ~ mint run koyachi/HelloMint                                                                                                       08:43:32
🌱  Using HelloMint "0.0.2"
🌱  Cloning https://github.com/koyachi/HelloMint.git "0.0.2"...
🌱  Building HelloMint. This may take a few minutes...
🌱  Installing HelloMint...
🌱  Installed HelloMint "0.0.2"
🌱  Running HelloMint "0.0.2"...
    __  __     ____           __  ____       __  __
   / / / /__  / / /___       /  |/  (_)___  / /_/ /
  / /_/ / _ \/ / / __ \     / /|_/ / / __ \/ __/ /
 / __  /  __/ / / /_/ /    / /  / / / / / / /_/_/
/_/ /_/\___/_/_/\____( )  /_/  /_/_/_/ /_/\__(_)
                     |/

バージョン指定して0.0.1を実行

> ~ mint run koyachi/HelloMint@0.0.1                                                                                                 09:18:27
🌱  HelloMint "0.0.1" already installed
🌱  Running HelloMint "0.0.1"...
Hello, Mint!

Mintを使うことでSwift Package Managerkから作成したコマンドラインツールの実行・配布が簡単にできることを確認しました。 Swift自身がSwift Package Manager機能を持ち、MintやMarathonのようなコマンドラインツール作成を補助するようなツールも出てきています。 iOS向けに書かれたライブラリも最初からmacos上で動くように書かれていたり、macos上で動くように修正しやすい作りになっているとコマンドラインツールが作りやすくなり、ちょっとしたツールを作るときに便利になりそうです。

参考

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment