summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
Diffstat (limited to 'doc')
-rw-r--r--doc/languages-frameworks/bower.xml244
-rw-r--r--doc/languages-frameworks/index.xml19
-rw-r--r--doc/languages-frameworks/ruby.xml11
-rw-r--r--doc/languages-frameworks/texlive.xml59
4 files changed, 312 insertions, 21 deletions
diff --git a/doc/languages-frameworks/bower.xml b/doc/languages-frameworks/bower.xml
new file mode 100644
index 000000000000..742d3c2e9fe5
--- /dev/null
+++ b/doc/languages-frameworks/bower.xml
@@ -0,0 +1,244 @@
+<section xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:id="sec-bower">
+
+<title>Bower</title>
+
+<para>
+ <link xlink:href="http://bower.io">Bower</link> is a package manager
+ for web site front-end components. Bower packages (comprising of
+ build artefacts and sometimes sources) are stored in
+ <command>git</command> repositories, typically on Github. The
+ package registry is run by the Bower team with package metadata
+ coming from the <filename>bower.json</filename> file within each
+ package.
+</para>
+
+<para>
+ The end result of running Bower is a
+ <filename>bower_components</filename> directory which can be included
+ in the web app's build process.
+</para>
+
+<para>
+ Bower can be run interactively, by installing
+ <varname>nodePackages.bower</varname>. More interestingly, the Bower
+ components can be declared in a Nix derivation, with the help of
+ <varname>nodePackages.bower2nix</varname>.
+</para>
+
+<section xml:id="ssec-bower2nix-usage">
+ <title><command>bower2nix</command> usage</title>
+
+<para>
+ Suppose you have a <filename>bower.json</filename> with the following contents:
+
+
+<example xml:id="ex-bowerJson"><title><filename>bower.json</filename></title>
+<programlisting language="json">
+<![CDATA[{
+ "name": "my-web-app",
+ "dependencies": {
+ "angular": "~1.5.0",
+ "bootstrap": "~3.3.6"
+ }
+}]]>
+</programlisting>
+</example>
+</para>
+
+
+<para>
+ Running <command>bower2nix</command> will produce something like the
+ following output:
+
+<programlisting language="nix">
+<![CDATA[{ fetchbower, buildEnv }:
+buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
+ (fetchbower "angular" "1.5.3" "~1.5.0" "1749xb0firxdra4rzadm4q9x90v6pzkbd7xmcyjk6qfza09ykk9y")
+ (fetchbower "bootstrap" "3.3.6" "~3.3.6" "1vvqlpbfcy0k5pncfjaiskj3y6scwifxygfqnw393sjfxiviwmbv")
+ (fetchbower "jquery" "2.2.2" "1.9.1 - 2" "10sp5h98sqwk90y4k6hbdviwqzvzwqf47r3r51pakch5ii2y7js1")
+]; }]]>
+</programlisting>
+</para>
+
+
+<para>
+ Using the <command>bower2nix</command> command line arguments, the
+ output can be redirected to a file. A name like
+ <filename>bower-packages.nix</filename> would be fine.
+</para>
+
+<para>
+ 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
+ <varname>buildBowerComponents</varname> is useful.
+</para>
+</section>
+
+<section xml:id="ssec-build-bower-components"><title><varname>buildBowerComponents</varname> function</title>
+
+ <para>
+ The function is implemented in <link xlink:href="https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/bower-modules/generic/default.nix">
+ <filename>pkgs/development/bower-modules/generic/default.nix</filename></link>.
+ Example usage:
+
+<example xml:id="ex-buildBowerComponents"><title>buildBowerComponents</title>
+<programlisting language="nix">
+bowerComponents = buildBowerComponents {
+ name = "my-web-app";
+ generated = ./bower-packages.nix; <co xml:id="ex-buildBowerComponents-1" />
+ src = myWebApp; <co xml:id="ex-buildBowerComponents-2" />
+};
+</programlisting>
+</example>
+ </para>
+
+<para>
+In <xref linkend="ex-buildBowerComponents" />, the following arguments
+are of special significance to the function:
+
+<calloutlist>
+ <callout arearefs="ex-buildBowerComponents-1">
+ <para>
+ <varname>generated</varname> specifies the file which was created by <command>bower2nix</command>.
+ </para>
+ </callout>
+
+ <callout arearefs="ex-buildBowerComponents-2">
+ <para>
+ <varname>src</varname> is your project's sources. It needs to
+ contain a <filename>bower.json</filename> file.
+ </para>
+ </callout>
+</calloutlist>
+</para>
+
+<para>
+ <varname>buildBowerComponents</varname> will run Bower to link
+ together the output of <command>bower2nix</command>, resulting in a
+ <filename>bower_components</filename> directory which can be used.
+</para>
+
+<para>
+ Here is an example of a web frontend build process using
+ <command>gulp</command>. You might use <command>grunt</command>, or
+ anything else.
+</para>
+
+<example xml:id="ex-bowerGulpFile"><title>Example build script (<filename>gulpfile.js</filename>)</title>
+<programlisting language="javascript">
+<![CDATA[var gulp = require('gulp');
+
+gulp.task('default', [], function () {
+ gulp.start('build');
+});
+
+gulp.task('build', [], function () {
+ console.log("Just a dummy gulp build");
+ gulp
+ .src(["./bower_components/**/*"])
+ .pipe(gulp.dest("./gulpdist/"));
+});]]>
+</programlisting>
+</example>
+
+<example xml:id="ex-buildBowerComponentsDefaultNix">
+ <title>Full example — <filename>default.nix</filename></title>
+<programlisting language="nix">
+{ myWebApp ? { outPath = ./.; name = "myWebApp"; }
+, pkgs ? import &lt;nixpkgs&gt; {}
+}:
+
+pkgs.stdenv.mkDerivation {
+ name = "my-web-app-frontend";
+ src = myWebApp;
+
+ buildInputs = [ pkgs.nodePackages.gulp ];
+
+ bowerComponents = pkgs.buildBowerComponents { <co xml:id="ex-buildBowerComponentsDefault-1" />
+ name = "my-web-app";
+ generated = ./bower-packages.nix;
+ src = myWebApp;
+ };
+
+ buildPhase = ''
+ cp --reflink=auto --no-preserve=mode -R $bowerComponents/bower_components . <co xml:id="ex-buildBowerComponentsDefault-2" />
+ export HOME=$PWD <co xml:id="ex-buildBowerComponentsDefault-3" />
+ ${pkgs.nodePackages.gulp}/bin/gulp build <co xml:id="ex-buildBowerComponentsDefault-4" />
+ '';
+
+ installPhase = "mv gulpdist $out";
+}
+</programlisting>
+</example>
+
+<para>
+A few notes about <xref linkend="ex-buildBowerComponentsDefaultNix" />:
+
+<calloutlist>
+ <callout arearefs="ex-buildBowerComponentsDefault-1">
+ <para>
+ The result of <varname>buildBowerComponents</varname> is an
+ input to the frontend build.
+ </para>
+ </callout>
+
+ <callout arearefs="ex-buildBowerComponentsDefault-2">
+ <para>
+ Whether to symlink or copy the
+ <filename>bower_components</filename> directory depends on the
+ build tool in use. In this case a copy is used to avoid
+ <command>gulp</command> silliness with permissions.
+ </para>
+ </callout>
+
+ <callout arearefs="ex-buildBowerComponentsDefault-3">
+ <para>
+ <command>gulp</command> requires <varname>HOME</varname> to
+ refer to a writeable directory.
+ </para>
+ </callout>
+
+ <callout arearefs="ex-buildBowerComponentsDefault-4">
+ <para>
+ The actual build command. Other tools could be used.
+ </para>
+ </callout>
+</calloutlist>
+</para>
+</section>
+
+<section xml:id="ssec-bower2nix-troubleshooting">
+ <title>Troubleshooting</title>
+
+<variablelist>
+
+ <varlistentry>
+ <term>
+ <literal>ENOCACHE</literal> errors from
+ <varname>buildBowerComponents</varname>
+ </term>
+ <listitem>
+ <para>
+ This means that Bower was looking for a package version which
+ doesn't exist in the generated
+ <filename>bower-packages.nix</filename>.
+ </para>
+ <para>
+ If <filename>bower.json</filename> has been updated, then run
+ <command>bower2nix</command> again.
+ </para>
+ <para>
+ It could also be a bug in <command>bower2nix</command> or
+ <command>fetchbower</command>. If possible, try reformulating
+ the version specification in <filename>bower.json</filename>.
+ </para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+
+</section>
+
+</section>
diff --git a/doc/languages-frameworks/index.xml b/doc/languages-frameworks/index.xml
index e63ff3ab1407..395d46880217 100644
--- a/doc/languages-frameworks/index.xml
+++ b/doc/languages-frameworks/index.xml
@@ -23,22 +23,9 @@ such as Perl or Haskell. These are described in this chapter.</para>
<xi:include href="idris.xml" /> <!-- generated from ../../pkgs/development/idris-modules/README.md -->
<xi:include href="r.xml" /> <!-- generated from ../../pkgs/development/r-modules/README.md -->
<xi:include href="qt.xml" />
-
-
-<!--
-<section><title>Haskell</title>
-
-<para>TODO</para>
-
-</section>
-
-
-<section><title>TeX / LaTeX</title>
-
-<para>* Special support for building TeX documents</para>
-
-</section>
--->
+<xi:include href="texlive.xml" />
+<xi:include href="bower.xml" />
</chapter>
+
diff --git a/doc/languages-frameworks/ruby.xml b/doc/languages-frameworks/ruby.xml
index d81422b610ee..15c0802ad694 100644
--- a/doc/languages-frameworks/ruby.xml
+++ b/doc/languages-frameworks/ruby.xml
@@ -12,25 +12,26 @@
<screen>
<![CDATA[$ cd pkgs/servers/monitoring
$ mkdir sensu
+$ cd sensu
$ cat > Gemfile
source 'https://rubygems.org'
gem 'sensu'
-$ bundler package --path /tmp/vendor/bundle
+$ nix-shell -p bundler --command "bundler package --path /tmp/vendor/bundle"
$ $(nix-build '<nixpkgs>' -A bundix)/bin/bundix
$ cat > default.nix
{ lib, bundlerEnv, ruby }:
-bundlerEnv {
- name = "sensu-0.17.1";
+bundlerEnv rec {
+ name = "sensu-${version}";
+ version = (import gemset).sensu.version;
inherit ruby;
gemfile = ./Gemfile;
lockfile = ./Gemfile.lock;
gemset = ./gemset.nix;
meta = with lib; {
- description = "A monitoring framework that aims to be simple, malleable,
-and scalable.";
+ description = "A monitoring framework that aims to be simple, malleable, and scalable";
homepage = http://sensuapp.org/;
license = with licenses; mit;
maintainers = with maintainers; [ theuni ];
diff --git a/doc/languages-frameworks/texlive.xml b/doc/languages-frameworks/texlive.xml
new file mode 100644
index 000000000000..0e3c1dd13d72
--- /dev/null
+++ b/doc/languages-frameworks/texlive.xml
@@ -0,0 +1,59 @@
+<section xmlns="http://docbook.org/ns/docbook"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xml:id="sec-language-texlive">
+
+<title>TeX Live</title>
+
+<para>Since release 15.09 there is a new TeX Live packaging that lives entirely under attribute <varname>texlive</varname>.</para>
+<section><title>User's guide</title>
+ <itemizedlist>
+ <listitem><para>
+ For basic usage just pull <varname>texlive.combined.scheme-basic</varname> for an environment with basic LaTeX support.</para></listitem>
+ <listitem><para>
+ It typically won't work to use separately installed packages together.
+ Instead, you can build a custom set of packages like this:
+ <programlisting>
+texlive.combine {
+ inherit (texlive) scheme-small collection-langkorean algorithms cm-super;
+}
+ </programlisting>
+ There are all the schemes, collections and a few thousand packages, as defined upstream (perhaps with tiny differences).
+ </para></listitem>
+ <listitem><para>
+ By default you only get executables and files needed during runtime, and a little documentation for the core packages. To change that, you need to add <varname>pkgFilter</varname> function to <varname>combine</varname>.
+ <programlisting>
+texlive.combine {
+ # inherit (texlive) whatever-you-want;
+ pkgFilter = pkg:
+ pkg.tlType == "run" || pkg.tlType == "bin" || pkg.pname == "cm-super";
+ # elem tlType [ "run" "bin" "doc" "source" ]
+ # there are also other attributes: version, name
+}
+ </programlisting>
+ </para></listitem>
+ <listitem><para>
+ You can list packages e.g. by <command>nix-repl</command>.
+ <programlisting>
+$ nix-repl
+nix-repl> texlive.collection-&lt;TAB>
+ </programlisting>
+ </para></listitem>
+ </itemizedlist>
+</section>
+
+<section><title>Known problems</title>
+ <itemizedlist>
+ <listitem><para>
+ Some tools are still missing, e.g. luajittex;</para></listitem>
+ <listitem><para>
+ some apps aren't packaged/tested yet (asymptote, biber, etc.);</para></listitem>
+ <listitem><para>
+ feature/bug: when a package is rejected by <varname>pkgFilter</varname>, its dependencies are still propagated;</para></listitem>
+ <listitem><para>
+ in case of any bugs or feature requests, file a github issue or better a pull request and /cc @vcunat.</para></listitem>
+ </itemizedlist>
+</section>
+
+
+</section>
+