読者です 読者をやめる 読者になる 読者になる

hitode909の日記

趣味はマリンスポーツですの日記です

Gistに置いたRubyのスクリプトをGemで公開してそのままインストールできると便利かと思ったけどいまいちだった

~/tmp/bin/とかに手軽にRubyのスクリプトを書いて置いといたりする.これは前時代的なのでなんとかしたい.

  • ほうっておくと動かなくなったり消えたりするので,どこかに置いといてインストール可能な状態にしたい
  • いまどきbin/以下にコピー,とかしたくない
  • 手軽にすぐ作りたい
  • グローバルなネームスペースを汚染したくない
    • rubygems.orgやCPANではsome-my-useful-toolとかApp::My::Useful::Toolみたいになるけど,この名前は世界中で唯一無二でプレッシャーが高い
    • ネームスペースの衝突を恐れてキラキラネームをつけたりしているけど釈然としなくて,これならUUID::1992246e::6a7f::493d::8d82::f2fe042b4a31とかで済みそうな気もする

Gistに置いたRubyのスクリプトをGem形式で公開してそのままインストールできると便利かと思ったけどいまいちだった.
GistにGemを置きつつも実行したいファイルも置く,という形にしてみたのだけど,これ単体ではgem installできない…..
https://gist.github.com/hitode909/8e3fde72960e9adbbc7b5cbf4e0d5861

Gem::Specification.new do |spec|
 spec.name = "urls"
 spec.version = "0.0.3"
 spec.authors = ["hitode909"]
 spec.email = ["hitode909@gmail.com"]
 spec.summary = "Extract and print the URLs"
 spec.files = ["urls"]
 spec.bindir = "."
 spec.executables = ["urls"]
end

配布したいのは,標準入力に含まれるURLを出力するurlというスクリプト.これはこれでべんり.

require 'uri'

while line = gets
  begin
    URI.extract(line, ['http', 'https']).each do |uri|
      puts uri
    end
  rescue
  end
end


このurlsコマンドを使うには,もう1つgistを置いて,こちらにはGemfileを置いて,--binstubして,bin/urlsする.これで実行できたけど,あまり意味がなさそう.このディレクトリに移動してから実行することになってうれしさが少ない.
https://gist.github.com/hitode909/5b2ae7b965c389f0e993fa7fe54099d0

gem "urls", git: "https://gist.github.com/8e3fde72960e9adbbc7b5cbf4e0d5861.git"

モジュールをプロジェクトの一部として管理するならGistで済むけど,実行ファイルをインストールしたいときにはGistは使えなかった(なんか方法あったら教えてください).
こういうのはGoとかNodeで書くと楽そうな気がする.hitode909/urls みたいに著者の名前つきで実行ファイルをインストールできるとプレッシャーが少なくて気楽だと思う.
似たような話題がPerlのモジュール管理にもあって,社内で使いたいモジュールなどを作ったとき,うちの会社ではgitのsubmoduleに置いてるのだけど,そうするとcpanfileで管理できなくなる.
cpanfileにgitのURLやブランチやタグなど書けるようになれば,CPANに上げる前に個人のgithubからインストールして様子を見たりできて便利そう.今はいきなり世界中に公開するしかなくてちょっと不便.