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を指定しなくても同じで この部分があっても無くても動作は同じです。
