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や、リファレンスを読みながらちょこちょこ書き換えた。

最終的に出来たのがこれ:

https://github.com/progrhyme/homebrew-core/blob/db315c00862854800f8f4ee75dd45e70d10c7862/Formula/shelp.rb

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