Using AppleScript to set up iTerm2 for Rails Development
A Rails developer often needs to start multiple processes while working on an application. You might need to run
sidekiq to process background jobs, and
webpack to compile your front-end code. You’ll probably also want to have a Rails console.
iTerm2 is an excellent terminal emulator for Mac that supports tabs and panes. It also has very good AppleScript support, so you can write a script that sets up some panes and tabs, and starts some processes.
.dev.scpt scripts in the root folder of my projects. I’ve also added a
ds alias to my
~/.bashrc so that I can run them quickly:
alias ds='osascript .dev.scpt "$(pwd)"'
This shortcut runs any
.dev.scpt script with the current directory as an argument.
The following AppleScript will:
rails serverin the current session
sidekiqin a new pane on the bottom left
webpackin a new pane on the bottom right
rails consolein a new tab
- Open a few extra tabs for things like git, rspec, deploys, etc.
on run argv set current_dir to item 1 of argv tell application "iTerm2" tell current window set rails_session to current session set current_tab to current tab tell current session write text "bundle exec rails server --binding=127.0.0.1 --port 3000" set sidekiq_session to split horizontally with default profile tell sidekiq_session to select write text "cd " & current_dir write text "bundle exec sidekiq" set client_session to split vertically with default profile tell client_session to select write text "cd " & current_dir & "/client" write text "yarn run build:development" end tell # Only open some more tabs if this is a new window if count of tabs is 1 then set new_tab to create tab with default profile tell current session of new_tab write text "cd " & current_dir write text "rails console" end tell # Open some extra tabs for git, rspec, deploys, etc. repeat 3 times set new_tab to create tab with default profile tell current session of new_tab to write text "cd " & current_dir end repeat end if tell current_tab to select tell rails_session to select end tell end tell end run
Why not run Sidekiq inline?
If you’re only using Rails and Sidekiq, you might be tempted to run your Sidekiq jobs “inline” during development:
require 'sidekiq/testing' Sidekiq::Testing.inline!
The advantage is that you can just run
rails server, instead of starting multiple processes. However, you might end up missing some bugs and edge cases that are related to asynchronous behavior. It’s always better if you can run the same code in development and production. Active Job’s default adapter was also changed from
:async in Rails 5:
It’s a better default as tests will then not mistakenly come to rely on behavior happening synchronously.
foreman is another popular choice. You create a
Procfile with all of the commands that you need to run:
web: bundle exec rails server --binding=127.0.0.1 -p 3000 worker: bundle exec sidekiq client: cd client && yarn run build:development
foreman start will start the processes:
$ foreman start 12:38:24 web.1 | started with pid 46746 12:38:24 worker.1 | started with pid 46747 12:38:24 client.1 | started with pid 46748
The problem is that you can’t use a debugger. I often use pry-byebug to debug my code by calling
binding.pry, and the IRB prompt doesn’t work properly when you’re using
tmuxinator + tmux
windows: - editor: layout: main-vertical panes: - bundle exec rails s - bundle exec sidekiq - cd client && yarn run build:development - logs: tail -f log/development.log
This runs each process in a different pane or window, so you can use
binding.pry to debug your code. It’s also great for developers who use
emacs. However, it wasn’t for me. I couldn’t find a nice “prefix key” for the keyboard shortcuts. I have to stretch my hand too far for
Ctrl+a kind of hurts my wrist.
I think iTerm2 has much nicer keyboard shortcuts than
tmux, because you don’t need to use a prefix key. You can also use the mouse for drag-and-drop reordering of tabs and panes, or to switch between them.
More options from the comments of our Reddit post:
Overmind and Hivemind are process managers for Procfile-based applications, inspired by
foreman. Hivemind was the initial version, but Overmind is a lot more powerful. It runs all the processes in a
tmux session. This means that you can connect to the
tmux session to access the debugger. You can also restart individual processes. Learn more about Overmind and Hivemind.
Another alternative to
foreman for Mac users. Runs each command in a separate iTerm2 tab.
“An awesome utility to manage all your processes in development environment.” Homepage: http://invoker.codemancers.com
Mux is a VS Code plugin to manage
A way to start Pry remotely and to connect to it using DRb. This allows access to the state of the running program from anywhere. You could use
pry-remote to connect to a process started by
foreman, in a Docker container, or even on a remote server.
This article shows how you can set up a keyboard shortcut to restore a saved window arrangement in iTerm2.