Python package policies: Difference between revisions
(Give the py3-only template a more prominent role on the page) |
(Address ncopa's feedback) |
||
Line 9: | Line 9: | ||
* Update maintainer to yourself | * Update maintainer to yourself | ||
* Set the pkgname to the Alpine package name (prefixed with "py-") | * Set the pkgname to the Alpine package name (prefixed with "py-") | ||
* Set | * Set _pyname to the name of the package on PyPI | ||
* Update the version number, pkgdesc, url, and license | * Update the version number, pkgdesc, url, and license | ||
* Build it and address any issues that come up | * Build it and address any issues that come up | ||
Line 20: | Line 20: | ||
<pre># Maintainer: Joe Bloe <joe@example.org> | <pre># Maintainer: Joe Bloe <joe@example.org> | ||
pkgname=py-alpine-name | pkgname=py-alpine-name | ||
_pyname=pypi-name | |||
pkgver=1.2.3 | pkgver=1.2.3 | ||
pkgrel=0 | pkgrel=0 | ||
pkgdesc="Example Python package" | pkgdesc="Example Python package" | ||
url= | url=https://example.org | ||
arch=noarch | arch=noarch | ||
license=MIT | license=MIT | ||
depends="python3" | depends="python3" | ||
makedepends=" | makedepends="py3-setuptools" | ||
source="https://files.pythonhosted.org/packages/source/$ | _pypiprefix="${_pyname%${_pyname#?}}" | ||
builddir=$srcdir/$ | source="https://files.pythonhosted.org/packages/source/$_pypiprefix/$_pyname/$_pyname-$pkgver.tar.gz" | ||
builddir=$srcdir/$_pyname-$pkgver | |||
build() { | build() { | ||
Line 47: | Line 48: | ||
=== Python 2 & 3 === | === Python 2 & 3 === | ||
Specify all of the runtime dependencies for both Python 2 & 3 in the makedepends. | |||
<pre># Maintainer: Joe Bloe <joe@example.org> | <pre># Maintainer: Joe Bloe <joe@example.org> | ||
pkgname=py-alpine-name | pkgname=py-alpine-name | ||
_pyname=pypi-name | |||
pkgver=1.2.3 | pkgver=1.2.3 | ||
pkgrel=0 | pkgrel=0 | ||
pkgdesc="Example Python package" | pkgdesc="Example Python package" | ||
url= | url=https://example.org | ||
arch=noarch | arch=noarch | ||
license=MIT | license=MIT | ||
subpackages="py2-${pkgname#py-}:_py2 py3-${pkgname#py-}:_py3" | subpackages="py2-${pkgname#py-}:_py2 py3-${pkgname#py-}:_py3" | ||
makedepends="py-setuptools" | makedepends="python2 python3 py-setuptools" | ||
source="https://files.pythonhosted.org/packages/source/${ | source="https://files.pythonhosted.org/packages/source/${_pyname:0:1}/$_pyname/$_pyname-$pkgver.tar.gz" | ||
builddir=$srcdir/$ | builddir=$srcdir/$_pyname-$pkgver | ||
prepare() { | prepare() { | ||
Line 120: | Line 123: | ||
Add depends="..." to the respective _py2 or _py3 subpackage functions. | Add depends="..." to the respective _py2 or _py3 subpackage functions. | ||
== | == Alpine+Python projects == | ||
=== aports normalization project === | === aports normalization project === | ||
Many Python packages in aports (if not most) do not follow these guidelines. TODO: | Many Python packages in aports (if not most) do not follow these guidelines. | ||
TODO: obtain consensus and organize this work. | |||
=== Python 2 deprecation === | === Python 2 deprecation === | ||
Python 2 | {{Draft|Pending consensus on this approach}} | ||
The general approach to Python 2 deprecation and removal requires three broad steps: | |||
# Do not add new python 2 packages to aports, effective immediately. | |||
# In the course of the aports normalization project, drop Python 2 support if it's easy or triage it and make a note for later if not. | |||
# Making judgement calls for difficult packages on a case-by-case basis, based on the upstream's progress/amicability towards a Python 3 port. Upstreams which are unwilling to port to Python 3 should be removed from aports. | |||
TODO: Prepare some discussion place, git repos, scripts, etc, to organize this work. |
Revision as of 19:12, 14 March 2019
Python packages in Alpine Linux should follow a general set of standards for their APKBUILDs.
This material is work-in-progress ... Pending consensus on this approach |
General Template
This APKBUILD template includes a split py2-/py3- package and a py- metapackage, and downloads the source package from PyPI. Be sure to make the following changes:
- Update maintainer to yourself
- Set the pkgname to the Alpine package name (prefixed with "py-")
- Set _pyname to the name of the package on PyPI
- Update the version number, pkgdesc, url, and license
- Build it and address any issues that come up
- Read the build output and be vigilant for issues listed in the following sections - the build may complete successfully even though these issues are present
Python 3 only
Note that if you are removing python2 support from a package which previously had it, you should add
replaces="py3-example"
as well.
# Maintainer: Joe Bloe <joe@example.org> pkgname=py-alpine-name _pyname=pypi-name pkgver=1.2.3 pkgrel=0 pkgdesc="Example Python package" url=https://example.org arch=noarch license=MIT depends="python3" makedepends="py3-setuptools" _pypiprefix="${_pyname%${_pyname#?}}" source="https://files.pythonhosted.org/packages/source/$_pypiprefix/$_pyname/$_pyname-$pkgver.tar.gz" builddir=$srcdir/$_pyname-$pkgver build() { cd "$builddir" python3 setup.py build } check() { cd "$builddir" python3 setup.py test } package() { python3 setup.py install --prefix=/usr --root="$pkgdir" }
Python 2 & 3
Specify all of the runtime dependencies for both Python 2 & 3 in the makedepends.
# Maintainer: Joe Bloe <joe@example.org> pkgname=py-alpine-name _pyname=pypi-name pkgver=1.2.3 pkgrel=0 pkgdesc="Example Python package" url=https://example.org arch=noarch license=MIT subpackages="py2-${pkgname#py-}:_py2 py3-${pkgname#py-}:_py3" makedepends="python2 python3 py-setuptools" source="https://files.pythonhosted.org/packages/source/${_pyname:0:1}/$_pyname/$_pyname-$pkgver.tar.gz" builddir=$srcdir/$_pyname-$pkgver prepare() { cp -r "$builddir" "$builddir"-py3 } build() { cd "$builddir" python2 setup.py build cd "$builddir"-py3 python3 setup.py build } check() { cd "$builddir" python2 setup.py test cd "$builddir"-py3 python3 setup.py test } package() { mkdir -p "$pkgdir" } _py2() { cd "$builddir" _py python2 } _py3() { cd "$builddir"-py3 _py python3 } _py() { python="$1" pkgdesc="$pkgdesc (for $python)" depends="$depends $python" install_if="$pkgname=$pkgver-r$pkgrel $python" $python setup.py install --prefix=/usr --root="$subpkgdir" }
Common issues
No source package available (only the wheel is on PyPI)
Seek out the upstream source (e.g. GitHub) and swap out the URL.
No tests in PyPI package "(0 tests run)"
Seek out the upstream source (e.g. GitHub) and swap out the URL.
setup.py test downloads a lot of dependencies
Watch out for this and be sure to add any of these packages to checkdepends so that setuptools isn't downloading and testing against packages/versions which aren't in aports.
Different dependencies between py2 and py3 versions
Add depends="..." to the respective _py2 or _py3 subpackage functions.
Alpine+Python projects
aports normalization project
Many Python packages in aports (if not most) do not follow these guidelines.
TODO: obtain consensus and organize this work.
Python 2 deprecation
This material is work-in-progress ... Pending consensus on this approach |
The general approach to Python 2 deprecation and removal requires three broad steps:
- Do not add new python 2 packages to aports, effective immediately.
- In the course of the aports normalization project, drop Python 2 support if it's easy or triage it and make a note for later if not.
- Making judgement calls for difficult packages on a case-by-case basis, based on the upstream's progress/amicability towards a Python 3 port. Upstreams which are unwilling to port to Python 3 should be removed from aports.
TODO: Prepare some discussion place, git repos, scripts, etc, to organize this work.