お断り
自分自身も使いながら書いているので間違っているところや曖昧なところ・未検証な点等ありますがご了承ください
何か間違っている点などありましたらどしどし指摘してください!
Bpkgとは
JavaScript has npm, Ruby has Gems, Python has pip and now Shell has bpkg!
JavaScriptにはnpm, RubyにはGem, Pythonにはpipそして遂にShellにbpkgがきた!
(from bpkg.sh)
Bpkgは、Shellscript(とMakefile)100%で書かれたshell用パッケージマネージャーです。
Bash scriptと書かれてはいますが, install処理はパッケージ管理者が指定できるので実質それ以外でも使えます。
@spotifyなどもスポンサーなようです。
bkpgの特徴
やはり先ずは、何と言ってもbash用のパッケージマネージャーだということです。
homebrew
,linuxbrew
のような環境用のパッケージマネージャーはありましたが、bash用として開発されたのは初だと思います(自分が見つけられてないだけかもしれません..)
そのほかにも、様々な特徴があります:
1. パッケージのインストール方法が2種類ある
殆どのパッケージマネージャーと違い、bpkg
は2種類の方法でパッケージをインストールできます。
command | installation |
---|---|
bpkg install <package> -g | /usr/local/bin等に<package>をinstallします。 |
bpkg install <package> | カレントディレクトリ以下に<package>をinstallします。 |
2番目の方法でinstallした場合、./deps/<package>/
以下に格納されます。
2. パッケージの情報管理にpackage.jsonを使う
bpkg
は、パッケージ情報の管理/install手順の記述などに、npm
と同じくpackage.json
を使います。
多少、npm
のpackage.json
とは違う部分もあるようですが、package.json
がすでにあるプロジェクト、もしくはpackage.json
に慣れている人なら比較的短時間で対応させることができます。
殆ど手間なくできるならついでに対応したパッケージマネージャー増やすのもいいのではないですk((
インストール
インストール方法は公式には3種類あります
1. setup.shを利用する
/usr/local/bin
以下にbpkg
をinstallしてくれます
$ curl -Lo- "https://raw.githubusercontent.com/bpkg/bpkg/master/setup.sh" | bash
1. clibを利用する
C言語用パッケージマネージャーであるclib
を使ってinstallすることもできます。
$ clib install bpkg/bpkg
3. ソースコードから直接installする
githubにあるソースコードから直接installもできます
$ git clone https://github.com/bpkg/bpkg.git
$ cd bpkg
$ ./setup.sh
この時、$ PREFIX=<PATH> ./setup.sh
とすることで、以下にinstallできるようです。
4. (非公式) home-brew/linuxbrewを利用する
1,2,3どれも気に食わなかったので、作っちゃいました。formula。
ということで、非公式にはなりますがhomebrew/linuxbrew
でもinstallできます。
$ brew tap Cj-bc/bpkg
$ brew install bpkg
いつか公式に認められたらまた書き直します(が時間かかりそう...)
bash補完のすゝめ
bash勢の人なら!tabキーで補完できると便利じゃありませんか??
そんな夢を叶えるために!!()
bash補完、書きました(ドヤ
Cj-bc/bpkg-completion
home-brew/linuxbrew
からinstallできます。
$ brew tap Cj-bc/bpkg-completion
$ brew install bpkg-completion
setup.sh
等の書き換えが終わり次第、bash補完を含んだbpkg
のPRを本家に送ろうと思います。
(基本的な)使い方
基本的なことはbpkg.shに書かれてるんですがまだ英語なのと説明不足すぎるので書いていきます。
が、長くなりそうなので基本的な所だけ書いて他は記事を分けて書きますね後で。
使えるコマンドのリスト
command | 説明 |
---|---|
bpkg install | installします。(そのまま) |
bpkg list | bpkg.shにあるリストに乗っているパッケージの一覧を表示します |
bpkg update | パッケージのリストを更新します。これで落としておけばbpkg install <package> で入れられる |
bpkg show <word> | 現在いるディレクトリにあるpackage.jsonを読み、<word>の値をstdoutに出します。 |
bpkg getdeps | 今いるディレクトリにあるpackage.jsonに記載されている依存パッケージを取ってきてinstallします。但し、二重にinstallされる可能性があります。 |
bpkg init | 必要最低限のpackage.jsonを製作するのを手伝ってくれます。ウィザード式。 |
bpkg json | 標準入力からjson形式の文字列を入力すると、各keyとあたいのペアを吐いてくれます。 |
bpkg package <string> | カレントディレクトリにあるpackage.jsonの中身を表示します。<string>が与えられている時、それに対応する値を表示してくれます。 |
bpkg term | 下で出てくるterm というプログラム自身です。 |
bpkg suggest | よくわからない...多分、与えられた文字列に合致するパスを探してくれる...?? |
bpkg utils | 一応利用可能コマンドとされているが、コード見ても使用方法がわからなかったやつ |
1. bpkgでinstallする
bpkg
を使ってinstallしてみましょう。
公式の例でも出ているので、termという、ターミナルで文字色を変えたり点滅させたり色々できる機能を使いやすくしてくれるパッケージをインストールしてみます。
(色変えなどについて詳しくは、tput
を調べてみるといいです。色々できます。もし気になれば、@onokatioさんのこの記事がわかりやすいです。)
globalにinstallする
先ずは、他のパッケージマネージャーと同じように、/usr/local/bin
等にinstallしてみます。
$ bpkg install term -g
info: Install /bpkg/term/master from remote https://raw.githubusercontent.com [https://github.com]
info: Cloning https://github.com/bpkg/term.git to term-master
Cloning into 'term-master'...
remote: Counting objects: 34, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 34 (delta 14), reused 34 (delta 14), pack-reused 0
Unpacking objects: 100% (34/34), done.
Already on 'master'
Your branch is up to date with 'origin/master'.
info: Performing install: `make install'
cp term.sh /usr/local/bin/term
$ term
usage: term [-hV] <command> [args]
とまあこんな感じで入りました。
localにinstallする
次はbpkg
特有の(多分)、ローカルへのinstallをしてみます。
$ bpkg install term
# <current_path>にはpwdが入ってます
info: Install /bpkg/term/master from remote https://raw.githubusercontent.com [https://github.com]
info: Install dependencies for term
fetch: https://raw.githubusercontent.com/bpkg/term/master/term.sh
write: <current_path>/deps/term/term.sh
term to PATH: <current_path>/deps/bin/term
$ ./deps/bin/term
usage: term [-hV] <command> [args]
こんな感じですね。
bpkgでのinstallまとめ
$ bpkg install <-g|--global> <package> # ex. bpkg install term
# githubにあれば、bpkg.shに登録されていなくてもinstallできる
$ bpkg install <-g|--global> <user/package> # ex. bpkg install Cj-bc/bpkg-test
package.jsonさえあれば大抵installできるっぽいので割とつおい(未検証)
2. パッケージの情報を見る
カレントディレクトリの情報を見る(bpkg package
)
カレントディレクトリにpackage.json
がある時、bpkg package <string>
で<string>に対応する値を取り出してくれます。
又、bpkg package
のみの場合、全てのペアを吐き出してくれます。
$ cat package.json
{
"name": "bpkg",
"version": "0.3.0",
"description": "Lightweight bash package manager",
"global": true,
"repo": "bpkg/bpkg",
"install": "bash setup.sh"
}
$ bpkg package name
"bpkg"
$ bpkg package
["name"] "bpkg"
["version"] "0.3.0"
["description"] "Lightweight bash package manager"
["global"] true
["repo"] "bpkg/bpkg"
["install"] "bash setup.sh"
bpkg list
にあるパッケージの情報を見る(bpkg show <user/package>
)
bpkg list
で見れる、公式のリストに載っているパッケージはbpkg show <user/package>
で情報を見ることができます。
$ bpkg show bpkg/bpkg
Name: bpkg/bpkg
Description: Lightweight bash package manager
Current Version: 0.3.0
Remote: https://github.com
Install: bash setup.sh
README.md: 293 lines
# READMEや、プログラム自身のソースコード
$ bpkg show readme bpkg/bpkg
# bpkgのREADME.mdが出力されます
$ bpkg show source bpkg/term
# termのソースコードが出力されます
3. パッケージを作る
bpkg init
で、package.json
を作成する手助けをしてくれます。
例として、cj-bc/slackerのpackage.json
を書いてみます。
$ pwd
~/dev/slacker/
$ bpkg init
This will walk you through initializing the bpkg `package.json' file.
It will prompt you for the bare minimum that is needed and provide
defaults.
See github.com/bpkg/bpkg for more information on defining the bpkg
`package.json' file.
You can press ^C anytime to quit this prompt. The `package.json' file
will only be written upon completion.
name: (slacker)
version: (0.0.1) 0.1.0
description: A CLI Slack tool using SHELLSCRIPT.(Just to send messages)
install: (install -b slacker.sh ${PREFIX:-/usr/local}/bin/slacker) ./install.sh
scripts: (slacker.sh) slacker.sh func/AnalyzeId.sh func/Errorfunc.sh func/commonfunc.sh func/sendfunc.sh func/settingsfunc.sh
Github username: (my_name) Cj-bc
Force global install? [y/n]: y
{
"name": "slacker",
"version": "0.1.0",
"description": "A CLI Slack tool using SHELLSCRIPT.(Just to send messages)",
"global": "1",
"install": "./install.sh",
"scripts": [ "slacker.sh", "func/AnalyzeId.sh", "func/Errorfunc.sh", "func/commonfunc.sh", "func/sendfunc.sh", "func/settingsfunc.sh" ]
}
Does this look OK? (type 'n' to cancel)
$ ls | grep package.json
package.json
簡単ですね。各キーについて値を聞かれるので、デフォルトのままでよければエンター、変えたければその内容を打ち込めば自動で作ってくれます。Json形式をわざわざ書かなくていいのは時短になると思います。
無論、上記内容が網羅されていれば既存の package.json
のままで良いですし、いづれにせよそこまで時間をかけずに対応できます。
その他のコマンドについて
そのほかのコマンドも、便利なものが色々とあります。
が、なぜか公式にはドキュメントが存在しません...
(コード読めば書いてあったりはするのですが)
なので後ほど、書いておこうと思います。