Opcjonalne zależności podane przez użytkownika podczas instalacji:
można użyć parametru extras_require
do setup()
: http://pythonhosted.org/setuptools/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies
setup(
name="MyProject",
...
extras_require = {
'ProviderX': ["DependencyX1", "DependencyX2"],
'ProviderY': ["DependencyY"],
}
)
Dzięki tej metodzie, użytkownik może poprosić o zainstalowanie konkretnych rozszerzeń pip install Myproject[ProviderX]
.
Opcjonalne zależności oparte na istniejących pakietów:
W celu automatycznego wykrywania zainstalowanych pakietów, można zbudować listę wymagań dynamicznie. Na przykład możesz sprawdzić, jak robi to matplotlib (mają wiele opcjonalnych backendów do kreślenia między innymi): https://github.com/matplotlib/matplotlib.
Zasadniczo setup.py jest zwykłym kodem Pythona, więc możesz uruchomić funkcję, która sprawdza opcjonalne zależności i dostosować wymagania oraz listę pakietów do zainstalowania.
Sposób w jaki robi to matplotlib, definiując klasę zależności, którą rozszerza dla każdej zależności (w setupExt.py).
class SetupPackage(object):
optional = False
def check(self):
"""
Checks whether the dependencies are met. [...]
"""
pass
def get_packages(self):
"""
Get a list of package names to add to the configuration.
These are added to the `packages` list passed to
`distutils.setup`.
"""
return []
def get_namespace_packages(self):
"""
Get a list of namespace package names to add to the configuration.
These are added to the `namespace_packages` list passed to
`distutils.setup`.
"""
return []
def get_py_modules(self):
"""
Get a list of top-level modules to add to the configuration.
These are added to the `py_modules` list passed to
`distutils.setup`.
"""
return []
...
class Numpy(SetupPackage):
...
Następnie iteracje nad każdym uzależnienia w setup.py, sprawdza, czy to powinno być zainstalowane i odpowiednio wydłuża każdą listy mają być przekazane do setup()
mpl_packages = [
'Building Matplotlib',
setupext.Six(),
setupext.Dateutil(),
...
good_packages = []
for package in mpl_packages:
[...]
# check and append
if ...
good_packages.append(package)
[...]
for package in good_packages:
if isinstance(package, str):
continue
packages.extend(package.get_packages())
namespace_packages.extend(package.get_namespace_packages())
py_modules.extend(package.get_py_modules())
ext = package.get_extension()
możliwym duplikatu [Mogę określić opcjonalne pakiety w setuptools?] (http://stackoverflow.com/questions/11240285/can-i-define-optional-packages-in-setuptools) ... chociaż odpowiedź @ Jonathan-Villemaire-Krajden zawiera dodatkowe szczegóły – Stefano