Tasuke HubLearn · Solve · Grow
#Python

Astral製uvとtyでPythonワークフローを再設計する

依存管理・ツールチェーンを高速化するuvと、クロスプラットフォームのシェル自動化を行うtyの使い方をまとめます。

時計のアイコン23 November, 2025
TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

uv と ty を導入する理由

  • pip + virtualenv + pip-tools を組み合わせた従来構成より、uvは依存解決・ビルド・実行を一体化し高速。
  • プロジェクトルートが多くても uv tool run で即座にCLIを呼び出せるため、CI/CDでも再現性が高い。
  • tyはシェルスクリプトを型安全に記述でき、Python/Node/Goなど異なるツールチェーンを統一したコマンドで呼び出せる。
  • Astral製ツールはモノリポやLLMパイプラインなど、規模が大きいプロジェクトでも乱雑になりがちなMakefilepipenvを置き換えられる。
ベストマッチ

最短で課題解決する一冊

この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。

uv の基本セットアップ

curl -LsSf https://astral.sh/uv/install.sh | sh

~/.local/bin にインストールされるので、PATHを通す。uv --version で確認。

プロジェクト初期化

uv init my-app
cd my-app
uv add fastapi uvicorn[standard]

uv init は仮想環境と pyproject.toml をまとめて生成。uv add は解決した依存を uv.lock に書き込み、uv pip sync で再現可能。

スクリプトの実行とタスク管理

# pyproject.toml
[tool.uv.scripts]
lint = "ruff check ."
serve = "fastapi dev app.py"
uv run lint
uv run serve

uv run は仮想環境作成不要でスクリプトを実行。CIでは uv python で指定バージョンのPythonを取得できる。

uvx でCLIを即利用

uvx ruff check src/
uvx mypy src/

uvxnpm npxのようなワンショット実行。ローカルにインストールせず最新バージョンを取得し、多数の補助ツールを気軽に呼び出せる。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

ty でコマンドランナーを型安全に

tyはTypeScript風の構文でシェルタスクを記述し、環境変数/依存ツールを明示的に宣言できる。

インストール

curl -LsSf https://astral.sh/ty/install.sh | sh

基本的な ty ファイル

// ty.ts
import { task, exec } from 'ty'</pre>

task('lint', async () => {
  await exec`uvx ruff check src/`;
  await exec`uvx mypy src/`;
});

task('serve', async () => {
  await exec`uv run fastapi dev app.py`;
});

export const defaultTask = 'lint';

実行:

ty lint

TypeScriptベースなので、エディタ補完や型チェックでコマンド間違いを防げる。task('deploy', { env: { ENV: 'prod' } }, ...) のように環境変数も型安全に設定可能。

並列実行と依存関係

task('test', async ({ run }) => {
  await run(['fmt', 'lint']);
});

run に配列を渡すと並列、await run('lint') で逐次実行。複雑なCIパイプラインを簡潔にモデル化できる。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

uv + ty の組み合わせ

  1. uv でPython依存を固定、uvx でToolingを呼び出す。
  2. ty のタスクから uv runuvx を呼ぶことで、チーム全員が同じCLIを利用する。

例: ドキュメント生成+テスト+デプロイを一気通貫で管理。

task('docs', async () => {
  await exec`uv run mkdocs build`;
});

task('e2e', async () => {
  await exec`uv run pytest tests/e2e -n auto`;
});

export const defaultTask = 'docs';

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

CI/CD への適用例

name: ci
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: astral-sh/setup-uv@v1
      - uses: astral-sh/setup-ty@v1
      - run: ty lint
      - run: ty e2e

GitHub Actionsで公式アクションを使えば、環境準備は数秒。uv lockをキャッシュして再現性を高める。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

運用ベストプラクティス

  • uv.lockをリポジトリにコミットし、依存を固定。
  • ty ファイルでタスク名を明確にし、READMEに一覧を載せる。
  • 開発者マシンでもCIでも同じtyコマンドを叩けば動く状態を保つ。
  • LLMやデータパイプラインの補助CLI(sqlfluff, duckdb, langchain-cliなど)は uvx でその場実行し、ごみが残らない構成にする。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

まとめ

Astralのuvtyを導入すると、Pythonプロジェクトの依存管理とタスク実行を一貫したインターフェースで扱えます。特にLLMやデータ系プロジェクトではCLIの乱立や仮想環境の重複が生産性を下げる原因になりがちです。まずはuv inittyファイルをプロジェクトに追加し、uvxで補助ツールを呼び出すワークフローに切り替えてみてください。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

この記事をシェア

続けて読みたい記事

編集部がピックアップした関連記事で学びを広げましょう。

#Python

RyeユーザーはuvへGO!Astral公式が推奨する次世代Pythonワークフロー移行術

2025/11/26
#Python

型安全PythonでAIコードベースを堅牢化する実装ガイド

2025/11/23
#Git

Git/GitHub超入門【2025年版】:最小のワークフローで始める

2025/9/13
#Python

pipの100倍速い!Rust製Pythonパッケージマネージャー「uv」で開発効率を最大化

2025/11/26
#Image Optimization

画像ワークフロー実践【2025年版】:アップロード署名・Moderation・CDN署名URLまで

2025/9/13
#Python

Pythonで株式投資分析!yfinance × pandas × pandas-taで実践するテクニカル分析入門

2025/11/26