テクノロジー · 実用ガイド

pipでwheel内に複数の.dist-info?環境削除より先にアーカイブを確認

検証対象は開こうとしているwheelです。正確なファイルを保存し、展開せずZIPの内容を一覧化して、別ダウンロードと比較します。

一つと複数のメタデータルート、インストール済み警告を区別する図。
オリジナル編集イラスト:環境を変える前にwheel ZIPを確認。 Watch at Ease

invalid wheel、multiple .dist-info directoriesというエラーでは、site-packagesを削除する前に該当wheelを確認する。現在のpipはZIP内のトップレベル名を集め、メタデータディレクトリーが複数あれば拒否する。インストール済み環境のinvalid distribution警告とは別の診断だ。

失敗ファイルと実行環境を保存

エラー全文、.whl名、要求パッケージと版、Python実行ファイル、python -m pip --versionを記録する。インデックス、直URL、ローカルwheelhouse、ソースビルドのどれかも残す。直接指定したパッケージでなく依存先が失敗している場合がある。

環境外にコピーを保存し、python -m pip hashと引用符付きパスでSHA-256を記録する。共有ログから認証情報を除く。同じ名前でもミラー、キャッシュ、上流の内容が同じとは限らない。

展開せずZIPを一覧表示

python -m zipfile -lに引用符付きwheelパスを渡す。各メンバーの先頭要素を調べ、.dist-infoで終わる異なるルート名を数える。同じメタデータディレクトリー内の複数ファイルは正常で、異なる複数ルートが調査対象だ。一覧とハッシュを残す。

任意のpython -m zipfile -tはZIP整合性を調べる。CRC・ヘッダーが正常でもpipの構造検証、発行者の真正性、全RECORDハッシュを証明しない。読めないZIPは先にファイル自体を調べ、site-packagesへ直接展開して回避しない。

別取得のwheelと比較

同じインタープリターと承認済みインデックスを使い、空の比較先へpython -m pip download --no-deps --only-binary=:all: --no-cache-dir --dest wheel-checkに正確な引用符付き要件を続ける。互換wheelをダウンロードするだけで、存在しなければ失敗する。無関係な過去の版をコピーしない。

名前、ハッシュ、メタデータルートを比較する。同じ壊れた内容なら全キャッシュ削除でも上流は直らない。違えば経路、ミラー、ビルド出力、選択ファイルを調べる。ハッシュ差だけでどちらが真正かは判断できない。

版の選択を直しアプリを検証

再現する公開wheelの問題は保守者へ、版、名前、認証情報を除いた取得元、ハッシュ、一覧、Python/pip情報を報告する。依存要件を確認し修正版や互換制約を選ぶ。ソースビルドは別のツールチェーン作業だ。

ZIPから一つの.dist-infoを消して元の配布物を装わない。メタデータとRECORDは連動し、入力wheel不良だけで既存メタデータを消す理由もない。使い捨て環境で実際のrequirementsを使い、python -m pip checkとアプリの基本動作を確認する。解決成功はアプリ互換性の証明ではない。

ファイル保存、別取得比較、代替検証の図。
オリジナル編集イラスト:保存、比較、実アプリ検証の順序。 Watch at Ease