2017-10-10 14:59:31 +00:00
|
|
|
# Skylib
|
|
|
|
|
|
|
|
Skylib is a standard library that provides functions useful for manipulating
|
|
|
|
collections, file paths, and other features that are useful when writing custom
|
|
|
|
build rules in Bazel.
|
|
|
|
|
|
|
|
> This library is currently under early development. Be aware that the APIs
|
|
|
|
> in these modules may change during this time.
|
|
|
|
|
|
|
|
Each of the `.bzl` files in the `lib` directory defines a "module"—a
|
|
|
|
`struct` that contains a set of related functions and/or other symbols that can
|
|
|
|
be loaded as a single unit, for convenience. The top-level file `lib.bzl` acts
|
|
|
|
as an index from which the other modules can be imported.
|
|
|
|
|
|
|
|
To use the functionality here, import the modules you need from `lib.bzl` and
|
|
|
|
access the symbols by dotting into those structs:
|
|
|
|
|
|
|
|
```python
|
|
|
|
load("@bazel_skylib//:lib.bzl", "paths", "shell")
|
|
|
|
|
|
|
|
p = paths.basename("foo.bar")
|
|
|
|
s = shell.quote(p)
|
|
|
|
```
|
|
|
|
|
|
|
|
## List of modules
|
|
|
|
|
2017-10-31 14:21:26 +00:00
|
|
|
* [collections](lib/collections.bzl)
|
|
|
|
* [dicts](lib/dicts.bzl)
|
|
|
|
* [paths](lib/paths.bzl)
|
|
|
|
* [selects](lib/selects.bzl)
|
|
|
|
* [sets](lib/sets.bzl)
|
|
|
|
* [shell](lib/shell.bzl)
|
|
|
|
* [unittest](lib/unittest.bzl)
|
2017-10-10 14:59:31 +00:00
|
|
|
|
|
|
|
## Writing a new module
|
|
|
|
|
|
|
|
Steps to add a module to Skylib:
|
|
|
|
|
|
|
|
1. Create a new `.bzl` file in the `lib` directory.
|
|
|
|
|
|
|
|
1. Write the functions or other symbols (such as constants) in that file,
|
|
|
|
defining them privately (prefixed by an underscore).
|
|
|
|
|
|
|
|
1. Create the exported module struct, mapping the public names of the symbols
|
|
|
|
to their implementations. For example, if your module was named `things` and
|
|
|
|
had a function named `manipulate`, your `things.bzl` file would look like
|
|
|
|
this:
|
|
|
|
|
|
|
|
```python
|
|
|
|
def _manipulate():
|
|
|
|
...
|
|
|
|
|
|
|
|
things = struct(
|
|
|
|
manipulate=_manipulate,
|
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
1. Add a line to `lib.bzl` to make the new module accessible from the index:
|
|
|
|
|
|
|
|
```python
|
|
|
|
load("@bazel_skylib//lib:things.bzl", "things")
|
|
|
|
```
|
|
|
|
|
|
|
|
1. Clients can then use the module by loading it from `lib.bzl`:
|
|
|
|
|
|
|
|
```python
|
|
|
|
load("@bazel_skylib//:lib.bzl", "things")
|
|
|
|
|
|
|
|
things.manipulate()
|
|
|
|
```
|
|
|
|
|
|
|
|
1. Add unit tests for your module in the `tests` directory.
|
2017-10-31 21:54:25 +00:00
|
|
|
|
|
|
|
## `skylark_library`
|
|
|
|
|
|
|
|
The `skylark_library.bzl` rule can be used to aggregate a set of
|
|
|
|
Skylark files and its dependencies for use in test targets and
|
|
|
|
documentation generation.
|