はじめに
Emacsのパッケージを作ったら MELPA に登録して世界中に公開するのが良いですね.ただそうは言っても,とりあえず適当に作って Githubに登録してしまえば,MELPAには登録せずに事足りてしまうのも現実です.
そこで今回は,ローカルにMelpaリポジトリを作ってレシピを登録する方法をまとめておきます.
参考)https://github.com/melpa/melpa/wiki/Custom-Melpa-Archive
手順
- 任意の場所に melpa をクローンする
cd ~/hoge
git clone --depth 1 https://github.com/milkypostman/melpa.git myrepo
- 新しいブランチを準備して既存レシピを全削除
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 を追加
(source "myrepo" "~/hoge/myrepo/packages")
なお,Caskファイルには,登録した個人用レシピを depends-on
で通常通りに指定しておきます.
- M-x list-packages で自分のレシピのパッケージを選んでインストール
おわりに
実際のところ,こんなことをせずに Caskファイルの depends-on
のオプション指定を使えばいい話なのです.
(depends-on "hoge" :git "https://github.com/hoge/hoge.git")
ただ私の環境だと,色々と手を入れているせいか,上記のオプション指定ではエラーが出るようになったため,今回の回避策を取ったというオチでした.
(留意点)Caskのエラーは,cask コマンドがエラーを出し始めたらの方法で解決する場合もあります.
おまけ
作ったリポジトリをWebに公開して,Caskファイルの source をグローバルに移せます.変更点は以下.
(前提)https://hogehoge.org/melpa で公開したい.
- (変更点1)html/index.html のL.45らへん
<footer class="container">
<small>
- <a href="https://github.com/melpa/melpa/blob/master/html/js/melpa.js">Source code for this page →</a>
+ <a href="https://github.com/xx/melpa/blob/myrepo/html/js/melpa.js">Source code for this page →</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らへん
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"})
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"),
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){
- データベースを更新してサーバに同期
cd ~/hoge
make -j1
rsync -avh ./html/ myserver:/path/to/htsdocs/melpa/
rsync -avh ./packages/ myserver:/path/to/htsdocs/packages/
- Caskファイルの source を書き換える
;; (source "myrepo" "~/devel/git/melpa/packages")
(source "myrepo" "https://hogehoge/melpa/packages/")