diff --git a/.claude/skills/setup-resonite-env/SKILL.md b/.claude/skills/setup-resonite-env/SKILL.md index c043083..4d52b66 100644 --- a/.claude/skills/setup-resonite-env/SKILL.md +++ b/.claude/skills/setup-resonite-env/SKILL.md @@ -97,7 +97,7 @@ ______________________________________________________________________ ## 5. devcontainer 内で Resonite を起動 (`just resonite-launch`) -devcontainer 内で Resonite を直接起動できる。ro bind の `/resonite` から書込可能な `/opt/resonite` への rsync は `.devcontainer/entrypoint.sh` が container 起動時に行う (初回は install コピー、2 回目以降は差分のみ)。`resoio launch` (`python/src/resoio/launcher.py`) が `umu-run` (umu-launcher/Proton) で `RESONITE_EXE` (= `/opt/resonite/Resonite.exe`) を起動する。初回は GE-Proton の DL でも時間がかかる。 +devcontainer 内で Resonite を直接起動できる。ro bind の `/resonite` から書込可能な `/opt/resonite` への rsync は `.devcontainer/entrypoint.sh` が container 起動時に行う (初回は install コピー、2 回目以降は差分のみ)。`resoio launch` (`python/src/resoio/launcher.py`) が `umu-run` (umu-launcher/Proton) で `RESONITE_EXE` (= `/opt/resonite/Resonite.exe`) を起動する。GE-Proton はバージョン固定で image に prefetch 済み (`PROTONPATH=/opt/proton/GE-Proton10-34`) なので起動時の Proton DL は発生しない。初回は install コピー (~2GB) で時間がかかる。 起動・停止は以下: diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index def7eb3..97e44b6 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -129,6 +129,24 @@ RUN set -eux; \ apt-get install -y --no-install-recommends ./*.deb; \ rm -rf /var/lib/apt/lists/* /tmp/*.deb +# GE-Proton をバージョン固定で prefetch して image に焼き込む。 +# umu は PROTONPATH が未取得の論理名 (例: GE-Proton) だと GitHub Releases から +# 自動取得するが、この自動 DL が不安定 (現状エラー) かつバージョンが固定できない。 +# 代わりに /opt/proton 配下へ展開し、PROTONPATH をその絶対パスに向けることで +# 自動 DL を完全にバイパスしつつバージョンを固定する。sha512 で完全性を検証する。 +# /opt/proton は root 所有・読取専用で良い (Proton は PROTONPATH には書かず、 +# 書き込みは WINEPREFIX/compatdata 側に行く)。 +ARG GE_PROTON_VERSION=GE-Proton10-34 +RUN set -eux; \ + cd /tmp; \ + base="https://github.com/GloriousEggroll/proton-ge-custom/releases/download/${GE_PROTON_VERSION}"; \ + curl -fsSL -O "${base}/${GE_PROTON_VERSION}.tar.gz"; \ + curl -fsSL -O "${base}/${GE_PROTON_VERSION}.sha512sum"; \ + sha512sum -c "${GE_PROTON_VERSION}.sha512sum"; \ + install -d /opt/proton; \ + tar -xzf "${GE_PROTON_VERSION}.tar.gz" -C /opt/proton; \ + rm -f "${GE_PROTON_VERSION}.tar.gz" "${GE_PROTON_VERSION}.sha512sum" + # debian 13 の /etc/bash.bashrc は bash-completion ローダ部がコメントアウトされて # おり、`docker exec dev bash` は非 login 対話 shell で /etc/profile.d/bash_completion.sh # も読まれないため、明示的にローダ呼び出しを追記する。 @@ -183,14 +201,15 @@ RUN chmod +x /usr/local/bin/entrypoint.sh USER dev WORKDIR /workspace -# umu 用 ENV。WINEPREFIX / Proton / アセットキャッシュはすべて named volume で永続化。 +# umu 用 ENV。WINEPREFIX / アセットキャッシュは named volume で永続化。 # GAMEID=umu-default: umu DB 未登録ゲーム向けの汎用 ID。 -# PROTONPATH=GE-Proton: GE-Proton を使うことで起動時スプラッシュロゴの描画崩れを回避 -# (Valve Proton では Unity テクスチャがカラーバー表示になる問題がある)。 -# umu が GitHub Releases から最新版を自動取得し ~/.local/share/Steam/compatibilitytools.d に展開する。 +# PROTONPATH=/opt/proton/GE-Proton10-34: GE-Proton を使うことで起動時スプラッシュロゴの +# 描画崩れを回避する (Valve Proton では Unity テクスチャがカラーバー表示になる)。 +# 論理名ではなく上で prefetch した絶対パスを指すことで umu の自動 DL をバイパスし +# バージョンを固定する。ARG GE_PROTON_VERSION を上げたらこのパスも追従させる。 ENV GAMEID=umu-default \ WINEPREFIX=/home/dev/prefix \ - PROTONPATH=GE-Proton + PROTONPATH=/opt/proton/GE-Proton10-34 # Claude Code / Codex CLI は公式 install.sh (native installer) で最新版を入れる。 # apt / npm 版ではなく standalone installer に揃える。どちらも $HOME/.local/bin に diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 88599f7..ec6ea24 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -141,8 +141,9 @@ not by `just`. Both launchers go through `resoio launch` (`python/src/resoio/launcher.py`), which starts Resonite via `umu-run` (umu-launcher / Proton). The read-only `/resonite` bind is synced into a writable `/opt/resonite` by `.devcontainer/entrypoint.sh` when the container starts; the first -container start pulls GE-Proton and copies the ~2 GB install, so it is slow; later starts sync -only deltas. +container start copies the ~2 GB install, so it is slow; later starts sync only deltas. GE-Proton +is pinned and prefetched into the image (`PROTONPATH=/opt/proton/GE-Proton10-34`), so no Proton +download happens at container start. - **`just resonite-launch --vanilla`** runs vanilla Resonite (`Resonite.exe -SkipIntroTutorial`) — handy for confirming the base game launches.