uvでPythonのプロジェクトを管理する際に、
パッケージの依存関係でextrasなパッケージをoptional-dependencies
で指定することができます。
それらのパッケージはuv sync
ではインストールされないので、
uvの環境でインストールしたい場合は
uv sync --extra <EXTRA>
でインストールするか、
dependency-groups
で設定してインストールできるようにしておく必要があります。
ただdependency-groups
で指定する場合、
そのまま同じパッケージを追加するとバージョンなどを複数の箇所に書くことになり
管理が面倒になります。
そのような重複を避けて書く方法について。
- optional-dependenciesでのextraパッケージの指定
uv sync
でextraパッケージをインストールする方法- 自己参照して重複無く書く方法
- gitの管理などに関してtool.uv.sourrcesを使う
optional-dependenciesでのextraパッケージの指定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
こんな感じのpyproject.tomlがあったとします。
何もない状態から
1 2 3 |
|
のようにパッケージを加えた状態です。
このパッケージはpip
などでインストールする際に、my-example-package
とだけ指定すると
numpy
だけインストールされ、pandas
はインストールされません。
my-example-package[data]
と指定することで、pandas
もインストールされます。
これらの場合はpytest
はインストールされません。
一方、uv sync
ではpytest
はインストールされますがpandas
はインストールされません。
uv sync --extra data
、もしくはuv sync --all-extras
とすることで、pandas
もインストールされます。
Extraなパッケージは重いライブラリだったりで、 不要な時はインストールしないで済むようにするための仕組みです。
uv sync
でextraパッケージをインストールする方法
一方、このパッケージを開発する際にはpandas
も必要になることが多いので
それも含めた仮想環境を作っておきたいことが多いです。
その場合に上記のようにオプション追加でインストールするのは面倒なので、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
のような感じでdev
グループにpandas
を追加しておけばuv sync
でもインストールされます。
1
|
|
で追加することも出来ます。
または、pandas
がインストールされてない環境も簡単にチェックしたい場合、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
のように、別途others
グループを作ってそこにpandas
を追加し、
tool.uv
でdefault-groups
に追加指定しておく方法もあります1
コマンドで追加する場合は
1
|
|
でパッケージ追加出来ます。
too.uv
の設定は手動で追加する必要があります。
こちらでもuv sync
でpandas
がインストールされるようになりますし、
uv sync --no-group others
とすることで、pandas
がインストールされてない環境を作ることが出来ます。
分かりやすいように名前を変えましたがgroupの方もdata
としても大丈夫です。(optional-dependencies
のextra名とは独立しています。)
ただこの場合、pandas>=2.3.2
が重複していて、特にバージョンを変えたい場合などに
2箇所を変えないといけないのでちょっと面倒です。
自己参照して重複無く書く方法
そこで、これを以下のように書き直すことが出来ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
others
のグループに、自分自身のmy-example-package
をdata
のextra付きで指定しています。
1
|
|
のようにコマンドで追加することも出来ます 2。
これで、uv sync
でpandas
がインストールされるようになり、
また、pandas
のバージョン指定はoptional-dependencies
の方で一箇所だけ書けば良くなります。
このような重複の削除は、バージョン指定以外にも、特にGitHubにあるレポジトリをgitで指定する場合などに便利です。
1 2 3 4 |
|
みたいな感じで指定するのをgroupsの方でも同様に指定する代わりにまとめてmy-example-package[data]
を指定するだけで
良くなるのでだいぶ楽になります。
この方法は循環参照になってしまう感じのする書き方ですが、意図したとおりに動作しますし、 uvの開発者の方が紹介している方法になります。
もしかすると今後のアップデートでまた違った書き方が出来るようになったり推奨されたりするかもしれませんが、 現状ではこの方法が一番便利な方法かな、と思ってます。
gitの管理などに関してtool.uv.sourrcesを使う
上では直接dependencies
の中にGitのURLを入れましたが、
1
|
|
のようにコマンドで追加すれば、 以下のような感じになるはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
uv.sources
にGitの情報等とともにinherit-docstring
が追加されているのが分かります。
このような形であれば、例えばpandasなしなら、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
のようにパッケージ名を直接書いても良いかもしれません。 こちらの方が循環参照っぽい気持ち悪さも無いので。
ただ、data
としてまとめたいものが複数ある場合などは
自己参照を使った方法の方がまとめて出来て分かりやすいとは思います。
また、こちらはuvの機能としてなので、 仮にこのpyproject.tomlを別の管理ツールで使いたいということがある場合などは こちらの方法だと理解されない可能性もあります。
そういった意味でも先の方法をまず考えた方が良いかな、と思います。
-
default-groups
はデフォルトではdev
のみが指定されている状態です。 ↩ -
この場合、
1 2
[tool.uv.sources] my-example-package = { workspace = true }
が追加で加えられます。
Workspaceの指定はサブディレクトリなどに別のプロジェクトを置いて参照したりする場合に 使ったりするものですが、 この場合は自分自身への参照なので
workwpace = true
を指定しなくても同じで この部分があっても無くても動作は同じです。