| :::{default-domain} bzl |
| ::: |
| |
| # Use in BUILD.bazel files |
| |
| Once you have set up the dependencies, you are ready to start using them in your `BUILD.bazel` |
| files. If you haven't done so yet, set it up by following these docs: |
| 1. [WORKSPACE](./download-workspace) |
| 2. [bzlmod](./download) |
| |
| To refer to targets in a hub repo `pypi`, you can do one of two things: |
| ```starlark |
| py_library( |
| name = "my_lib", |
| deps = [ |
| "@pypi//numpy", |
| ], |
| ) |
| ``` |
| |
| Or use the `requirement` helper that needs to be loaded from the `hub` repo itself: |
| ```starlark |
| load("@pypi//:requirements.bzl", "requirement") |
| |
| py_library( |
| deps = [ |
| requirement("numpy") |
| ], |
| ) |
| ``` |
| |
| Note that the usage of the `requirement` helper is not advised and can be problematic. See the |
| [notes below](#requirement-helper). |
| |
| Note that the hub repo contains the following targets for each package: |
| * `@pypi//numpy` - shorthand for `@pypi//numpy:numpy`. This is an {obj}`alias` to |
| `@pypi//numpy:pkg`. |
| * `@pypi//numpy:pkg` - the {obj}`py_library` target automatically generated by the repository |
| rules. |
| * `@pypi//numpy:data` - the {obj}`filegroup` for all of the extra files that are included |
| as data in the `pkg` target. |
| * `@pypi//numpy:dist_info` - the {obj}`filegroup` for all of the files in the `<pkg prefix with version>.distinfo` directory. |
| * `@pypi//numpy:extracted_whl_files` - a {obj}`filegroup` of all the files |
| extracted from the whl file. |
| * `@pypi//numpy:whl` - the {obj}`filegroup` that is the `.whl` file itself, which includes all |
| transitive dependencies via the {attr}`filegroup.data` attribute. |
| |
| :::{versionadded} 1.6.0 |
| |
| The `:extracted_whl_files` target was added |
| ::: |
| |
| ## Entry points |
| |
| If you would like to access [entry points][whl_ep], see the `py_console_script_binary` rule documentation, |
| which can help you create a `py_binary` target for a particular console script exposed by a package. |
| |
| [whl_ep]: https://packaging.python.org/specifications/entry-points/ |
| |
| ## 'Extras' dependencies |
| |
| Any "extras" specified in the requirements lock file will be automatically added |
| as transitive dependencies of the package. In the example above, you'd just put |
| `requirement("useful_dep")` or `@pypi//useful_dep`. |
| |
| ## Consuming Wheel Dists Directly |
| |
| If you need to depend on the wheel dists themselves (for instance, to pass them |
| to some other packaging tool), you can get a handle to them with the |
| `whl_requirement` macro. For example: |
| |
| ```starlark |
| load("@pypi//:requirements.bzl", "whl_requirement") |
| |
| filegroup( |
| name = "whl_files", |
| data = [ |
| # This is equivalent to "@pypi//boto3:whl" |
| whl_requirement("boto3"), |
| ] |
| ) |
| ``` |
| |
| ## Creating a filegroup of files within a whl |
| |
| The rule {obj}`whl_filegroup` exists as an easy way to extract the necessary files |
| from a whl file without needing to modify the `BUILD.bazel` contents of the |
| whl repositories generated via `pip_repository`. Use it similarly to the `filegroup` |
| above. See the API docs for more information. |
| |
| (requirement-helper)= |
| ## A note about using the requirement helper |
| |
| Each extracted wheel repo contains a `py_library` target representing |
| the wheel's contents. There are two ways to access this library. The |
| first uses the `requirement()` function defined in the central |
| repo's `//:requirements.bzl` file. This function maps a pip package |
| name to a label: |
| |
| ```starlark |
| load("@my_deps//:requirements.bzl", "requirement") |
| |
| py_library( |
| name = "mylib", |
| srcs = ["mylib.py"], |
| deps = [ |
| ":myotherlib", |
| requirement("some_pip_dep"), |
| requirement("another_pip_dep"), |
| ] |
| ) |
| ``` |
| |
| The reason `requirement()` exists is to insulate users from |
| changes to the underlying repository and label strings. However, those |
| labels have become directly used, so they aren't able to easily change regardless. |
| |
| On the other hand, using the `requirement()` helper has several drawbacks: |
| |
| - It doesn't work with `buildifier`. |
| - It doesn't work with `buildozer`. |
| - It adds an extra layer on top of normal mechanisms to refer to targets. |
| - It does not scale well, as each type of target needs a new macro to be loaded and imported. |
| |
| If you don't want to use `requirement()`, you can use the library labels directly instead. For |
| `pip_parse`, the labels are of the following form: |
| |
| ```starlark |
| @{name}//{package} |
| ``` |
| |
| Here `name` is the `name` attribute that was passed to `pip_parse` and |
| `package` is the pip package name with characters that are illegal in |
| Bazel label names (e.g. `-`, `.`) replaced with `_`. If you need to |
| update `name` from "old" to "new", then you can run the following |
| `buildozer` command: |
| |
| ```shell |
| buildozer 'substitute deps @old//([^/]+) @new//${1}' //...:* |
| ``` |