何ができないか
一度閉じた VS Code の窓を、コンテナを止めずに開き直す手段が無い。
devbase up は最後の段 [6/6] でエディタを開く(lib/devbase/commands/container.py:951 _maybe_open_editor)。しかしこの経路は cmd_up からしか呼ばれない。窓を手で閉じたあと同じ窓を出し直すには、コンテナが動いているのに devbase up をやり直すしかない。
$ grep -rn "_maybe_open_editor" lib/
lib/devbase/commands/container.py:951:def _maybe_open_editor(project_name: str, open_flag: Optional[bool],
lib/devbase/commands/container.py:1284: _maybe_open_editor(project_name, open_editor, open_index, scale,
devbase up のやり直しは、動いているコンテナに対して pre-up チェック・自動スナップショット・ボリューム/ネットワークの作成・compose の再生成・deploy フック・ready 待ちを通す(cmd_up → _run_deploy_pipeline)。窓を 1 つ開くためだけに払う手順ではない。
エディタを開く処理そのものは lib/devbase/editor/opener.py:721 open_editor() に閉じており、up の成否とは独立している(開けなくても up は倒さない)。呼び出す入口が無いだけである。
期待する挙動
| やること |
期待 |
| 起動中のプロジェクトでコマンドを打つ |
コンテナに一切触らず、dev コンテナへ接続した窓を開く |
| 停止中のプロジェクトで打つ |
up を実行して起動し、そのまま窓を開く(devbase up と同じ結果になる) |
devbase list の TUI |
起動中メニューの先頭(再起動 / 停止 / ログインの上)から同じ操作を選べる |
直し方の案
コマンドの新設
devbase open(案。editor / code も候補)を project / container グループとトップレベルのショートカットに足す。
| 足す場所 |
内容 |
lib/devbase/cli.py:137 _add_open_args |
--open-index N は既存の定義をそのまま流用できる。--open / --no-open は明示コマンドでは意味を持たないため、open 用には index だけを取る別の登録にする |
lib/devbase/cli.py:35 SHORTCUTS |
'open': 'open' を足す |
lib/devbase/cli.py SUBCMD_MAP / _add_project_parser / _add_container_parser |
open を登録する |
lib/devbase/commands/container.py:704 の handlers 表 |
'open': lambda: cmd_open(...) を足す |
bin/devbase:407-408 |
_PROJECT_NAME_SUBCOMMANDS / _NAME_RESOLVABLE_SHORTCUTS へ open を足す(cli.py 側と対で更新する注記がある) |
cmd_open 自体は薄くできる。cmd_up の冒頭と同じく project_runtime.current_project_config() で project.yml を読み、_resolve_docker_target(context) で接続先を決め、_maybe_open_editor へ渡す。コンテナが解決できなければ cmd_up を呼び、その [6/6] に窓を開かせる(自前で開き直さない)。
TUI のメニュー
lib/devbase/tui/actions_project.py の 3 か所。
| 場所 |
変更 |
:32 _RUNNING_OPS |
("editor 起動 (open)", "open") を先頭に置く |
:170 _OP_HANDLERS |
"open": lambda root, name: dispatch_lifecycle("open", name, open_index=None) |
:44 _BACK_TO_TOP_OPS |
足さない。 コンテナの数が変わらないため、実行後はサブメニューに留まる(login / ps と同じ扱い) |
決めること
| 論点 |
案 |
| 既定のハイライトが変わる |
_RUNNING_OPS の先頭は Enter 連打で届く位置で、現在は「再起動 (up)」が占めている(:31 のコメントが理由を書いている)。先頭を open にすると、Enter 連打の到達先が再起動から窓を開く操作へ変わる。依頼どおり先頭に置くが、:31 のコメントもあわせて書き替える |
DEVBASE_OPEN_EDITOR=0 の端末での扱い |
開く。 明示のコマンド・明示のメニュー選択は意思表示であり、up のときの自動オープンの可否とは別に扱う(opener.is_open_enabled を見ない) |
| index の上限 |
project.yml の scale ではなく動いているコンテナの数から決める。devbase scale でオンライン変更されていると project.yml の値とずれる。opener.resolve_container_name が docker compose ps を引くため、そこで解決できない index はエラーにする |
| 停止中のときの動き |
up を実行する。 コンテナ名が解決できないことをもって「起動していない」と判定し、cmd_up へ委譲して起動から窓を開くところまで通す。窓を出したいという意思表示に対して、起動しているかどうかを利用者が先に確かめなくてよい |
検査
tests/cli/tui/test_profile_menu.py にならい、_RUNNING_OPS の先頭が open であること・_BACK_TO_TOP_OPS に含まれないことを見る
tests/editor/test_opener.py にならい、cmd_open がコンテナ操作(compose up / ボリューム作成 / フック)を 1 つも呼ばずに open_editor だけを呼ぶことを見る
- 停止中のプロジェクトでは
cmd_up へ委譲されることを見る(起動中は cmd_up を呼ばないことと対で見る)
併せて直すか決めること
devbase up の --open / --no-open / --open-index は残す。open の新設は up の自動オープンを置き換えるものではない(起動と同時に開く経路は今までどおり要る)。
由来
devbase up で開いた窓を手で閉じたあと、開き直す手段を探して踏んだ。
振り返り: #197 (comment)
何ができないか
一度閉じた VS Code の窓を、コンテナを止めずに開き直す手段が無い。
devbase upは最後の段[6/6]でエディタを開く(lib/devbase/commands/container.py:951_maybe_open_editor)。しかしこの経路はcmd_upからしか呼ばれない。窓を手で閉じたあと同じ窓を出し直すには、コンテナが動いているのにdevbase upをやり直すしかない。devbase upのやり直しは、動いているコンテナに対して pre-up チェック・自動スナップショット・ボリューム/ネットワークの作成・compose の再生成・deployフック・ready 待ちを通す(cmd_up→_run_deploy_pipeline)。窓を 1 つ開くためだけに払う手順ではない。エディタを開く処理そのものは
lib/devbase/editor/opener.py:721open_editor()に閉じており、upの成否とは独立している(開けなくてもupは倒さない)。呼び出す入口が無いだけである。期待する挙動
upを実行して起動し、そのまま窓を開く(devbase upと同じ結果になる)devbase listの TUI直し方の案
コマンドの新設
devbase open(案。editor/codeも候補)をproject/containerグループとトップレベルのショートカットに足す。lib/devbase/cli.py:137_add_open_args--open-index Nは既存の定義をそのまま流用できる。--open/--no-openは明示コマンドでは意味を持たないため、open用には index だけを取る別の登録にするlib/devbase/cli.py:35SHORTCUTS'open': 'open'を足すlib/devbase/cli.pySUBCMD_MAP/_add_project_parser/_add_container_parseropenを登録するlib/devbase/commands/container.py:704のhandlers表'open': lambda: cmd_open(...)を足すbin/devbase:407-408_PROJECT_NAME_SUBCOMMANDS/_NAME_RESOLVABLE_SHORTCUTSへopenを足す(cli.py側と対で更新する注記がある)cmd_open自体は薄くできる。cmd_upの冒頭と同じくproject_runtime.current_project_config()でproject.ymlを読み、_resolve_docker_target(context)で接続先を決め、_maybe_open_editorへ渡す。コンテナが解決できなければcmd_upを呼び、その[6/6]に窓を開かせる(自前で開き直さない)。TUI のメニュー
lib/devbase/tui/actions_project.pyの 3 か所。:32_RUNNING_OPS("editor 起動 (open)", "open")を先頭に置く:170_OP_HANDLERS"open": lambda root, name: dispatch_lifecycle("open", name, open_index=None):44_BACK_TO_TOP_OPS決めること
_RUNNING_OPSの先頭は Enter 連打で届く位置で、現在は「再起動 (up)」が占めている(:31のコメントが理由を書いている)。先頭をopenにすると、Enter 連打の到達先が再起動から窓を開く操作へ変わる。依頼どおり先頭に置くが、:31のコメントもあわせて書き替えるDEVBASE_OPEN_EDITOR=0の端末での扱いupのときの自動オープンの可否とは別に扱う(opener.is_open_enabledを見ない)project.ymlのscaleではなく動いているコンテナの数から決める。devbase scaleでオンライン変更されているとproject.ymlの値とずれる。opener.resolve_container_nameがdocker compose psを引くため、そこで解決できない index はエラーにするupを実行する。 コンテナ名が解決できないことをもって「起動していない」と判定し、cmd_upへ委譲して起動から窓を開くところまで通す。窓を出したいという意思表示に対して、起動しているかどうかを利用者が先に確かめなくてよい検査
tests/cli/tui/test_profile_menu.pyにならい、_RUNNING_OPSの先頭がopenであること・_BACK_TO_TOP_OPSに含まれないことを見るtests/editor/test_opener.pyにならい、cmd_openがコンテナ操作(compose up / ボリューム作成 / フック)を 1 つも呼ばずにopen_editorだけを呼ぶことを見るcmd_upへ委譲されることを見る(起動中はcmd_upを呼ばないことと対で見る)併せて直すか決めること
devbase upの--open/--no-open/--open-indexは残す。openの新設はupの自動オープンを置き換えるものではない(起動と同時に開く経路は今までどおり要る)。由来
devbase upで開いた窓を手で閉じたあと、開き直す手段を探して踏んだ。振り返り: #197 (comment)