This repository was archived by the owner on Jul 21, 2021. It is now read-only.
forked from bazel-contrib/rules_python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpip.bzl
More file actions
115 lines (99 loc) · 3.36 KB
/
pip.bzl
File metadata and controls
115 lines (99 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Import pip requirements into Bazel."""
def python(repository_ctx):
if "BAZEL_PIP_PYTHON" in repository_ctx.os.environ:
return repository_ctx.os.environ.get("BAZEL_PIP_PYTHON")
python_path = repository_ctx.which("python")
if not python_path:
python_path = repository_ctx.which("python.exe")
if python_path:
return python_path
fail("rules_python requires a python interpreter installed. " +
"Please set BAZEL_PYTHON, or put it on your path.")
def _pip_import_impl(repository_ctx):
"""Core implementation of pip_import."""
# Add an empty top-level BUILD file.
# This is because Bazel requires BUILD files along all paths accessed
# via //this/sort/of:path and we wouldn't be able to load our generated
# requirements.bzl without it.
repository_ctx.file("BUILD", "")
# To see the output, pass: quiet=False
result = repository_ctx.execute([
python(repository_ctx), repository_ctx.path(repository_ctx.attr._script),
"--name", repository_ctx.attr.name,
"--input", repository_ctx.path(repository_ctx.attr.requirements),
"--output", repository_ctx.path("requirements.bzl"),
"--directory", repository_ctx.path(""),
])
if result.return_code:
fail("pip_import failed: %s (%s)" % (result.stdout, result.stderr))
pip_import = repository_rule(
attrs = {
"requirements": attr.label(
allow_files = True,
mandatory = True,
single_file = True,
),
"_script": attr.label(
executable = True,
default = Label("//tools:piptool.par"),
cfg = "host",
),
},
implementation = _pip_import_impl,
)
"""A rule for importing <code>requirements.txt</code> dependencies into Bazel.
This rule imports a <code>requirements.txt</code> file and generates a new
<code>requirements.bzl</code> file. This is used via the <code>WORKSPACE</code>
pattern:
<pre><code>pip_import(
name = "foo",
requirements = ":requirements.txt",
)
load("@foo//:requirements.bzl", "pip_install")
pip_install()
</code></pre>
You can then reference imported dependencies from your <code>BUILD</code>
file with:
<pre><code>load("@foo//:requirements.bzl", "requirement")
py_library(
name = "bar",
...
deps = [
"//my/other:dep",
requirement("futures"),
requirement("mock"),
],
)
</code></pre>
Or alternatively:
<pre><code>load("@foo//:requirements.bzl", "all_requirements")
py_binary(
name = "baz",
...
deps = [
":foo",
] + all_requirements,
)
</code></pre>
Args:
requirements: The label of a requirements.txt file.
"""
def pip_repositories():
"""Pull in dependencies needed for pulling in pip dependencies.
A placeholder method that will eventually pull in any dependencies
needed to install pip dependencies.
"""
pass