Skip to content

feat(renderer): インストール不可の理由を一覧に出す - #2479

Open
hal-shu-sato wants to merge 4 commits into
mainfrom
claude/why-not-installable
Open

feat(renderer): インストール不可の理由を一覧に出す#2479
hal-shu-sato wants to merge 4 commits into
mainfrom
claude/why-not-installable

Conversation

@hal-shu-sato

@hal-shu-sato hal-shu-sato commented Aug 29, 2026

Copy link
Copy Markdown
Member

実際にアプリを起動して見つけたものです。素のインストール先でプラグイン&スクリプトタブを開くと、理由の書かれていない黄色い「インストール不可」が並びます。 実データで数えると 294 行中 57 件が該当します。

なぜ理由が出ないのか

理由になる情報は computeInstallable が計算しているのに、結果を捨てています。

doNotInstall は boolean 1 個です。そして「要導入: 〜」を作る missingDeps

if (thisPackage && isInstalled(id)) {

の中でしか動かないので、まだ導入していないパッケージには足りないものが構造上いっさい表示されません。 初回のユーザーが最初に開く画面で、いちばん目立つ色の警告に、いちばん情報が無いという状態です。

この PR でやること

computeInstallableisDepsInstallable同じ式で、満たせなかった依存グループだけを unmetDependencies に残します。導入済みかどうかは問いません。競合が理由のときは空になります(依存の問題ではないため)。

const unmetDeps = (id: string): string[] => {
  const thisPackage = packages.filter((p) => p.id === id).find(() => true);
  if (!thisPackage) return [];
  return (thisPackage.info.dependencies ?? []).filter(
    (orOfID) => !orOfID.split('|').some((id2) => isInstallable(id2)),
  );
};

表示は「インストール不可」の下に 1 行足すだけです。

インストール不可
要: 拡張編集 0.93rc1、rikkymodule(version2)

名前解決は packageDisplay.ts(fs 非依存)に置きました。aviutl / exedit は一覧に無い擬似 ID なので手で組み立て、>=1.0 のようなバージョン指定は落とします。

実データでの結果

パッケージ版を起動して 57 件すべてに理由が出ることを確認しました。

Aulsプラグインforaviutl110  || インストール不可 要: 拡張編集 0.93rc1、rikkymodule(version2)
Aulsメモリ参照プラグイン      || インストール不可 要: 拡張編集 0.92
AviUtl効率化 パッケージセット || インストール不可 要: 最終フレーム自動調整、フィルタドラッグ移動、エディットボックス最適化、アイテム内音声波形
patch.aul                 || インストール不可 要: AviUtl 1.10、拡張編集 0.92

パッケージ名も解決されていて(rikkymodule / 最終フレーム自動調整 など)、擬似 ID は「拡張編集 0.92」「AviUtl 1.10」として出ます。

検証

  • yarn test 333 件(+8)緑。未導入でも理由が埋まること/満たせている依存は入らないこと/競合のときは空になること/擬似 ID と or 指定の名前解決
  • yarn lint / yarn lint:ts
  • yarn packageyarn test:e2e(7 件)緑

追記: 競合と別バージョンも理由に出すようにしました

依存だけだと、競合が理由のときは理由が空のままでした(unmetDependencies は依存の話しか持たないため)。conflictsInstalled と同じ式で、実際に成立している競合を conflictingWith に残し、installationStatusotherInstalled のときは「別のバージョンが導入済み」と書きます。

これで**「インストール不可」が理由を持たない経路が無くなりました。**

実データで確認(patch.aul を手動導入した状態):

アルティメットプラグイン || インストール不可
                          要: AviUtl 1.10、拡張編集 0.92
                          競合: patch.aul

表示名が重複したときは畳んでいます。ePi/patchnazono/patch はどちらも名前が「patch.aul」で、そのままだと「競合: patch.aul、patch.aul」になるためです。

副次的な効果

#1880(「Bakusoku 系と patch.aul は競合する」と書いてほしい)は、apm-data の conflicts に書くだけで済むようになります。 apm が自動で「インストール不可」にして、理由まで表示します。

テストは 336 件(+11)。

パッケージ一覧の「インストール不可」は boolean 1 個で、何が足りないのかを
持っていない。理由になる依存関係は computeInstallable が計算しているのに、
結果を捨てている。

「要導入: 〜」を作る missingDeps は if (thisPackage && isInstalled(id)) の
中でしか動かないので、**まだ導入していないパッケージには足りないものが
構造上いっさい出ない**。初回起動でいちばん最初に開く画面に、理由の無い
警告だけが並ぶことになる。

computeInstallable の isDepsInstallable と同じ式で、満たせなかった依存
グループだけを unmetDependencies に残す。導入済みかどうかは問わない。
競合が理由のときは空になる(依存の問題ではないため)。

表示用の名前解決は packageDisplay へ。aviutl / exedit の擬似 ID は一覧に
無いので手で組み立てる。バージョン指定(>=1.0 など)は落とす。
「インストール不可」の下に「要: 拡張編集 0.92」のように並べる。
実データで 294 行中 57 件が該当し、すべてに理由が出ることを確認した。
導入前でも unmetDependencies が埋まること、満たせている依存は入らないこと、
競合が理由のときは空になることを見る。名前解決は擬似 ID と or 指定を押さえる。
依存だけでなく、doNotInstall のもう 1 つの理由も出す。competeInstallable の
conflictsInstalled と同じ式で、実際に成立している競合だけを conflictingWith
に残す。installationStatus が otherInstalled のときは「別のバージョンが
導入済み」と書く。

これで「インストール不可」が理由を持たない経路が無くなる。データ側で
conflicts を書けば apm が自動で不可にして理由まで出せるようになるので、
#1880(Bakusoku 系と patch.aul の競合を書いてほしい)はデータの修正だけで済む。

表示名が重複したら畳む。ePi/patch と nazono/patch はどちらも名前が
「patch.aul」で、そのままだと「競合: patch.aul、patch.aul」になる。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant