bash package manager: bpkgの紹介

### お断り
自分自身も使いながら書いているので間違っているところや曖昧なところ・未検証な点等ありますがご了承ください
何か間違っている点などありましたらどしどし指摘してください！

----

# 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](http://www.bpkg.sh))

**Bpkg**は、Shellscript(とMakefile)100%で書かれたshell用パッケージマネージャーです。
Bash scriptと書かれてはいますが, install処理はパッケージ管理者が指定できるので実質それ以外でも使えます。
[@spotify](https://github.com/spotify)などもスポンサーなようです。

[Github](https://github.com/bpkg/bpkg)
[homepage](https://www.bpkg.sh)


# 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もできます

```bash

$ git clone https://github.com/bpkg/bpkg.git
$ cd bpkg
$ ./setup.sh
```

この時、`$ PREFIX=<PATH> ./setup.sh`とすることで、<PATH>以下にinstallできるようです。


## 4. (非公式) home-brew/linuxbrewを利用する

1,2,3どれも気に食わなかったので、作っちゃいました。formula。
ということで、非公式にはなりますが`homebrew/linuxbrew`でもinstallできます。

```bash
$ brew tap Cj-bc/bpkg
$ brew install bpkg
```

いつか公式に認められたらまた書き直します（が時間かかりそう...）



# bash補完のすゝめ

bash勢の人なら！tabキーで補完できると便利じゃありませんか？？
そんな夢を叶えるために！！()
bash補完、書きました（ドヤ
[Cj-bc/bpkg-completion](https://github.com/Cj-bc/bpkg-completion)

`home-brew/linuxbrew`からinstallできます。

```bash
$ brew tap Cj-bc/bpkg-completion
$ brew install bpkg-completion
```

`setup.sh`等の書き換えが終わり次第、bash補完を含んだ`bpkg`のPRを本家に送ろうと思います。


# (基本的な)使い方

基本的なことは[bpkg.sh](http://www.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](https://github.com/bpkg/term)という、ターミナルで文字色を変えたり点滅させたり色々できる機能を使いやすくしてくれるパッケージをインストールしてみます。
（色変えなどについて詳しくは、`tput`を調べてみるといいです。色々できます。もし気になれば、@onokatioさんの[この](https://qiita.com/onokatio/items/5d282b72ac5565ae4569)記事がわかりやすいです。)


### globalにinstallする

先ずは、他のパッケージマネージャーと同じように、`/usr/local/bin`等にinstallしてみます。


```bash
$ 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をしてみます。

```bash
$ 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まとめ

```bash
$ 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`のみの場合、全てのペアを吐き出してくれます。

```bash
$ 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>`で情報を見ることができます。

```bash
$ 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](https://github.com/Cj-bc/slacker)の`package.json`を書いてみます。

```bash

$ 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`のままで良いですし、いづれにせよそこまで時間をかけずに対応できます。

##  その他のコマンドについて

そのほかのコマンドも、便利なものが色々とあります。
が、なぜか公式にはドキュメントが存在しません...
(コード読めば書いてあったりはするのですが)
なので後ほど、書いておこうと思います。