blob: 92787fa95ecd3ac44e37803626e58adbd01cbbd0 [file] [log] [blame] [view]
# rules_python_external
Contains Bazel rules to fetch and install Python dependencies from a requirements.txt file.
## Usage
#### Setup `requirements.txt`
While `rules_python_external` **does not** require a _transitively-closed_ `requirements.txt` file, it is recommended. But if you want to just have top-level packages listed, that works.
Transitively-closed requirements specs are very tedious to produce and maintain manually. To automate the process we recommend [`pip-compile` from `jazzband/pip-tools`](https://github.com/jazzband/pip-tools#example-usage-for-pip-compile).
For example, `pip-compile` takes a `requirements.in` like this:
```
boto3~=1.9.227
botocore~=1.12.247
click~=7.0
```
These above are the third-party packages you can directly import.
`pip-compile` 'compiles' it so you get a transitively-closed `requirements.txt` like this, which should be passed to `pip_install` below:
```
boto3==1.9.253
botocore==1.12.253
click==7.0
docutils==0.15.2 # via botocore
jmespath==0.9.4 # via boto3, botocore
python-dateutil==2.8.1 # via botocore
s3transfer==0.2.1 # via boto3
six==1.14.0 # via python-dateutil
urllib3==1.25.8 # via botocore
```
#### Setup `WORKSPACE`
```python
rules_python_external_version = "{COMMIT_SHA}"
http_archive(
name = "rules_python_external",
sha256 = "", # Fill in with correct sha256 of your COMMIT_SHA version
strip_prefix = "rules_python_external-{version}".format(version = rules_python_external_version),
url = "https://github.com/dillon-giacoppo/rules_python_external/archive/{version}.zip".format(version = rules_python_external_version),
)
# Install the rule dependencies
load("@rules_python_external//:repositories.bzl", "rules_python_external_dependencies")
rules_python_external_dependencies()
load("@rules_python_external//:defs.bzl", "pip_install")
pip_install(
name = "py_deps",
requirements = "//:requirements.txt",
)
```
Example `BUILD` file.
```python
load("@py_deps//:requirements.bzl", "requirement")
py_binary(
name = "main",
srcs = ["main.py"],
deps = [
requirement("boto3"), # or @py_deps//pypi__boto3
],
)
```
Note that above you do not need to add transitively required packages to `deps = [ ... ]`
## Development
### Testing
`bazel test //...`