93 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			XML
		
	
	
	
	
	
| <chapter>
 | |
|   <title>Introduction</title>
 | |
| 
 | |
|   <epigraph>
 | |
|     <para><quote>The number of Nix installations in the world has grown to 5,
 | |
|         with more expected.</quote></para>
 | |
|   </epigraph>
 | |
| 
 | |
|   <para>
 | |
|     Nix is a system for software deployment.  It supports the
 | |
|     creation and distribution of software packages, as well as the installation
 | |
|     and subsequent management of these on target machines (i.e., it is also a
 | |
|     package manager).
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     Nix solves some large problems that exist in most current deployment and
 | |
|     package management systems.  <emphasis>Dependency determination</emphasis>
 | |
|     is a big one: the correct installation of a software component requires
 | |
|     that all dependencies of that component (i.e., other components used by it)
 | |
|     are also installed.  Most systems have no way to verify that the specified
 | |
|     dependencies of a component are actually sufficient.
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     Another big problem is the lack of support for concurrent availability of
 | |
|     multiple <emphasis>variants</emphasis> of a component.  It must be possible
 | |
|     to have several versions of a component installed at the same time, or
 | |
|     several instances of the same version built with different parameters.
 | |
|     Unfortunately, components are in general not properly isolated from each
 | |
|     other.  For instance, upgrading a component that is a dependency for some
 | |
|     other component might break the latter.
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     Nix solves these problems by building and storing packages in paths that
 | |
|     are infeasible to predict in advance.  For example, the artifacts of a
 | |
|     package <literal>X</literal> might be stored in
 | |
|     <filename>/nix/store/d58a0606ed616820de291d594602665d-X</filename>, rather
 | |
|     than in, say, <filename>/usr/lib</filename>.  The path component
 | |
|     <filename>d58a...</filename> is actually a cryptographic hash of all the
 | |
|     inputs (i.e., sources, requisites, and build flags) used in building
 | |
|     <literal>X</literal>, and as such is very fragile: any change to the inputs
 | |
|     will change the hash.  Therefore it is not sensible to
 | |
|     <emphasis>hard-code</emphasis> such a path into the build scripts of a
 | |
|     package <literal>Y</literal> that uses <literal>X</literal> (as does happen
 | |
|     with <quote>fixed</quote> paths such as <filename>/usr/lib</filename>).
 | |
|     Rather, the build script of package <literal>Y</literal> is parameterised
 | |
|     with the actual location of <literal>X</literal>, which is supplied by the
 | |
|     Nix system.
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     As stated above, the path name of a file system object contain a
 | |
|     cryptographic hash of all inputs involved in building it.  A change to any
 | |
|     of the inputs will cause the hash to change--and by extension, the path
 | |
|     name.  These inputs include both sources (variation in time) and
 | |
|     configuration options (variation in space).  Therefore variants of the same
 | |
|     package don't clash---they can co-exist peacefully within the same file
 | |
|     system.
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     Other features:
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     <emphasis>Transparent source/binary deployment.</emphasis>
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     <emphasis>Unambiguous identification of configuration.</emphasis>
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     <emphasis>Automatic storage management.</emphasis>
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     <emphasis>Atomic upgrades and rollbacks.</emphasis>
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     <emphasis>Support for many simultaneous configurations.</emphasis>
 | |
|   </para>
 | |
| 
 | |
|   <para>
 | |
|     <emphasis>Portability.</emphasis>  Nix is quite portable.  Contrary to
 | |
|     build systems like those in, e.g., Vesta and ClearCase, it does not rely on
 | |
|     operating system extensions.
 | |
|   </para>
 | |
| 
 | |
| </chapter>
 |