bower-installer
Version:
Tool for installing bower dependencies that won't include entire repos
295 lines (269 loc) • 7.54 kB
Markdown
bower-installer [](https://travis-ci.org/rquadling/bower-installer)
===============
Tool for installing bower dependencies that won't include entire repos. Although Bower works great
as a light-weight tool to quickly install browser dependencies, it currently does not provide much
functionality for installing specific "built" components for the client.
# Bower installs entire repositories
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"backbone": "latest"
}
}
```
If `bower install` is run on this configuration file, the entire backbone repository will be pulled down
and copied into a components directory. This repository is quite large, when probably only a built js and css
file are needed. Bower conveniently provides the `bower list --paths` command to list the actual main files associated
with the components (if the component doesn't define a main, then the whole repository is listed instead).
# Bower Installer
Bower installer provides an easy way for the main files to be installed or moved to one or more locations. Simply add to
your bower.json an `install` key and `path` attribute:
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"backbone": "latest"
},
"install": {
"path": "some/path"
}
}
```
Install bower-installer by executing
```bash
npm install -g bower-installer
```
From the terminal in the same directory as your bower.json file, enter:
```bash
bower-installer
```
After executing this, `backbone.js` will exist under `some/path` relative to the location of your
bower.json file.
# Overriding main files
A lot of registered components for bower do not include bower.json configuration. Therefore, bower does not know
about any "main files" and therefore, by default bower-installer doesn't know about them either. Bower-installer
can override an existing main file path or provide a non-existant one:
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"backbone": "latest",
"requirejs": "latest"
},
"install": {
"path": "some/path",
"sources": {
"requirejs": "bower_components/requirejs/require.js"
}
}
}
```
If bower installer is run on this configuration, `require.js` and `backbone.js` will all appear under
`some/path` relative to your bower.json file.
# Install multiple main files
For one reason or another you may want to install multiple files from a single component. You can do this by providing
an `Array` instead of a `String` inside the sources hash. Or you can use file matchers [https://github.com/isaacs/minimatch](https://github.com/isaacs/minimatch):
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"jquery-ui": "latest",
"datejs": "*"
},
"install": {
"path": "some/path",
"sources": {
"jquery-ui": [
"bower_components/jquery-ui/ui/jquery-ui.custom.js",
"bower_components/jquery-ui/themes/start/jquery-ui.css"
],
"datejs": "bower_components/datejs/build/*.*"
}
}
}
```
# Install files to multiple locations
Files can be installed to multiple locations based upon file type or regular expression. Do so by modifying the `path` to be a map of file-type
locations. Example:
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"jquery-ui": "latest"
},
"install": {
"path": {
"css": "src/css",
"js": "src/js",
"/[sc|le]ss$/": "src/css"
},
"sources": {
"jquery-ui": [
"bower_components/jquery-ui/ui/jquery-ui.custom.js",
"bower_components/jquery-ui/themes/start/jquery-ui.css"
]
}
}
}
```
# Configurable paths
Paths can be custom configurable with variables (key, name and version):
```json
{
"name": "test",
"version": "0.0.2",
"dependencies": {
"bootstrap": "~3.0.3"
},
"install": {
"base": "build",
"path": {
"js": "{name}/js",
"css": "{name}/css",
"eot": "{name}/fonts",
"svg": "{name}/fonts",
"ttf": "{name}/fonts",
"woff": "{name}/fonts"
}
}
}
```
Will create this output structure:
```
build/
bootstrap/
js
css
fonts
jquery
js
```
# Rename files during copy
Files can be renamed when bower-installer is copying them to their new destination. Do so by modifying the `mapping` object. Example:
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"jquery-ui": "latest"
},
"install": {
"path": "some/path",
"sources": {
"jquery-ui": {
"mapping": [
{"bower_components/jquery-ui/ui/jquery-ui.js": "jquery-ui.js"},
{"bower_components/jquery-ui/ui/minified/jquery-ui.min.js": "jquery-ui-min-new-name.js"}
]
}
}
}
}
```
# Ignore files
Files can be ignored and not copied. Do so by adding the appropriate to the `ignore` array. In the following example,
`ember-model` has as dependency on `ember` and `handlebars`, so normally `ember` and the `handlebars` js files would be copied but in this case we don't want them copied over.
Example:
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"ember-model": "0.0.8"
},
"install": {
"path": "build/src",
"ignore": ["ember", "handlebars"]
}
}
```
# Benefits from glob patterns
You can specify a folder and get all files inside it preserving its folder structure.
Example:
```json
{
"name": "test",
"version": "0.1",
"dependencies": {
"datatables-bootstrap3": "latest"
},
"install": {
"path": {
"scss": "build/styles",
"js": "build/js"
},
"sources": {
"datatables-bootstrap3": "bower_components/datatables-bootstrap3/BS3/assets/**"
}
}
}
```
# Mapping folders
Entire folders can be mapped.
Example:
```json
{
"name": "test",
"version": "0.10",
"dependencies": {
"jquery-ui": "latest"
},
"install": {
"path": "build/src",
"sources": {
"jquery-ui": {
"mapping": [
{"bower_components/jquery-ui/themes/base/**": "base"},
{"bower_components/jquery-ui/jquery-ui.min.js": "jquery-ui.min.js"}
]
}
}
}
}
```
will result in
```
build/src/jquery/jquery.js
build/src/jquery-ui/jquery-ui.min.js
build/src/jquery-ui/base/*
```
where `build/src/jquery-ui/base/*` contains the CSS and JS for the base theme.
# Excluding package name from destination folder
The package name can be excluded from the `path`.
Example:
```json
{
"name": "test",
"version": "0.10",
"dependencies": {
"jquery-ui": "latest"
},
"install": {
"options": {
"includePackageNameInInstallPath": false
},
"path": "build/src",
"sources": {
"jquery-ui": {
"mapping": [
{"bower_components/jquery-ui/themes/base/**": "base"},
{"bower_components/jquery-ui/jquery-ui.min.js": "jquery-ui.min.js"}
]
}
}
}
}
```
will result in
```
build/src/jquery.js
build/src/jquery-ui.min.js
build/src/base/*
```
where `build/src/base/*` contains the CSS and JS for the base theme.