mwilliamson / python-vendorize

Vendorize packages from PyPI
BSD 2-Clause "Simplified" License
99 stars 14 forks source link

python-vendorize

python-vendorize allows pure-Python dependencies to be vendorized: that is, the Python source of the dependency is copied into your own package. Best used for small, pure-Python dependencies to avoid version conflicts when other packages require a different version of the same dependency.

Dependencies you want vendorizing should be specified in vendorize.toml. target should be a string containing the path where vendorized dependencies should be placed, relative to the directory that vendorize.toml is in. packages should be a list of strings containing the dependencies. Each of these strings can be anything that pip would understand, such as a package name, a package name with version constraints or an URL. Dependencies can then be vendorized using python-vendorize.

For instance, suppose I want to vendorize six so it can be used from the package hello. The directory structure would be something like:

::

- hello
  - __init__.py
- setup.py
- vendorize.toml

vendorize.toml might look something like:

::

target = "hello/_vendor"
packages = [
    "six",
]

I can then run python-vendorize in the same directory as vendorize.toml. The directory structure would then be something like:

::

- hello
  - _vendor
    - six.dist-info
      - ...
    - __init__.py
    - six.py
  - __init__.py
- setup.py
- vendorize.toml

In hello/__init__.py, six can be imported from _vendor:

.. code:: python

from ._vendor import six

The configuration can also be stored in pyproject.toml instead of vendorize.toml. When using pyproject.toml, the configuration should be stored in [tool.vendorize]. For instance:

::

[tool.vendorize]
target = "hello/_vendor"
packages = [
    "six",
]

Installation



::

    pip install vendorize