自作コマンド(opy)をbrewとsnapに対応した

Wed Sep 11 22:49:48 JST 2019 (modified: Wed Sep 11 22:57:32 JST 2019)
views: 89, keywords: opy, Python, ワンライナー, シェル芸

  このエントリーをはてなブックマークに追加 
   

要旨

 この記事がそこそこ反響を呼んで調子に乗った上田は、opy(おーぴーわい or おーぱい。促音禁止)の普及を図るためにbrewとsnapに手を出した。

homebrew

 ということで、まずはMacで簡単にインストールできるようにbrewに対応しました。こちらを参考にしました。

結果、これでインストールできるようになりました。

$ brew tap ryuichiueda/oneliner-python
$ brew install oneliner-python

書いた設定はこんな感じです。

require "formula"

class OnelinerPython < Formula
  homepage "https://github.com/ryuichiueda/opy"
  url "https://github.com/ryuichiueda/opy/archive/v1.4.4.tar.gz"
  sha256 "f3ab839ff0e919bcf5764fb0a8eb69904d3eba2fa3eb4f19ebf60c464a782a73"
  head "https://github.com/ryuichiueda/opy.git"
  version "1.4.4"

  def install
    bin.install "opy"
    man1.install "opy.1" 
  end
end

 ついでにchikubeam(1)させていただきました。

とてもたのしい(とてもたのしい)。

Snappy (snap)

 で、次にsnapに対応しました。deb作るの大変そうだし、こっちの方が新しいし・・・って手を出しましたがかなりつらかったです。

 snapのパッケージを作るときは、snapcraftというツールをインストールして、次のようなyamlを書いて、そこでsnapcraftと打って作ります。snapcraftのやってることを見ていると、何かVMみたいなものを作ってそのなかに必要なツールをダウンロードしてビルドして、そのあと固めてsnapという拡張子のファイルにするみたいです。

name: opy
version: 'latest'
summary: Onelinerers' Python, which works like AWK
description: |
  This command works like AWK in one liners. It enables you to use Python
  modules on CLI.
grade: stable
confinement: strict

apps:
  opy:
    command: opy

parts:
  opy:
    source: https://github.com/ryuichiueda/opy.git
    plugin: dump
    source-tag: master
    source-depth: 1

 ビルドがうまくいったら、Ubuntu Oneのアカウントで https://snapcraft.io にログインし、https://snapcraft.io/register-snap でパッケージの名前を予約して、

$ snap push --release=stable opy_latest_amd64.snap

とアップロードしました。これで、こんなふうにパッケージがインターネッツ上にさらされました。あとは、任意のsnapが使える環境で、誰でも

$ sudo snap install opy

するとインストールできる状況になりました。

ハマったところ

 細かい手順は書く時間がないので、ハマりポイントを書いておきます。最初はopyという図々しい名前でなく、oneliner-pythonという名前でパッケージを作っていました。ただ、これだとどんなに頑張ってもコマンド名がoneliner-python.opyとかoneliner-pythonにしかなりませんでした。

どうやら名前がバッティングするのを避けるために、パッケージ名をくっつけるしかなさそう。

 一応、これはユーザの方で

$ sudo snap alias oneliner-python.opy opy

とすればよいようなのですが、これはこれで面倒なので、結局パッケージ名をopyにしました。

 また、オプションがいろいろ煩雑で、手元で試しにsnapファイルをインストールするときは、

$ sudo snap install opy_latest_amd64.snap --dangerous

というふうに--dangerousとオプションを加えなければいけませんが、よく忘れて時間を食いました。また、pushするときも--release=stableをつけないと、snap installできない状態になり、また同じsnapファイルをアップロードできなくなるので、これも時間を食いました。

 ちなみに、https://snapcraft.io/opyではダウンロード数とかも閲覧できるみたいなので楽しみです。これでダウンロードが少ないと、先日のバズりが、「opy面白い!使ってみたい!」ではなく、「opyがお○ぱいだ!」という点でのものだったことになり、大変悲しいのでぜひsnapでインストールしてみてください。

違う!寝る。



prev:OPY command that makes Python easy on CLI next:「詳解 確率ロボティクス」でミスマッチを起こさないために