Skip to main content

Pack charms with local Python package dependencies

Project description

charmcraftlocal

Pack charms with local Python package dependencies

Installation

Install pipx: https://pipx.pypa.io/stable/installation/

pipx install charmcraftlocal

Usage

At the moment, only charms that manage Python dependencies with Poetry are supported.

Example directory layout

common/
    # Local Python package with shared code
    pyproject.toml
    common/
        __init__.py
kubernetes/
    charmcraft.yaml
    pyproject.toml
    poetry.lock
    # [...]
machines/
    charmcraft.yaml
    pyproject.toml
    poetry.lock
    # [...]
Example common/pyproject.toml
[project]
name = "common"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = [
]

[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"

Step 1: Add local package to charm dependencies

Repeat this step for each charm that depends on the local package.

poetry add ../common --editable

Example pyproject.toml

[tool.poetry.dependencies]
common = {path = "../common", develop = true}

Step 2: Install charmcraftlocal in charmcraft.yaml

Install charmcraftlocal in the poetry-deps charmcraft.yaml part.

Example charmcraft.yaml

parts:
  poetry-deps:
    plugin: nil
    override-build: |
      # [...]
      "$HOME/.local/bin/uv" tool install --no-python-downloads charmcraftlocal

To install with pipx instead of uv, use pipx install charmcraftlocal

Step 3: Call charmcraftlocal in charmcraft.yaml

Run charmcraftlocal update-lock before poetry export runs in the charmcraft.yaml part with plugin: poetry

Example charmcraft.yaml

parts:
  # [...]
  charm-poetry:
    plugin: poetry
    after:
      - poetry-deps
    override-build: |
      # [...]
      "$HOME/.local/bin/charmcraftlocal" update-lock -v

      craftctl default
      # [...]

Step 4: Pack charm

ccl pack

How it works

Currently, during charmcraft pack, charmcraft can only access files in the directory that contains charmcraft.yaml.

charmcraftlocal pack

  • searches (the charm's) pyproject.toml for local Python dependencies,
  • copies them to the charm directory,
  • and calls charmcraft pack

charmcraftlocal update-lock (called by charmcraft pack)

  • searches (the charm's) pyproject.toml for local Python dependencies
  • and calls Poetry to update pyproject.toml and poetry.lock to reference the copied package(s)

Why does charmcraftlocal need to be called in charmcraft.yaml?

In the first prototype of charmcraftlocal

  • only ccl pack needed to be called,
  • ccl pack called Poetry to update pyproject.toml and poetry.lock,
  • and ccl update-lock did not exist

The design was changed to maintain compatibility with tooling that expects

  • one charm per git repository,
  • charmcraft.yaml located at the root of the git repository,
  • and charmcraft pack to successfully build the charm

To maintain compatibility with that tooling, the ccl mirror command automates the creation and updates of "mirror" git repositories that meet the above requirements.

For example, for a git repository with this directory layout

common/
    # Local Python package with shared code
    pyproject.toml
    common/
        __init__.py
kubernetes/
    charmcraft.yaml
    pyproject.toml
    poetry.lock
    # [...]
machines/
    charmcraft.yaml
    pyproject.toml
    poetry.lock
    # [...]

ccl mirror can be used to create two "mirror" repositories—

one for kubernetes

common/
    # Local Python package with shared code
    pyproject.toml
    common/
        __init__.py
charmcraft.yaml
pyproject.toml
poetry.lock
# [...]

and one for machines

common/
    # Local Python package with shared code
    pyproject.toml
    common/
        __init__.py
charmcraft.yaml
pyproject.toml
poetry.lock
# [...]

git-filter-repo is used to create these "mirror" repositories. In order to preserve commit history while avoiding merge conflicts, pyproject.toml and poetry.lock must not be modified between the source repository and the "mirror" repositories.

Therefore, pyproject.toml and poetry.lock are modified at build time by calling ccl update-lock in charmcraft.yaml. (This approach enables the "mirror" repositories to be successfully built with charmcraft pack.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

charmcraftlocal-0.3.4.tar.gz (10.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

charmcraftlocal-0.3.4-py3-none-any.whl (12.0 kB view details)

Uploaded Python 3

File details

Details for the file charmcraftlocal-0.3.4.tar.gz.

File metadata

  • Download URL: charmcraftlocal-0.3.4.tar.gz
  • Upload date:
  • Size: 10.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for charmcraftlocal-0.3.4.tar.gz
Algorithm Hash digest
SHA256 9a92eb2dda3b90ae101e77577d176eadad61fdd7a75930c6ff5b9a1d38a71716
MD5 adf3462b56cfe9f166efdafa16b91324
BLAKE2b-256 7a874130485be7c0a56ffddeedc0a93249907fb823868130ceb3407ff51fb582

See more details on using hashes here.

Provenance

The following attestation bundles were made for charmcraftlocal-0.3.4.tar.gz:

Publisher: release.yaml on canonical/charmcraftlocal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file charmcraftlocal-0.3.4-py3-none-any.whl.

File metadata

File hashes

Hashes for charmcraftlocal-0.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 5447a25aff3ca35efddbe6b16567c5c52289a6bb276c3a436dfe83a03ac87b99
MD5 b92e8b5e596ec74262ee3587cfc54b02
BLAKE2b-256 06e3b7af5b5275ce1f4b1607c31ac6bd98566f692990d8d30b0c5c95b1df5a21

See more details on using hashes here.

Provenance

The following attestation bundles were made for charmcraftlocal-0.3.4-py3-none-any.whl:

Publisher: release.yaml on canonical/charmcraftlocal

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page