Search code examples
pypibazel

bazel pypi macro self-edge


I'm stumbling around trying to get bazel working with pypi dependencies.

./pypi.bzl:

def _impl(ctx):
  ctx.actions.run_shell(
    command = "pip download %s" % ctx.package
  )

_pypi_package = rule(
  implementation=_impl,
  attrs={"package": attr.label(mandatory=True)},
)

def pypi_package(package):
  _pypi_package(name = package, package = package)

./BUILD:

py_binary(
  name = "app",
  srcs = ["app.py"],
  deps = [":python-dateutil"]
)

load("//:pypi.bzl", "pypi_package")

pypi_package(
  package="python-dateutil",
)

Trying to build:

$ bazel build app
ERROR: /path/to/cwd/BUILD:9:1: in _pypi_package rule //:python-dateutil: cycle in dependency graph:
    //:app
.-> //:python-dateutil [self-edge]
`--
This cycle occurred because of a configuration option.
ERROR: Analysis of target '//:app' failed; build aborted.
INFO: Elapsed time: 0.219s

No idea if this is even the right approach for working with external dependencies, but ignoring that, I don't understand where the self-dep here is coming from. In fact, I don't see that I'm declaring any deps for the pypi_package rule at all. What's going on?


Solution

  • The issue was attr.label: "label" here means BUILD label. I should have been using attr.string.