cibuildwheel
¶
cibuildwheel vereinfacht die Erstellung von Python Wheels für die verschiedenen Plattformen und Python-Versionen durch Continuous Integration (CI) Workflows. Genauer gesagt baut es Manylinux-, macOS 10.9+- und Windows-Wheels für CPython und PyPy mit GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, oder GitLab CI/CD.
Darüber hinaus bündelt es gemeinsam genutzte Bibliotheksabhängigkeiten unter Linux und macOS durch auditwheel und delocate.
Schließlich können die Tests auch gegen die Wheels laufen.
Um Linux-, macOS- und Windows-Wheels erstellen zu können, erstellt eine
.github/workflows/build_wheels.yml
-Datei in eurem GitHub Repo:
name: Build
on:
workflow_dispatch:
release:
types:
- published
workflow_dispatch
ermöglicht euch, in der grafischen Benutzeroberfläche auf eine Schaltfläche zu klicken, um einen Build auszulösen. Das ist perfekt zum manuellen Testen von Wheels vor einer Veröffentlichung eignet, da ihr sie einfach von artifacts herunterladen könnt.
Siehe auch
release
wird bei der Übertragung einer getaggten Version ausgeführt.
Siehe auch
Nun können die Wheels gebaut werden mit:
jobs:
build_wheels:
name: Build wheels on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
matrix:
# macos-13 is an intel runner, macos-14 is apple silicon
os: [ubuntu-latest, windows-latest, macos-13, macos-14]
steps:
- uses: actions/checkout@v4
- name: Build wheels
uses: pypa/cibuildwheel@v2.21.3
Dadurch wird der CI-Workflow mit den folgenden Standardeinstellungen ausgeführt:
package-dir: .
output-dir: wheelhouse
config-file: "{package}/pyproject.toml"
Siehe auch
Schließlich können die Wheels zum Python Package Index hochgeladen werden mit:
- uses: actions/upload-artifact@v4
with:
name: cibw-wheels-${{ matrix.os }}-${{ strategy.job-index }}
path: ./wheelhouse/*.whl
Um Linux-, macOS- und Windows-Wheels mit
GitLab CI/CD zu bauen,
erstellt eine .gitlab-ci.yml
-Datei in eurem Git-Repository:
linux:
image: python:latest
# make a docker daemon available for cibuildwheel to use
services:
- name: docker:dind
entrypoint: ["env", "-u", "DOCKER_HOST"]
command: ["dockerd-entrypoint.sh"]
variables:
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
# See https://github.com/docker-library/docker/pull/166
DOCKER_TLS_CERTDIR: ""
script:
- curl -sSL https://get.docker.com/ | sh
- python -m pip install cibuildwheel==2.21.3
- cibuildwheel --output-dir wheelhouse
artifacts:
paths:
- wheelhouse/
windows:
image: mcr.microsoft.com/windows/servercore:1809
before_script:
- choco install python -y --version 3.12.4
- choco install git.install -y
- py -m pip install cibuildwheel==2.21.3
script:
- py -m cibuildwheel --output-dir wheelhouse --platform windows
artifacts:
paths:
- wheelhouse/
tags:
- saas-windows-medium-amd64
macos:
image: macos-14-xcode-15
before_script:
- python3 -m pip install cibuildwheel==2.21.3
script:
- python3 -m cibuildwheel --output-dir wheelhouse
artifacts:
paths:
- wheelhouse/
tags:
- saas-macos-medium-m1
Optionen¶
cibuildwheel
kann entweder über Umgebungsvariablen oder über eine
Konfigurationsdatei wie pyproject.toml
konfiguriert werden, z.B.:
[tool.cibuildwheel]
test-requires = "pytest"
test-command = "pytest {project}/tests"
build-verbosity = 1
# support Universal2 for Apple Silicon:
[tool.cibuildwheel.macos]
archs = ["auto", "universal2"]
test-skip = ["*universal2:arm64"]
Siehe auch
Beispiele¶
Coverage.py: .github/workflows/kit.yml
matplotlib: .github/workflows/cibuildwheel.yml
psutil: .github/workflows/build.yml