Melpa+Cask環境で個人用レシピを使いたい

# はじめに

Emacsのパッケージを作ったら MELPA に登録して世界中に公開するのが良いですね．ただそうは言っても，とりあえず適当に作って Githubに登録してしまえば，MELPAには登録せずに事足りてしまうのも現実です．

そこで今回は，ローカルにMelpaリポジトリを作ってレシピを登録する方法をまとめておきます．

参考）https://github.com/melpa/melpa/wiki/Custom-Melpa-Archive

# 手順

- 任意の場所に melpa をクローンする

```sh
cd ~/hoge
git clone --depth 1 https://github.com/milkypostman/melpa.git myrepo
```

- 新しいブランチを準備して既存レシピを全削除

```sh
cd myrepo
git checkout -b myrepo
git rm recipes/*
git commit -am 'removed all recipes'
mkdir recipes
```

- recipes 以下に，個人用レシピを追加

お好きなように( ' -')b

- make する

```
make packages packages/archive-contents
```

`$which emacs`で古いEmacsが帰る場合は，Makefile内の`EMACS_COMMAND`の値に注意．

- Cask ファイルに新しい source を追加

```el:Cask
(source "myrepo" "~/hoge/myrepo/packages")
```

なお，Caskファイルには，登録した個人用レシピを `depends-on` で通常通りに指定しておきます．
![Screen Shot 2018-01-04 at 12.33.49 AM.png](https://qiita-image-store.s3.amazonaws.com/0/12232/ce825fb9-42e0-7094-3b71-1d9b93710b08.png)


- M-x list-packages で自分のレシピのパッケージを選んでインストール

![Screen Shot 2018-01-04 at 12.30.33 AM.png](https://qiita-image-store.s3.amazonaws.com/0/12232/ff80e69c-32e2-c422-aa7c-165537e3997e.png)

# おわりに

実際のところ，こんなことをせずに Caskファイルの `depends-on` のオプション指定を使えばいい話なのです．

```elisp
(depends-on "hoge" :git "https://github.com/hoge/hoge.git")
```

ただ私の環境だと，色々と手を入れているせいか，上記のオプション指定ではエラーが出るようになったため，今回の回避策を取ったというオチでした．

（留意点）Caskのエラーは，[cask コマンドがエラーを出し始めたら](https://qiita.com/takaxp/items/b58fc2796d9adef5d1cd)の方法で解決する場合もあります．


# おまけ

作ったリポジトリをWebに公開して，Caskファイルの source をグローバルに移せます．変更点は以下．

（前提）https://hogehoge.org/melpa で公開したい．

- （変更点1）html/index.html のL.45らへん

```diff:html/index.html
   <footer class="container">
     <small>
-      <a href="https://github.com/melpa/melpa/blob/master/html/js/melpa.js">Source code for this page &rarr;</a>
+      <a href="https://github.com/xx/melpa/blob/myrepo/html/js/melpa.js">Source code for this page &rarr;</a>
       <br/>
       <a href="jslicense.html" data-jslicense="1">JavaScript license information</a>
     </small>
   </footer>
```

- （変更点2）html/js/melpa.js のL.102，L.148，L.488らへん

```diff:html/js/melpa.js
   melpa.packageList = m.sync([
-    m.request({method: 'GET', url: "/recipes.json"}),
-    m.request({method: 'GET', url: "/archive.json"}),
-    m.request({method: 'GET', url: "/download_counts.json"})
+    m.request({method: 'GET', url: "/melpa/recipes.json"}),
+    m.request({method: 'GET', url: "/melpa/archive.json"}),
+    m.request({method: 'GET', url: "/melpa/download_counts.json"})
```

```diff:html/js/melpa.js
         fetcher: recipe.fetcher,
-        recipeURL: "https://github.com/melpa/melpa/blob/master/recipes/" + name,
+        recipeURL: "https://github.com/xx/melpa/blob/myrepo/recipes/" + name,
         packageURL: "packages/" + name + "-" + version + "." + (built.type == "single" ? "el" : "tar"),
```

```diff:html/js/melpa.js
     this.running = function() { return !this.completed(); }.bind(this);
 
-    m.request({method: 'GET', url: "/build-status.json", background: true})
+    m.request({method: 'GET', url: "/melpa/build-status.json", background: true})
       .then(function(status){
```

- データベースを更新してサーバに同期

```sh
cd ~/hoge
make -j1
rsync -avh ./html/ myserver:/path/to/htsdocs/melpa/
rsync -avh ./packages/ myserver:/path/to/htsdocs/packages/
```

- Caskファイルの source を書き換える

```elisp:Cask
;; (source "myrepo" "~/devel/git/melpa/packages")
(source "myrepo" "https://hogehoge/melpa/packages/")
```