
2026/07/29 4:41
Uv 0.12.0
RSS: https://news.ycombinator.com/rss
要約▶
日本語翻訳:
最新の uv リリース(バージョン 0.12.0)には、安全性および仕様に準拠するための重要な更新が含まれていますが、直ちに対応を要する大規模な互換性のない変更も伴います。
uv init で作成されるプロジェクトはデフォルトとして uv_build システムを使用したパッケージ化されたレイアウトを採用し、以前の非パッケージ化スタイルを使用したい場合は uv init --no-package を使用してください。また、本ツールはセキュリティ基準を厳格化するため、ホイール用の非 .tar.gz ソースアーカイブおよび bzip2、LZMA、XZ などのレガシー圧縮フォーマットを拒否します。この変更は、MD5 などの弱いたんじゅりアルゴリズムから離れ、大文字小文字区別のない予約済みインタプリタ名によるシステムエラーを防ぐことにより、現代的な Python パッケージングのベストプラクティスと一致するものです。
互換性を維持するためには、開発者がプロジェクトを調整して新しいデフォルトのパッケージ化されたレイアウトを採用するか、
--no-package フラグを使用して明示的にそれを無効にする必要があります。依存関係を管理するチームは、ソース配布物を安全な .tar.gz ファイルのみを受け入れるように再構築し、ホイールのエントリが承認された圧縮手法(stored、DEFLATE、zstd)を使用していることを確認する必要があります。セキュリティ意識の高いユーザーも、pylock.toml ファイルの構成更新や信頼ルートに関連する CLI フラグ(例:提供された場合にシステム証明書に置き換わる --cert フラグ)の変更を含む移行タスクに対処する必要があります。これらの変更は、厳格なハッシュチェックと高度なセキュリティへのより広い業界トレンドを反映しており、将来の Python パッケージングエコシステムが脆弱性に耐性を持ちながら、公式の基準に正確に準拠することを保証しています。本文
uv 0.12 リリースノート(破壊的変更を含む)
2026 年 7 月 28 日リリースの uv 0.12.0。前回の 0.11.0 から蓄積した変更により、以下の項目が**「破壊的変更」**として标记されています。
多くのユーザーは追加の変更なしにアップグレード可能ですが、
uv_build ビルドバックエンド構成には制限があります。
- [build-system] テーブルに
の上限バージョンが含まれている場合、uv_build
として0.12 を許可するように更新してください。uv_build>=0.11.32,<0.13
主要な破壊的変更
1. uv init
でデフォルトでビルドシステムを定義
uv init- 以前:
はuv init example
なし(非パッケージ化)で作成。依存関係は宣言できず、仮想環境にインストールされなかった。[build-system] - 今: 作成時に**
を定義**([build-system]
使用)。uv_build- アプリケーションソースコードは
に配置される。src/example
エントリが追加され、コマンドとして実行可能になる。[project.scripts]
- アプリケーションソースコードは
- 影響: テストや他のコードからインポート・インストールが可能になる。
$ uv init example $ cd example $ uv run example Hello from example! - 既存プロジェクトへの影響: ありません。非パッケージ化レイアウトを維持するには
を使用してください。uv init --no-package example
2. 非対応のソース配布物およびホイールアーカイブ形式を拒否
/.tar.bz2
の廃止: PEP 625 に準拠し、.tar.xz
アーカイブのみを受け入れます。.tar.gz- ホイール形式の制限: bzip2/LZMA/XZ 圧縮されたエントリは拒否されます。stored / DEFLATE / zstd のみ許可されます。
ソース配布物: レガシー互換のため、引き続きサポートされています(ただし上記アーカイブ形式の制限には注意)。.zip- 対応策: 既存ロックファイルにレガシー形式が含まれている場合、
アーカイブとして再構築し、ロックファイルを再生成してください。.tar.gz
3. Python インタープリターを置き換える可能性のあるホイールファイルを受け付けない
- 拒否対象:
(大文字小文字区別がない場合)、Python
、python.py
など、予約されたインタプリタ名のケース不感変種。Python.exe
や.data/scripts
などに配置し、エントリーポイントチェックを回避するファイル。.data/data/bin/python
- 理由: macOS/Windows などで仮想環境のインタプリタを上書きするリスクがあるため。
- 対応策: 競合するエントリーポイントを改名し、影響を受けたホイールを再構築してください。
4. プレリリースにフォールバックする前に安定版リリースを優先
- 新しいデフォルトモード (
):if-necessary- まず**安定版(Stable)**を試み、制約を満たさなければプレリリースにフォールバックします。
- 以前は
で、直接要件か明示的でない限りプレリリースを許可せず、依存関係グラフ全体でのプレリリース許可が必要でした。if-necessary-or-explicit
- 注意: パッケージ両方の候補がある場合でも、バージョン選択が以前の uv と異なる可能性があります。
- フラグ:
: 自動的なプレリリース選択を無効化。--prerelease disallow
: プレリリースを優先(安定版は除外)。--prerelease allow
: 明示的に言及されたプレリリースのみ許可。--prerelease explicit
5. requirements.txt
内の --require-hashes
指令を尊重
requirements.txt--require-hashes- 以前: 警告は出てもハッシュチェックを行わずインストールしていました。
- 今: コマンドラインの
を渡した場合と同じように、ファイル内の指令を強制します。--require-hashes - 非対応例:
# ハッシュ化されていない要件は無効化されます some-package>=1.0.0 - 対応策: 全要件を
で固定しハッシュを提供するか、==
を削除してください。--require-hashes
6. ハッシュチェックモードで MD5 単体のハッシュを拒否
- 理由: MD5 は衝突に耐性がないため、ハッシュ検証が必要なセキュリティ上リスクが高い。
- 今:
モードでは、SHA-256 など少なくとも 1 つの安全なダイジェストが必要です。MD5 単体は拒否されます。--require-hashes# SHA-256 などの安全なハッシュがないと拒否されます anyio==4.0.0 --hash=md5:420d85e19168705cdf0223621b18831a - 対応策: SHA-256 などを使用して影響を受けるハッシュを再生成してください。
7. pylock.toml
ファイルおよびアーティファクトの無効なものを拒否
pylock.toml- パッケージ配列必須: 欠落した配列は空のロックファイルとして解釈されず、エラーになります。明示的に
は有効です。packages = [] - ファイル名形式:
または単一名称バリアント(例:pylock.toml
)のみ許可。pylock.dev.toml
など複合名称は拒否されます。pylock..toml - サイズ整合性: アーティファクトがサイズを宣言している場合、ダウンロード済みアーティファクトと一致する必要があります。
8. 証明書が読み込めない場合でも明示的な証明書オーバライドを尊重
- 以前:
/SSL_CERT_FILE
が無効な場合、デフォルトルートにフォールバックしました。SSL_CERT_DIR - 今: 非空の値(有効か無効かを問わず)は常にデフォルト証明書ルートを置き換えます。無効なパスが指定されていると HTTPS リクエストは失敗します。
- 対応策: 証明書を修正するか、環境変数を未設定に戻してください。
9. uv pip
で pip 互換の --cert
ハンドリングをサポート
uv pip--cert- 新機能:
がサポートされました。uv pip install --cert <path> - 動作: 提供された PEM バンドルが他のすべての証明書ソース(システム、
など)を置き換えます。SSL_CERT_FILE - 対象:
コマンドのみ。uv pip
10. uv run
に渡されたスクリプトに対してプロジェクトを相対的に発見する
uv run- 以前: 現在のディレクトリからプロジェクトを発見しました。
- 今: スクリプトのディレクトリからプロジェクト/ワークスペースを発見します。
# other-project ディレクトリから検索し、その依存関係を使用します $ uv run other-project/script.py - オプトアウト: 明示的に
を使用してください。uv run --project . script.py
11. 仮想環境ではないディレクトリをクリアする前に --force
を必要とする
--force- 以前:
は警告を出しつつも、仮想環境でなくても削除しました。uv venv --clear - 今: 仮想環境でないディレクトリのクリアは拒否されます。
- 対応策:
のようにuv venv --clear --force ./not-a-virtualenv
を指定してください。--force
12. プロジェクトを初期化する際に --project
を拒否
--project- エラー化:
は即座に失敗します(新しいプロジェクト作成には不要)。uv init --project example - 正しい使い方:
- 新規作成:
uv init example - パス変更:
uv init --directory example
- 新規作成:
13. 欠落しているか無効な --project
パスを拒否
--project- 以前: 警告は出しましたが、実行を試みました(後続エラーの原因)。
- 今:
は即座に失敗します。uv run --project missing python - 対応策: ディレクトリを先に作成するか、既存のプロジェクトを選択してください。
14. 公開時に正規化されていないファイル名を持つ配布物をスキップする
- 要件: ホイール/ソース配布物のファイル名は正規化されたパッケージ名・バージョンを使用する必要があります。
- ✅
(1.1.0 へ正規化)example-1.1.0-py3-none-any.whl - ❌
(そのまま)example-1.01.0-py3-none-any.whl
- ✅
- 対応策: 影響を受ける配布物をスキップし、正規化されたファイル名を持つものを再構築してください。
15. パスに基づいて base
および root
と命名された Conda 環境を分類する
baseroot- 変更:
やbase
という名前が Conda 子環境としても認識されます(以前は常に基本環境と判断)。root - オプトアウト: 明示的なインタプリタ指定(
)で回避可能。--python /path/to/python
16. 環境発見中に壊れた .venv
シンケリンクを拒否する
.venv- 以前: 壊れたリンクを無視し、親ディレクトリの環境を検索しました。
- 今: 壊れたリンクで即座に停止し、正確なパスを報告します。エラー(権限失敗など)も即座に報告されます。
- 対応策: 壊れた
リンクを修復/削除し、権限問題を修正してください。.venv
17. 明示的にアップグレードする代わりに一致するインストールされた Python パッチバージョンを再インストールする
- 変更:
は、最新のパッチリリースを取得せず、既存の一致するパッチバージョンを再インストールします。uv python install 3.12 --reinstall- 例:
と3.12.6
があれば、両方を再インストール。3.12.7
- 例:
- 対応策: 最新のアップグレード動作に戻すには
を使用してください。uv python install 3.12 --upgrade
18. 既存の依存関係グループを名付けるために --upgrade-group
を必要とする
--upgrade-group- 変更:
が、ドキュメントグループが存在しない場合でも成功するのをやめました。検証を行います。uv lock --upgrade-group docs - 対応策: グループ名を修正するか、
に追加してください。[dependency-groups]
19. --directory
に対して相対的なインデックスおよび find-links を解決する
--directory- 以前: コマンドラインの相対パスは元の作業ディレクトリに対して解決されました。
- 今:
/--index
の相対パスは、--find-links
で指定されたディレクトリに対して解決されます。--directory# プロジェクトディレクトリ内から ./packages を参照 $ uv add --directory project --index ./packages example
20. uv add
に提供された絶対パスを保存する
uv add- 変更:
/pyproject.toml
に絶対パスまたはuv.lock
URL そのまま記録されます。相対パスへの自動変換は廃止されました。file://$ uv add ../library # 相対パスのまま $ uv add /projects/library # 絶対パスのまま - 推奨: ポータビリティのために相対パスを使用してください。
21. bzip2 アーカイブのみで入手可能な古い PyPy 配布物を削除する
- 対応策:
では、gzip 圧縮アーカイブとしての最新 PyPy リリースのみが利用可能です。bzip2 専用リリースは除外されます。uv python install
22. 注釈が無効化されているときに除外されたパッケージのコメントを省略する
- 変更:
を使用すると、除外パッケージのフッターコメントも省略されます。uv pip compile --no-annotate
アテステーションについて
このリリースのアーティファクトには、GitHub Artifact Attestations が付与されています。
- GitHub CLI を使用して検証可能。
- GitHub からアテステーションをダウンロードして直接検証も可能です。