LoginSignup
11
10

More than 5 years have passed since last update.

puma-devをproxyで使う際の便利コマンドを作った

Last updated at Posted at 2017-03-08

普段のRailsアプリケーション開発にpuma-devを使っています。僕の場合はもっぱらproxyとして使っています。

そもそもpuma-devとは何かというのはこちらに書きました。

puma-devを使ってRailsの開発サーバーをhttps対応にする - Qiita

(本当はこの投稿に入れる形で書いてたんだけど、puma-devの説明書いてたら長くなってきたから分けました)

tl;dr

puma-devでproxy使うとポート番号忘れて困るので、ポート番号を調べてrails sしてくれるコマンド作ったよ。

pi-chan/puman

(※Linux未確認です)

puma-devのproxyとは

Railsのデバッグ

proxyの話の前に、関連するデバッグの話を書きます。

puma-devは~/.puma-devディレクトリにアプリケーションのRootディレクトリへのシンボリックリンクを置くことで、http://シンボリックリリンク名.devでアクセスできるというものです。

この方法を使うとrails sする必要がなくなる分楽ではあるのですが、コード中にデバッガーで止めるためのコードを書いても止まってくれません(というか、裏で止まるのかな?)。

puma-devやpowを知る前の僕は、ターミナルでrails sしてサーバーを起動しデバッグにはpryを使っていました。binding.pryを書いた行にさしかかると、rails sしているサーバーの出力が止まってpryのREPLが使えるようになるわけです。

pryを使う方法に慣れていたので、puma-devのような仕組みだと困ってしまいました。pry-remoteのような方法(うろ覚え)もありそうだったのですが難しく、うまくいきませんでした。

ちなみに同僚の@jnchitoがこんなアンケートを取ってて、僕は一番上のpryにいれました。

そんなときのproxy機能

puma-devのproxyではdevドメインは活かしつつ、サーバーの起動は自分でrails sするというものです。

~/.puma-devディレクトリにはシンボリックリンクではなく、ポート番号を書いたテキストファイルを配置します。

~/.puma-dev/railsapp
3001

こう書いておくとhttp://railsapp.devへのアクセスが3001番ポートにいきます。サーバーはターミナルで動いているのでbinding.pry等で簡単に止めることができます。

puma-devのdevやxip.io、https対応のメリットは活かしつつ、サーバーを自分で動かすことができました。

ポート番号問題

自分でrails sするので、複数アプリケーションを同時に立ち上げる場合はポート番号を指定してあげる必要があります。このときのポート番号は~/.puma-dev/以下においたファイルに書いたものでないと正しくプロキシされません。

このアプリケーションは3001番、こっちは3002番など起動時に指定してあげなければならず覚える必要がでてきます。アプリケーションが増えていくと、覚えきれるものではありません。

最初の対応策

最初は簡単なスクリプトで回避しようと考えていました。覚えきれないので簡単に一覧できるようにしようという発想です。

#!/usr/bin/env ruby
portmaps = {}
Dir.chdir "~/.puma-dev" do
  Dir.glob('*').each do |file|
    unless File.symlink?(file)
      port = File.read(file)
      portmaps[port] = file
    end
  end
end

portmaps.sort.each do |port, proj|
  puts "#{port.strip} => #{proj}"
end

そうするとこんな風に出力されます。少ないうちはこれでなんとかなっていました。

3004 => aaaa
3005 => bbbb
3006 => cccc
3007 => dddd
3008 => eeee

最近は30個近くなってきて一覧にしても見つけるのが大変で結局面倒になってきました。

コマンドにした

ようやく本題。

ポートを指定するのはrails sするときだけだな、ということでポート番号を読んで勝手にrails sしてくれるコマンドにすればいいんじゃないか?と気がつきました。

そして、コマンドラインツールを簡単に作れるThorを使ってpumanというコマンドのgemを作りました。名前がちょっといい加減すぎるかなと思いましたが、まあいいです。

pi-chan/puman

Usageはこんな感じ。

Commands:
  puman help [COMMAND]  # Describe available commands or one specific com...
  puman list            # list all apps linked with puma-dev
  puman server          # run rails server
  puman symlink DIR     # create symlink into puma-dev directory.
  puman version         # version

該当のプロジェクトのRootディレクトリ以下にいる状態でpumanと叩けばポート番号を調べてくれて勝手にrails s -p 30xxとしてくれます。はっきり言って僕はめちゃくちゃ楽です。

ついでに~/.puma-devにをシンボリックリンクを置いたり(puman symlink .)、~/.puma-devの中身を一覧したり(puman list)など、サブコマンドもいくつか用意してあります。

proxy用に適当なポート番号を決めて新たに~/.puma-devに追加するコマンド(puman proxy DIR)も作ろうと思っていましたが、まだやっていません。今度作ります。

マニアックな用途ですが困っている人が他にもいるかも、と思い書いてみました。

デバッグに関する参考

printデバッグにさようなら!Ruby初心者のためのByebugチュートリアル - Qiita

11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10