🚀

miseのタスクランナーで開発URLを賢く開く

に公開

課題:開発時のURL管理が面倒

開発サーバーを立ち上げるたびに、いくつかのURLをブラウザで開く作業が発生します。

  • http://localhost:3001 - メインのWebアプリ
  • http://localhost:3002 - 管理画面
  • http://localhost:8025 - Mailpit(メール確認用)
  • https://local.drizzle.studio - Drizzle Studio(DB管理)

毎回手で開くのは面倒です。とはいえ open で一気に開くと、すでに開いているタブまで重複して開いてしまうのが困りもの。
サーバー再起動のたびにタブが増殖していくのは地味にストレスでした。

解決策:miseのタスクランナー + AppleScript

mise はバージョン管理ツールの印象が強いですが、タスクランナーとしても便利です。今回は「開いているタブはスキップし、未オープンだけ開く」動きを作りました。

実装

mise.toml にタスクを追加します。

mise.toml
[tasks.open]
description = "開発で使うツールをまとめて開く"
run = """
#!/bin/bash
set -e

GREEN='\\033[0;32m'
CYAN='\\033[0;36m'
YELLOW='\\033[0;33m'
NC='\\033[0m'

# Chrome でタブが開いてなければ開く関数
open_if_not_exists() {
  local url="$1"
  local name="$2"

  # Chrome が起動していない場合は普通に開く
  if ! pgrep -x "Google Chrome" > /dev/null; then
    open "$url"
    echo -e "  ${GREEN}✓${NC} $name"
    return
  fi

  # 既存タブをチェック
  local exists=$(osascript -e '
    tell application "Google Chrome"
      set found to false
      repeat with w in windows
        repeat with t in tabs of w
          if URL of t starts with "'"$url"'" then
            set found to true
            exit repeat
          end if
        end repeat
        if found then exit repeat
      end repeat
      return found
    end tell
  ' 2>/dev/null)

  if [ "$exists" = "true" ]; then
    echo -e "  ${YELLOW}○${NC} $name (既に開いています)"
  else
    open "$url"
    echo -e "  ${GREEN}✓${NC} $name"
  fi
}

echo -e "${CYAN}🌐 ブラウザで開発 URL を開く...${NC}"
open_if_not_exists "http://localhost:3001" "Web App"
open_if_not_exists "http://localhost:3002" "Admin"
open_if_not_exists "http://localhost:8025" "Mailpit"
open_if_not_exists "https://local.drizzle.studio" "Drizzle Studio"
echo -e "${GREEN}✅ 完了${NC}"
"""

ポイント解説

1. AppleScript で既存タブをチェック

local exists=$(osascript -e '
  tell application "Google Chrome"
    set found to false
    repeat with w in windows
      repeat with t in tabs of w
        if URL of t starts with "'"$url"'" then
          set found to true
          exit repeat
        end if
      end repeat
      if found then exit repeat
    end repeat
    return found
  end tell
' 2>/dev/null)

osascript で Chrome の全ウィンドウ・全タブを走査し、指定URLで始まるタブがあるかを確認します。starts with にしているのは、クエリが付いても判定できるようにするためです。

2. Chrome が起動していない場合の考慮

if ! pgrep -x "Google Chrome" > /dev/null; then
  open "$url"
  echo -e "  ${GREEN}✓${NC} $name"
  return
fi

Chrome が起動していない状態で AppleScript を叩くと勝手に立ち上がるので、先にプロセスを見て回避します。

3. 視覚的なフィードバック

GREEN='\\033[0;32m'
YELLOW='\\033[0;33m'
  • ✓ 緑:新しく開いた
  • ○ 黄:既に開いていたのでスキップ

どれが開かれたか一目でわかるようにしておきました。

使い方

mise run open

実行結果はこんな感じです。

🌐 ブラウザで開発 URL を開く...
  ✓ Web App
  ✓ Admin
  ○ Mailpit (既に開いています)
  ✓ Drizzle Studio
✅ 完了

dev タスクと組み合わせる

開発サーバーの起動と組み合わせることもできます。

mise.toml
[tasks.dev]
description = "開発サーバーを起動"
depends = ["open"]
run = "bun run dev"

depends = ["open"] を指定すると、mise run dev 実行時に先に open が走り、その後で開発サーバーが起動します。

まとめ

やっていることは単純ですが、毎回の「タブ増殖」から解放されるだけで体感がかなり楽になります。miseでタスク管理しているなら、ついでに仕込んでおくと便利です。

Discussion