もっと便利にWorkflow公開とダウンロード


これは[Alfred Advent Calendar 2014](http://www.adventar.org/calendars/632)24日目の記事です。

- [ワークフローをGitHubで公開する #alfred - < /gecko >](http://geckotang.tumblr.com/post/104996742061/github-alfred)

上記記事の補足みたいなものです。こんな感じの記事を書こうとしていて先を越されたともいう。

## Githubで簡単にリリースするツール

- [aktau/github-release](https://github.com/aktau/github-release)

というのがあります。使ったことはありませんが。

なお、改善版のghrというのもあります。

- [高速に自作パッケージをGithubにリリースするghrというツールをつくった | SOTA](http://deeeet.com/writing/2014/07/29/ghr/)

これは、後述のワークフローの公開で初めて使ってみました。すごい楽ちんでした。

なお、alfredworkflowファイルは、後述するWorkflowディレクトリをZip圧縮して拡張子を変えたものなので、エクスポートからリリースまで全部スクリプト化することも可能です。

（2015-01-02追記）

bashのシェル関数にしてみました。

```bash
alwrelease () {
  if pwd | grep -q 'Alfred.alfredpreferences/workflows/';then
    if [ -d .git ]; then
      echo Input name of workflow
      read Name
      echo Input Tag
      read Tag
      if [ ! -n "$Name" -a -n "$Tag" ];then
        zip -r "$Name.alfredworkflow" "$(git ls-files)"
        ghr "$Tag" "$Name".alfredworkflow
      else echo "No Workflow Name or Git Tag"
      fi
    else echo "Not a Git repository"
    fi
  else echo "Not a Alfred Workflow directory"
  fi
}
```

リリース機能を利用するのではなく、Dropboxなど他のファイル共有系サービスを利用するのも悪くないでしょう。

## Workflowのインポートはalfredworkflowファイルからしかできないのか？
そもそも、Workflowの実体とは、指定ディレクトリ以下に配置されたplistファイル（とアイコンや添付されたスクリプト）に過ぎません。

任意のWorkflowを右クリックして「Show in Finder」してみれば分かりますが、Workflowは以下のディレクトリに、個別のディレクトリとして配置されています。

~/Library/Application Support/Alfred 2/Alfred.alfredpreferences/workflows

なお、Alfred2 Powerpackを導入すると、Alfred.alfredpreferencesの配置は（Dropboxなどに）変更可能です。

ということは、**このディレクトリにそのまんまcloneしたら動くのではないか？**　と思ってやってみると、普通に動きます。

作成/インポートしたWorkflowには自動生成されたディレクトリ名が与えられますが、別にディレクトリ名は勝手に決めても問題ないようです。

つまり、[catfist/Alfred-MyHexo](https://github.com/catfist/Alfred-MyHexo)の場合であれば、以下のようにすれば導入できるわけです。

```bash
$ git clone git@github.com:catfist/Alfred-MyHexo.git ~/Library/Application\ Support/Alfred\ 2/Alfred.alfredpreferences/workflows/MyHexo
```

## 上記をWorkflow化してみる
コマンドラインでできることならWorkflow化してみたくなります。

簡単ですが、やってみました。

- [catfist/Alfred-WorkflowClone](https://github.com/catfist/Alfred-WorkflowClone)

ghqcloneの方はとりあえずおいておいて。でも、[ghq](https://github.com/motemen/ghq)もとても便利ですよ。

alwcloneの方のスクリプトは以下のようになっています。

```bash
wfdir=~/Library/Application\ Support/Alfred\ 2/Alfred.alfredpreferences/workflows # Workflowディレクトリを指定

theUrl="$(osascript -e 'tell application "Safari" to get URL of document 1')" # Safariで開いているページからURLを取得

if [ $(echo "$theUrl" | grep 'github.com') ];then # URLがGithubだったら
  repo=$(echo "$theUrl" | sed 's%^https://github.com/\([^/]*/[^/]*\)/*.*$%\1%') # ユーザ名とプロジェクト名を取得
  name=$(echo "$theUrl" | sed # プロジェクト名のみを取得 's%^https://github.com/[^/]*/\([^/]*\)/*.*$%\1%')
  git clone git@github.com:$repo.git "$wfdir/$name" && echo "cloned $repo" # cloneしてユーザ名とプロジェクト名をエコー
else # URLがGithubじゃない場合
  echo "Not Github repository" # エラーメッセージをエコー
fi
```

Powerpack導入済みでAlfred.alfredpreferencesを移動している場合、wfdirを変更してください。

## Githubのリリース機能を利用する理由
Workflowの中にはエクスポートされたalfredworkflowファイルを直接Git管理＆公開しているものもあります。作成したWorkflowが多すぎていちいち独立したリポジトリを立ち上げてらんない場合は仕方ないと思いますが、基本的にはリリース機能を利用すべきです。

それは、ソースの差分管理をしたり、ユーザがソースを確認できるようにする意味もありますが、**Workflowディレクトリに直接cloneできるように**という意味合いも持たせられるわけです。

さらに、git fetchで簡単にアップデートできるという利点もあります。わりといいことづくめじゃないでしょうか。