Migrate from the Charm plugin to the uv plugin¶
For charms that use uv, Charmcraft has a uv plugin. This guide shows how to migrate from the default Charm plugin to the uv plugin.
Migrating from the Charm plugin provides some benefits, notably not having to maintain a
separate requirements.txt file. For package management, uv is much faster than pip.
If the charm to be migrated does not currently use uv, refer to the uv documentation for instructions on how to use uv for a Python project.
Update the project file¶
The first step is to update the project file to include the correct parts definition.
Depending on the history of a specific charm, it may not have an explicitly-included
parts section determining how to build the charm. In this case, a parts section
can be created as follows:
parts:
my-charm: # This can be named anything you want
plugin: uv
source: .
Include charm library dependencies¶
Unlike the Charm plugin, the uv plugin does not install the dependencies for
included charmlibs. If any of the charm libraries used have PYDEPS, these will
need to be added to the charm’s dependencies, potentially as their own
dependency group.
To find these dependencies, check each loaded library file for its PYDEPS by running
the following command at the root of the charm project:
find lib -name "*.py" -exec awk '/PYDEPS = \[/,/\]/' {} +
Next, in pyproject.toml, list them in a charmlibs dependency group.
[dependency-groups]
# Dependencies brought from libraries the charm uses.
charmlibs = [
"cosl",
"pydantic",
"cryptography",
"ops>=2.0.0",
]
Add dependency groups¶
If the charm has dependency groups that should be included when creating the virtual
environment, such as one for charm libraries, the
uv plugin’s uv-groups key can be set to include them:
parts:
my-charm:
plugin: uv
source: .
uv-groups:
- charmlibs
Likewise, optional dependencies under the pyproject.toml key
project.optional-dependencies can be added with the uv-extras key.
Include extra files¶
The uv plugin only includes the contents of the src and lib directories
as well as the generated virtual environment. If other files were previously included
from the main directory, they can be included again using the
Dump plugin:
parts:
my-charm:
plugin: uv
source: .
uv-groups:
- charmlibs
version-file:
plugin: dump
source: .
stage:
- charm_version