blob: 5e7d7217effa8c0f1ae50f8efab13e4dc773a0f3 [file] [log] [blame] [view]
# Sass Rules for Bazel
<div class="toc">
<h2>Rules</h2>
<ul>
<li><a href="#sass_binary">sass_binary</a></li>
<li><a href="#sass_library">sass_library</a></li>
</ul>
</div>
## Overview
These build rules are used for building [Sass][sass] projects with Bazel.
[sass]: http://www.sass-lang.com
<a name="setup"></a>
## Setup
To use the Sass rules, add the following to your `WORKSPACE` file to add the
external repositories for Sass:
```python
load("@bazel_tools//tools/build_defs/sass:sass.bzl", "sass_repositories")
sass_repositories()
```
<a name="basic-example"></a>
## Basic Example
Suppose you have the following directory structure for a simple Sass project:
```
[workspace]/
WORKSPACE
hello_world/
BUILD
main.scss
shared/
BUILD
_fonts.scss
_colors.scss
```
`shared/_fonts.scss`
```scss
$default-font-stack: Cambria, "Hoefler Text", Utopia, "Liberation Serif", "Nimbus Roman No9 L Regular", Times, "Times New Roman", ser
if;
$modern-font-stack: Constantia, "Lucida Bright", Lucidabright, "Lucida Serif", Lucida, "DejaVu Serif", "Bitstream Vera Serif", "Liber
ation Serif", Georgia, serif;
```
`shared/_colors.scss`
```scss
$example-blue: #0000ff;
$example-red: #ff0000;
```
`shared/BUILD`
```python
package(default_visibility = ["//visibility:public"])
load("@bazel_tools//tools/build_defs/sass:sass.bzl", "sass_library")
sass_library(
name = "colors",
srcs = ["_colors.scss"],
)
sass_library(
name = "fonts",
srcs = ["_fonts.scss"],
)
```
`hello_world/main.scss`:
```scss
@import "examples/sass/shared/fonts";
@import "examples/sass/shared/colors";
html {
body {
font-family: $default-font-stack;
h1 {
font-family: $modern-font-stack;
color: $example-red;
}
}
}
```
`hello_world/BUILD:`
```python
package(default_visibility = ["//visibility:public"])
load("@bazel_tools//tools/build_defs/sass:sass.bzl", "sass_binary")
sass_binary(
name = "hello_world",
src = "main.scss",
deps = [
"//shared:colors",
"//shared:fonts",
],
)
```
Build the binary:
```
$ bazel build //hello_world
INFO: Found 1 target...
Target //hello_world:hello_world up-to-date:
bazel-bin/hello_world/hello_world.css
bazel-bin/hello_world/hello_world.css.map
INFO: Elapsed time: 1.911s, Critical Path: 0.01s
```
<a name="reference"></a>
## Build Rule Reference
<a name="reference-sass_binary"></a>
## sass_binary
```python
sass_binary(name, src, deps=[], output_style="compressed")
```
Used to generate a CSS artifact from a given `src` sass file.
<table class="table table-condensed table-bordered table-implicit">
<colgroup>
<col class="col-param" />
<col class="param-description" />
</colgroup>
<thead>
<tr>
<th colspan="2">Implicit Output Targets</th>
</th>
</thead>
<tbody>
<tr>
<td><code><strong>name</strong>.css</code></td>
<td>
<p>The generated CSS artifact containing all the styles</p>
</td>
</tr>
<tr>
<td><code><strong>name</strong>.css.map</code></td>
<td>
<p>
<a href="http://thesassway.com/intermediate/using-source-maps-with-sass">source map</a>
that can be used to optionally debug the generated CSS in a browser.
</p>
</td>
</tr>
</tbody>
</table>
<table class="table table-condensed table-bordered table-params">
<colgroup>
<col class="col-param" />
<col class="param-description" />
</colgroup>
<thead>
<tr>
<th colspan="2">Attributes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>name</code></td>
<td>
<code>Name, required</code>
<p>A unique name for this rule.</p>
<p>
This name will also be used as the name of the generated CSS and source map file of
this rule.
</p>
</td>
</tr>
<tr>
<td><code>src</code></td>
<td>
<code>Main source file, required</code>
<p>The primary Sass source file that will be compiled to CSS.</p>
<p>
<code>sass_binary</code> assumes a 1:1 mapping of src to output CSS file (and source map).
</p>
</td>
</tr>
<tr>
<td><code>deps</code></td>
<td>
<code>list of labels, optional</code>
<p></p>
<p>
Each target should be defined using a <code>filegroup</code> rule and should only include "_" prefixed files that are referenced via <code>@import</code> in the target's source file.
</p>
</td>
</tr>
<tr>
<td><code>output_style</code></td>
<td>
<code>string; optional</code>
<p>Defaults to <code>compressed</code>.</p>
<p>
Can be set to <a href="http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style">one of the following</a> output styles defined by <code>sassc</code>.
</p>
</td>
</tr>
</tbody>
</table>
<a name="reference-sass_library"></a>
## sass_library
```python
sass_library(name, src, deps=[])
```
Used to reference sass a collection of sass files that a
[`sass_binary`](#reference-sass_binary) may depend on (via `@import`
statements), but should not result in any output targets.
<table class="table table-condensed table-bordered table-params">
<colgroup>
<col class="col-param" />
<col class="param-description" />
</colgroup>
<thead>
<tr>
<th colspan="2">Attributes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>name</code></td>
<td>
<code>Name, required</code>
<p>A unique name for this rule.</p>
<p>
</p>
</td>
</tr>
<tr>
<td><code>srcs</code></td>
<td>
<code>a list of labels, required</code>
<p></p>
<p>
<code>sass_library</code> all files should start with an underscore, eg: _colors.scss.
</p>
</td>
</tr>
<tr>
<td><code>deps</code></td>
<td>
<code>list of labels, optional</code>
<p></p>
<p>
This could be any other <code>sass_library</code> targets that this target may include.
</p>
</td>
</tr>
</tbody>
</table>