···1-# Bower {#sec-bower}
2-3-[Bower](https://bower.io) is a package manager for web site front-end components. Bower packages (comprising of build artifacts and sometimes sources) are stored in `git` repositories, typically on Github. The package registry is run by the Bower team with package metadata coming from the `bower.json` file within each package.
4-5-The end result of running Bower is a `bower_components` directory which can be included in the web app's build process.
6-7-Bower can be run interactively, by installing `nodePackages.bower`. More interestingly, the Bower components can be declared in a Nix derivation, with the help of `bower2nix`.
8-9-## bower2nix usage {#ssec-bower2nix-usage}
10-11-Suppose you have a `bower.json` with the following contents:
12-13-### Example bower.json {#ex-bowerJson}
14-15-```json
16- "name": "my-web-app",
17- "dependencies": {
18- "angular": "~1.5.0",
19- "bootstrap": "~3.3.6"
20- }
21-```
22-23-Running `bower2nix` will produce something like the following output:
24-25-```nix
26-{ fetchbower, buildEnv }:
27-buildEnv {
28- name = "bower-env";
29- ignoreCollisions = true;
30- paths = [
31- (fetchbower "angular" "1.5.3" "~1.5.0" "1749xb0firxdra4rzadm4q9x90v6pzkbd7xmcyjk6qfza09ykk9y")
32- (fetchbower "bootstrap" "3.3.6" "~3.3.6" "1vvqlpbfcy0k5pncfjaiskj3y6scwifxygfqnw393sjfxiviwmbv")
33- (fetchbower "jquery" "2.2.2" "1.9.1 - 2" "10sp5h98sqwk90y4k6hbdviwqzvzwqf47r3r51pakch5ii2y7js1")
34- ];
35-}
36-```
37-38-Using the `bower2nix` command line arguments, the output can be redirected to a file. A name like `bower-packages.nix` would be fine.
39-40-The resulting derivation is a union of all the downloaded Bower packages (and their dependencies). To use it, they still need to be linked together by Bower, which is where `buildBowerComponents` is useful.
41-42-## buildBowerComponents function {#ssec-build-bower-components}
43-44-The function is implemented in [pkgs/development/bower-modules/generic/default.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/bower-modules/generic/default.nix).
45-46-### Example buildBowerComponents {#ex-buildBowerComponents}
47-48-```nix
49-{
50- bowerComponents = buildBowerComponents {
51- name = "my-web-app";
52- generated = ./bower-packages.nix; # note 1
53- src = myWebApp; # note 2
54- };
55-}
56-```
57-58-In ["buildBowerComponents" example](#ex-buildBowerComponents) the following arguments are of special significance to the function:
59-60-1. `generated` specifies the file which was created by {command}`bower2nix`.
61-2. `src` is your project's sources. It needs to contain a {file}`bower.json` file.
62-63-`buildBowerComponents` will run Bower to link together the output of `bower2nix`, resulting in a `bower_components` directory which can be used.
64-65-Here is an example of a web frontend build process using `gulp`. You might use `grunt`, or anything else.
66-67-### Example build script (gulpfile.js) {#ex-bowerGulpFile}
68-69-```javascript
70-var gulp = require('gulp');
71-72-gulp.task('default', [], function () {
73- gulp.start('build');
74-});
75-76-gulp.task('build', [], function () {
77- console.log("Just a dummy gulp build");
78- gulp
79- .src(["./bower_components/**/*"])
80- .pipe(gulp.dest("./gulpdist/"));
81-});
82-```
83-84-### Example Full example — default.nix {#ex-buildBowerComponentsDefaultNix}
85-86-```nix
87-{
88- myWebApp ? {
89- outPath = ./.;
90- name = "myWebApp";
91- },
92- pkgs ? import <nixpkgs> { },
93-}:
94-95-pkgs.stdenv.mkDerivation {
96- name = "my-web-app-frontend";
97- src = myWebApp;
98-99- buildInputs = [ pkgs.nodePackages.gulp ];
100-101- bowerComponents = pkgs.buildBowerComponents {
102- # note 1
103- name = "my-web-app";
104- generated = ./bower-packages.nix;
105- src = myWebApp;
106- };
107-108- nativeBuildInputs = [
109- writableTmpDirAsHomeHook # note 3
110- ];
111-112- buildPhase = ''
113- runHook preBuild
114-115- cp --reflink=auto --no-preserve=mode -R $bowerComponents/bower_components . # note 2
116- ${pkgs.nodePackages.gulp}/bin/gulp build # note 4
117-118- runHook postBuild
119- '';
120-121- installPhase = ''
122- runHook preInstall
123-124- mv gulpdist $out
125-126- runHook postInstall
127- '';
128-}
129-```
130-131-A few notes about [Full example — `default.nix`](#ex-buildBowerComponentsDefaultNix):
132-133-1. The result of `buildBowerComponents` is an input to the frontend build.
134-2. Whether to symlink or copy the {file}`bower_components` directory depends on the build tool in use.
135- In this case, a copy is used to avoid {command}`gulp` silliness with permissions.
136-3. {command}`gulp` requires `HOME` to refer to a writeable directory.
137-4. The actual build command in this example is {command}`gulp`. Other tools could be used instead.
138-139-## Troubleshooting {#ssec-bower2nix-troubleshooting}
140-141-### ENOCACHE errors from buildBowerComponents {#enocache-errors-from-buildbowercomponents}
142-143-This means that Bower was looking for a package version which doesn't exist in the generated `bower-packages.nix`.
144-145-If `bower.json` has been updated, then run `bower2nix` again.
146-147-It could also be a bug in `bower2nix` or `fetchbower`. If possible, try reformulating the version specification in `bower.json`.
···2021- `mono4` and `mono5` have been removed. Use `mono6` or `mono` instead.
220023- The `offrss` package was removed due to lack of upstream maintenance since 2012. It's recommended for users to migrate to another RSS reader
2425- `installShellFiles`: Allow installManPage to take a piped input, add the `--name` flag for renaming the file when installed. Can also append `--` to opt-out of all subsequent parsing.
···2021- `mono4` and `mono5` have been removed. Use `mono6` or `mono` instead.
2223+- Everything related to `bower` was removed, as it is deprecated and not used by anything in nixpkgs.
24+25- The `offrss` package was removed due to lack of upstream maintenance since 2012. It's recommended for users to migrate to another RSS reader
2627- `installShellFiles`: Allow installManPage to take a piped input, add the `--name` flag for renaming the file when installed. Can also append `--` to opt-out of all subsequent parsing.
-41
pkgs/build-support/fetchbower/default.nix
···1-{
2- stdenvNoCC,
3- lib,
4- bower2nix,
5- cacert,
6-}:
7-let
8- bowerVersion =
9- version:
10- let
11- components = lib.splitString "#" version;
12- hash = lib.last components;
13- ver = if builtins.length components == 1 then (cleanName version) else hash;
14- in
15- ver;
16-17- cleanName = name: lib.replaceStrings [ "/" ":" ] [ "-" "-" ] name;
18-19- fetchbower =
20- name: version: target: outputHash:
21- stdenvNoCC.mkDerivation {
22- name = "${cleanName name}-${bowerVersion version}";
23- buildCommand = ''
24- fetch-bower --quiet --out=$PWD/out "${name}" "${target}" "${version}"
25- # In some cases, the result of fetchBower is different depending
26- # on the output directory (e.g. if the bower package contains
27- # symlinks). So use a local output directory before copying to
28- # $out.
29- cp -R out $out
30- '';
31- outputHashMode = "recursive";
32- outputHashAlgo = "sha256";
33- inherit outputHash;
34- nativeBuildInputs = [
35- bower2nix
36- cacert
37- ];
38- };
39-40-in
41-fetchbower
···538 boost184 = throw "Boost 1.84 has been removed as it is obsolete and no longer used by anything in Nixpkgs"; # Added 2024-11-24
539 boost185 = throw "Boost 1.85 has been removed as it is obsolete and no longer used by anything in Nixpkgs"; # Added 2024-11-24
540 boost_process = throw "boost_process has been removed as it is included in regular boost"; # Added 2024-05-01
0541 bpb = throw "bpb has been removed as it is unmaintained and not compatible with recent Rust versions"; # Added 2024-04-30
542 bpftool = throw "'bpftool' has been renamed to/replaced by 'bpftools'"; # Converted to throw 2024-10-17
543 brasero-original = lib.warnOnInstantiate "Use 'brasero-unwrapped' instead of 'brasero-original'" brasero-unwrapped; # Added 2024-09-29
···549 budgie = throw "The `budgie` scope has been removed and all packages moved to the top-level"; # Added 2024-07-14
550 budgiePlugins = throw "The `budgiePlugins` scope has been removed and all packages moved to the top-level"; # Added 2024-07-14
551 buildBarebox = throw "buildBarebox has been removed due to lack of interest in maintaining it in nixpkgs"; # Added 2025-04-19
0552 buildGo122Module = throw "Go 1.22 is end-of-life, and 'buildGo122Module' has been removed. Please use a newer builder version."; # Added 2025-03-28
553 buildGo123Module = throw "Go 1.23 is end-of-life, and 'buildGo123Module' has been removed. Please use a newer builder version."; # Added 2025-08-13
554 buildGoPackage = throw "`buildGoPackage` has been deprecated and removed, see the Go section in the nixpkgs manual for details"; # Added 2024-11-18
···886 fdr = throw "fdr has been removed, as it cannot be built from source and depends on Python 2.x"; # Added 2025-03-19
887 inherit (luaPackages) fennel; # Added 2022-09-24
888 ferdi = throw "'ferdi' has been removed, upstream does not exist anymore and the package is insecure"; # Added 2024-08-22
0889 fetchFromGithub = throw "You meant fetchFromGitHub, with a capital H"; # preserve, reason: common typo
890 ffmpeg_5 = throw "ffmpeg_5 has been removed, please use another version"; # Added 2024-07-12
891 ffmpeg_5-headless = throw "ffmpeg_5-headless has been removed, please use another version"; # Added 2024-07-12
···538 boost184 = throw "Boost 1.84 has been removed as it is obsolete and no longer used by anything in Nixpkgs"; # Added 2024-11-24
539 boost185 = throw "Boost 1.85 has been removed as it is obsolete and no longer used by anything in Nixpkgs"; # Added 2024-11-24
540 boost_process = throw "boost_process has been removed as it is included in regular boost"; # Added 2024-05-01
541+ bower2nix = throw "bower2nix has been removed as bower was removed. It is recommended to migrate to yarn."; # Added 2025-09-17
542 bpb = throw "bpb has been removed as it is unmaintained and not compatible with recent Rust versions"; # Added 2024-04-30
543 bpftool = throw "'bpftool' has been renamed to/replaced by 'bpftools'"; # Converted to throw 2024-10-17
544 brasero-original = lib.warnOnInstantiate "Use 'brasero-unwrapped' instead of 'brasero-original'" brasero-unwrapped; # Added 2024-09-29
···550 budgie = throw "The `budgie` scope has been removed and all packages moved to the top-level"; # Added 2024-07-14
551 budgiePlugins = throw "The `budgiePlugins` scope has been removed and all packages moved to the top-level"; # Added 2024-07-14
552 buildBarebox = throw "buildBarebox has been removed due to lack of interest in maintaining it in nixpkgs"; # Added 2025-04-19
553+ buildBowerComponents = throw "buildBowerComponents has been removed as bower was removed. It is recommended to migrate to yarn."; # Added 2025-09-17
554 buildGo122Module = throw "Go 1.22 is end-of-life, and 'buildGo122Module' has been removed. Please use a newer builder version."; # Added 2025-03-28
555 buildGo123Module = throw "Go 1.23 is end-of-life, and 'buildGo123Module' has been removed. Please use a newer builder version."; # Added 2025-08-13
556 buildGoPackage = throw "`buildGoPackage` has been deprecated and removed, see the Go section in the nixpkgs manual for details"; # Added 2024-11-18
···888 fdr = throw "fdr has been removed, as it cannot be built from source and depends on Python 2.x"; # Added 2025-03-19
889 inherit (luaPackages) fennel; # Added 2022-09-24
890 ferdi = throw "'ferdi' has been removed, upstream does not exist anymore and the package is insecure"; # Added 2024-08-22
891+ fetchbower = throw "fetchbower has been removed as bower was removed. It is recommended to migrate to yarn."; # Added 2025-09-17
892 fetchFromGithub = throw "You meant fetchFromGitHub, with a capital H"; # preserve, reason: common typo
893 ffmpeg_5 = throw "ffmpeg_5 has been removed, please use another version"; # Added 2024-07-12
894 ffmpeg_5-headless = throw "ffmpeg_5-headless has been removed, please use another version"; # Added 2024-07-12