Help us understand the problem. What is going on with this article?

bash package manager: bpkgの紹介

More than 1 year has passed since last update.

お断り

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


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などもスポンサーなようです。

Github
homepage

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を使います。
多少、npmpackage.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/slackerpackage.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のままで良いですし、いづれにせよそこまで時間をかけずに対応できます。

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

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

Cj-bc
#shellscript #vim 最近は #haskell 始めた
https://github.com/Cj-bc
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away