La especificación de metadatos básicos documenta el campo de metadatos Requires-External, que parece ser para especificar dependencias del sistema (no Python).
Sin embargo, ¿cómo se especifica realmente este campo? Esto es lo que he probado:
. ├── mypackage │ └── __init__.py └── setup.py Contenido de setup.py
from setuptools import setup setup( name="mypackage", description="blah blah", url='https://example.org', version="0.1", packages=["mypackage"], requires_external=[ "C", "libpng (>=1.5)", 'make; sys_platform != "win32"', ], )Cuando construí este paquete, esos metadatos no estaban incluidos.
Metadata-Version: 2.1 Name: mypackage Version: 0.1 Summary: blah blah Home-page: https://example.org License: UNKNOWN Platform: UNKNOWN UNKNOWNEntonces, ¿cuál es la sintaxis para pasar Requires-External a setuptools/distutils? Nota: esta pregunta no se refiere a los metadatos Requires-Dist .
Entonces, ¿cuál es la sintaxis para pasar Requires-External a setuptools/distutils?
No hay ninguno por defecto, ya que ni distutils ni setuptools admiten el campo. Además, la palabra clave requires_external arg tampoco es compatible; se ignora silenciosamente, al igual que cualquier otra palabra clave desconocida arg.
Para agregar soporte local para require_external requires_external , debe proporcionar su propia implementación de distribución. Ejemplo mínimo (requiere Python 3.9):
from setuptools.dist import Distribution as DistributionOrig class Distribution(DistributionOrig): _DISTUTILS_UNSUPPORTED_METADATA = DistributionOrig._DISTUTILS_UNSUPPORTED_METADATA | {'requires_external': dict} Ahora puede pasar requires_external a setup() cuando se combina con distclass :
setup( ..., requires_external=[ 'C', 'libpng (>=1.5)', 'make; sys_platform != "win32"', ], distclass=Distribution, ) El siguiente objetivo es escribir el contenido de requires_external en PKG-INFO . Esto es bastante complicado de hacer a través de los metadatos de distribución porque las herramientas de setuptools los métodos relevantes ( DistributionMetadata.read_pkg_file() y DistributionMetadata.write_pkg_file() ) con sus propios impls monolíticos. La forma más fácil para este IMO es modificar PKG-INFO post factum a través de un egg_info personalizado:
import email from pathlib import Path from setuptools.command.egg_info import egg_info as egg_info_orig class egg_info(egg_info_orig): def run(self): super().run() # PKG-INFO is now guaranteed to exist pkg_info_file = Path(self.egg_info, 'PKG-INFO') pkg_info = email.message_from_bytes(pkg_info_file.read_bytes()) for req in self.distribution.metadata.requires_external: pkg_info.add_header('Requires-External', req) pkg_info_file.write_bytes(pkg_info.as_bytes()) Pase su propio egg_info a través del argumento cmdclass en setup() :
setup( ..., requires_external=[ 'C', 'libpng (>=1.5)', 'make; sys_platform != "win32"', ], distclass=Distribution, cmdclass={'egg_info': egg_info}, )