2020-06-15
6/15
maltmillを使いたかったが動かなかった
shelpのbrew tapを作ろうと思って、Songmuさんの記事を見つけ、maltmillを使ってFormulaを作ろうとしたが、動かなかった。
$ maltmill new -w progrhyme/shelp
[maltmill] [!!ERROR!!] no assets found from latest release
いまGitHubの最新版は https://github.com/progrhyme/shelp/releases/tag/v0.5.1-pre-release
Assetsはあるんだけどな。
まあ、きっとツールが想定している形式に沿ってないんだろう。
残念。
ついでにいうと、Ubuntu 18で作業してたのだけど、brewで入れようとしたらバイナリはdarwinだったから駄目だった。
(この辺はFormula作るときはどうしたらいいんだろう?)
次に go get
したらビルドがこけ、ghgが手元にあったので、ghgでインストールした。
関連項目:
初めてのBrew Formula
shelpのFormulaを作った。
だいたいこれ https://docs.brew.sh/Formula-Cookbook に沿って作業した。
他のドキュメント類のリンクは↑のページにメモしてある。
cd $HOMEBREW_PREFIX/Homebrew/Library/Taps/homebrew/homebrew-core
brew create https://github.com/progrhyme/shelp/archive/v0.5.0.tar.gz
これで Formula/shelp.rb
に雛形ができる。
あとはpecoのFormulaや、その辺にあったexampleや、リファレンスを読みながらちょこちょこ書き換えた。
最終的に出来たのがこれ:
class Shelp < Formula
desc "Git-based package manager for shell scripts written in Go"
homepage "https://github.com/progrhyme/shelp"
url "https://github.com/progrhyme/shelp/archive/v0.5.0.tar.gz"
sha256 "32ef1a1c0c85cc3fdca607dcc415d3032a9b3b770e6e7d1446c76ccb910c3c6a"
head "https://github.com/progrhyme/shelp.git"
depends_on "go" => :build
def install
ENV["GOPATH"] = buildpath
(buildpath/"src/github.com/progrhyme/shelp").install buildpath.children
cd "src/github.com/progrhyme/shelp" do
system "go", "build", "-o", bin/"shelp"
prefix.install_metafiles
end
end
test do
system "#{bin}/shelp", "--version"
end
end
単純にgoでbuildしてインストールする形。
検証
ビルドのチェックを行う。
brew install --interactive shelp
こうすると、テンポラリなディレクトリにtarballが展開され、そのディレクトリでシェルが起動する。 ここで、ビルド環境に問題がないかチェックするようだ。
shelpの場合、goがあればいいので特に問題ない。
何もせずに exit
した。
インストールする
$ brew install --verbose --debug shelp
$HOMEBREW_PREFIX/Homebrew/Library/Homebrew/brew.rb (Formulary::FormulaLoader): loading $HOMEBREW_PREFIX/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/go.rb
==> Downloading https://github.com/progrhyme/shelp/archive/v0.5.0.tar.gz
/usr/bin/curl --disable --globoff --show-error --user-agent Linuxbrew/2.4.0-41-g0125c4c\ \(Linux\;\ x86_64\ Ubuntu\ 18.04.4\ LTS\)\ curl/7.58.0 --retry 3 --location --silent --head --request GET https://github.com/progrhyme/shelp/archive/v0.5.0.tar.gz
Already downloaded: /home/progrhyme/.cache/Homebrew/downloads/953ed657e86e0d4247c629ba0e66f0a7a0690b35b0122db90d9cf2160b8a6a61--shelp-0.5.0.tar.gz
==> Verifying 953ed657e86e0d4247c629ba0e66f0a7a0690b35b0122db90d9cf2160b8a6a61--shelp-0.5.0.tar.gz checksum
$HOMEBREW_PREFIX/Homebrew/Library/Homebrew/build.rb (Formulary::FormulaLoader): loading $HOMEBREW_PREFIX/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/go.rb
$HOMEBREW_PREFIX/Homebrew/Library/Homebrew/build.rb (Formulary::FormulaLoader): loading $HOMEBREW_PREFIX/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/gcc.rb
$HOMEBREW_PREFIX/Homebrew/Library/Homebrew/build.rb (Formulary::FormulaLoader): loading $HOMEBREW_PREFIX/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/binutils.rb
$HOMEBREW_PREFIX/Homebrew/Library/Homebrew/build.rb (Formulary::FormulaLoader): loading $HOMEBREW_PREFIX/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/make.rb
tar xof /home/progrhyme/.cache/Homebrew/downloads/953ed657e86e0d4247c629ba0e66f0a7a0690b35b0122db90d9cf2160b8a6a61--shelp-0.5.0.tar.gz -C /tmp/d20200615-27628-1gx29yu
cp -pR /tmp/d20200615-27628-1gx29yu/shelp-0.5.0/. /tmp/shelp-20200615-27628-1cuvuid/shelp-0.5.0
chmod -Rf +w /tmp/d20200615-27628-1gx29yu
==> go build -o $HOMEBREW_PREFIX/Cellar/shelp/0.5.0/bin/shelp
go: downloading github.com/spf13/pflag v1.0.5
go: downloading golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9
go: downloading gopkg.in/yaml.v2 v2.3.0
go: downloading golang.org/x/sys v0.0.0-20190412213103-97732733099d
==> Cleaning
==> Fixing $HOMEBREW_PREFIX/Cellar/shelp/0.5.0/bin/shelp permissions from 755 to 555
==> Finishing up
ln -s ../Cellar/shelp/0.5.0/bin/shelp shelp
==> Summary
🍺 $HOMEBREW_PREFIX/Cellar/shelp/0.5.0: 6 files, 5.1MB, built in 5 seconds
バイナリインストールに対応できていない
bottleブロックが追加されたら、バイナリインストールにも自動的に対応されるのかな? とはいえそれには、homebrew-coreに取り込まれなければならない。
自前のTapでそれをやる方法はまだわかってない。
SongmuさんのFormulaを真似すればいいんだろうけど、最近Ubuntuを使う頻度が多いので、できればmacOS, Linusの両方に対応したい。
shelpをbrew tapでインストールできるようにした
上に書いたようにmaltmillが動かなかったので、先ほど作ったFormulaをそのまま使った。
https://github.com/progrhyme/homebrew-taps
このリポジトリを用意して、Songmuさんの記事を参考にして、Formulaを配置した。 実際、やることはこれだけ。
あとは
brew tap progrhyme/taps
brew install shelp
でOK.
shelpでbrewによるバイナリインストールに対応
Ruby APIとCookbookを見ながら頑張って対応した。
Formulaは次のようになった:
class Shelp < Formula
Version = '0.5.0'
if OS.mac?
Binary = "shelp_#{Version}_darwin_x86_64"
sha256 "18665382a6519b59741740cd9edbcc667be3bf99d06fd7d914274a30d5cba889"
elsif OS.linux?
Binary = "shelp_#{Version}_linux_x86_64"
sha256 "7a8797cbd3af61d0cb83b2ee6f8720a208c05e653871d55fee34b837c8f1e8bf"
end
url "https://github.com/progrhyme/shelp/releases/download/v#{Version}/#{Binary}"
desc "Git-based package manager for shell scripts written in Go"
homepage "https://github.com/progrhyme/shelp"
head "https://github.com/progrhyme/shelp.git"
def install
bin.install Binary => 'shelp'
end
test do
system "#{bin}/shelp", '--version'
end
end