* Get rid of nix-pack-closure / nix-unpack-closure, they're redundant.
This commit is contained in:
parent
3f4ed681c2
commit
fa791116a3
8 changed files with 7 additions and 298 deletions
|
@ -14,7 +14,6 @@ XSLTPROC = $(xsltproc) $(xmlflags) \
|
||||||
man1_MANS = nix-env.1 nix-build.1 nix-store.1 nix-instantiate.1 \
|
man1_MANS = nix-env.1 nix-build.1 nix-store.1 nix-instantiate.1 \
|
||||||
nix-collect-garbage.1 nix-push.1 nix-pull.1 \
|
nix-collect-garbage.1 nix-push.1 nix-pull.1 \
|
||||||
nix-prefetch-url.1 nix-channel.1 \
|
nix-prefetch-url.1 nix-channel.1 \
|
||||||
nix-pack-closure.1 nix-unpack-closure.1 \
|
|
||||||
nix-install-package.1 nix-hash.1 nix-copy-closure.1
|
nix-install-package.1 nix-hash.1 nix-copy-closure.1
|
||||||
|
|
||||||
FIGURES = figures/user-environments.png
|
FIGURES = figures/user-environments.png
|
||||||
|
|
|
@ -89,10 +89,6 @@
|
||||||
<title>nix-install-package</title>
|
<title>nix-install-package</title>
|
||||||
<xi:include href="nix-install-package.xml" />
|
<xi:include href="nix-install-package.xml" />
|
||||||
</section>
|
</section>
|
||||||
<section xml:id="sec-nix-pack-closure">
|
|
||||||
<title>nix-pack-closure</title>
|
|
||||||
<xi:include href="nix-pack-closure.xml" />
|
|
||||||
</section>
|
|
||||||
<section xml:id="sec-nix-prefetch-url">
|
<section xml:id="sec-nix-prefetch-url">
|
||||||
<title>nix-prefetch-url</title>
|
<title>nix-prefetch-url</title>
|
||||||
<xi:include href="nix-prefetch-url.xml" />
|
<xi:include href="nix-prefetch-url.xml" />
|
||||||
|
@ -105,10 +101,6 @@
|
||||||
<title>nix-push</title>
|
<title>nix-push</title>
|
||||||
<xi:include href="nix-push.xml" />
|
<xi:include href="nix-push.xml" />
|
||||||
</section>
|
</section>
|
||||||
<section xml:id="sec-nix-unpack-closure">
|
|
||||||
<title>nix-unpack-closure</title>
|
|
||||||
<xi:include href="nix-unpack-closure.xml" />
|
|
||||||
</section>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
</appendix>
|
</appendix>
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
<refentry xmlns="http://docbook.org/ns/docbook"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
||||||
|
|
||||||
<refmeta>
|
|
||||||
<refentrytitle>nix-pack-closure</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
<refmiscinfo class="source">Nix</refmiscinfo>
|
|
||||||
<refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo>
|
|
||||||
</refmeta>
|
|
||||||
|
|
||||||
<refnamediv>
|
|
||||||
<refname>nix-pack-closure</refname>
|
|
||||||
<refpurpose>pack the closure of a store path into a single file that
|
|
||||||
can be unpacked with
|
|
||||||
<command>nix-unpack-closure</command></refpurpose>
|
|
||||||
</refnamediv>
|
|
||||||
|
|
||||||
<refsynopsisdiv>
|
|
||||||
<cmdsynopsis>
|
|
||||||
<command>nix-pack-closure</command>
|
|
||||||
<arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
|
|
||||||
</cmdsynopsis>
|
|
||||||
</refsynopsisdiv>
|
|
||||||
|
|
||||||
|
|
||||||
<refsection><title>Description</title>
|
|
||||||
|
|
||||||
<para>The command <command>nix-pack-closure</command> packs the
|
|
||||||
contents of the store paths <replaceable>paths</replaceable> and
|
|
||||||
<emphasis>all their dependencies</emphasis> into a single file, which
|
|
||||||
is written to standard output. (That is, it
|
|
||||||
<emphasis>serialises</emphasis> <replaceable>paths</replaceable>.)
|
|
||||||
The output can then be unpacked into the Nix store of another machine
|
|
||||||
using <command>nix-unpack-closure</command>.</para>
|
|
||||||
|
|
||||||
<para>Together, <command>nix-pack-closure</command> and
|
|
||||||
<command>nix-unpack-closure</command> provide a quick and easy way to
|
|
||||||
deploy a package to a different machine. However, as the output of
|
|
||||||
<command>nix-pack-closure</command> tends to be rather large (since it
|
|
||||||
contains all dependencies), it’s not very efficient.
|
|
||||||
<command>nix-push</command> and <command>nix-pull</command> are more
|
|
||||||
efficient, but are also a bit more cumbersome to use.</para>
|
|
||||||
|
|
||||||
</refsection>
|
|
||||||
|
|
||||||
|
|
||||||
<refsection><title>Examples</title>
|
|
||||||
|
|
||||||
<para>To copy some instance of Subversion with all its dependencies to
|
|
||||||
another machine:
|
|
||||||
|
|
||||||
<screen>
|
|
||||||
$ nix-pack-closure /nix/store/hj232g1r...-subversion-1.3.0 > svn.closure
|
|
||||||
|
|
||||||
<lineannotation>Copy <!-- !!! <filename> -->svn.closure to the remote machine, then on the remote machine do:</lineannotation>
|
|
||||||
$ nix-unpack-closure < svn.closure</screen>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>Copy the program <command>azureus</command> with all its
|
|
||||||
dependencies to the machine <literal>scratchy</literal>:
|
|
||||||
|
|
||||||
<screen>
|
|
||||||
$ nix-pack-closure $(which azureus) | ssh scratchy nix-unpack-closure</screen>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
|
|
||||||
<para>As a variation on the previous example, copy
|
|
||||||
<command>azureus</command>, and also install it in the user’s profile
|
|
||||||
on the target machine:
|
|
||||||
|
|
||||||
<screen>
|
|
||||||
$ nix-pack-closure $(which azureus) | ssh scratchy 'nix-env -i $(nix-unpack-closure)'</screen>
|
|
||||||
|
|
||||||
</para>
|
|
||||||
|
|
||||||
|
|
||||||
</refsection>
|
|
||||||
|
|
||||||
|
|
||||||
</refentry>
|
|
|
@ -1,42 +0,0 @@
|
||||||
<refentry xmlns="http://docbook.org/ns/docbook"
|
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
||||||
xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
||||||
|
|
||||||
<refmeta>
|
|
||||||
<refentrytitle>nix-unpack-closure</refentrytitle>
|
|
||||||
<manvolnum>1</manvolnum>
|
|
||||||
<refmiscinfo class="source">Nix</refmiscinfo>
|
|
||||||
<refmiscinfo class="version"><xi:include href="version.txt" parse="text"/></refmiscinfo>
|
|
||||||
</refmeta>
|
|
||||||
|
|
||||||
<refnamediv>
|
|
||||||
<refname>nix-unpack-closure</refname>
|
|
||||||
<refpurpose>unpack the closure of a store path created by <command>nix-pack-closure</command> into the Nix store</refpurpose>
|
|
||||||
</refnamediv>
|
|
||||||
|
|
||||||
<refsynopsisdiv>
|
|
||||||
<cmdsynopsis>
|
|
||||||
<command>nix-unpack-closure</command>
|
|
||||||
</cmdsynopsis>
|
|
||||||
</refsynopsisdiv>
|
|
||||||
|
|
||||||
|
|
||||||
<refsection><title>Description</title>
|
|
||||||
|
|
||||||
<para>The command <command>nix-unpack-closure</command> unpacks the
|
|
||||||
closure of a set of store paths created by
|
|
||||||
<command>nix-pack-closure</command> into the local Nix store. The
|
|
||||||
closure is a single file read from standard input. See the
|
|
||||||
description of <command>nix-pack-closure</command> for details and
|
|
||||||
examples.</para>
|
|
||||||
|
|
||||||
<para>The top-level paths in the closure (i.e., the paths passed to
|
|
||||||
the original <command>nix-pack-closure</command> call that created the
|
|
||||||
closure) are printed on standard output. These paths can be passed,
|
|
||||||
for instance, to <literal>nix-env -i</literal> to install them into a
|
|
||||||
user environment on the target machine.</para>
|
|
||||||
|
|
||||||
</refsection>
|
|
||||||
|
|
||||||
|
|
||||||
</refentry>
|
|
|
@ -47,6 +47,13 @@
|
||||||
<listitem><para><command>nix-prefetch-url</command> now supports
|
<listitem><para><command>nix-prefetch-url</command> now supports
|
||||||
<literal>mirror://</literal> URLs.</para></listitem>
|
<literal>mirror://</literal> URLs.</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para>Removed the commands
|
||||||
|
<command>nix-pack-closure</command> and
|
||||||
|
<command>nix-unpack-closure</command>. You can do almost the same
|
||||||
|
thing but much more efficiently by doing <literal>nix-store --export
|
||||||
|
$(nix-store -qR <replaceable>paths</replaceable>) > closure</literal> and
|
||||||
|
<literal>nix-store --import < closure</literal>.</para></listitem>
|
||||||
|
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
bin_SCRIPTS = nix-collect-garbage \
|
bin_SCRIPTS = nix-collect-garbage \
|
||||||
nix-pull nix-push nix-prefetch-url \
|
nix-pull nix-push nix-prefetch-url \
|
||||||
nix-install-package nix-channel nix-build \
|
nix-install-package nix-channel nix-build \
|
||||||
nix-pack-closure nix-unpack-closure \
|
|
||||||
nix-copy-closure
|
nix-copy-closure
|
||||||
|
|
||||||
noinst_SCRIPTS = nix-profile.sh generate-patches.pl \
|
noinst_SCRIPTS = nix-profile.sh generate-patches.pl \
|
||||||
|
@ -36,7 +35,6 @@ EXTRA_DIST = nix-collect-garbage.in \
|
||||||
download-using-manifests.pl.in \
|
download-using-manifests.pl.in \
|
||||||
copy-from-other-stores.pl.in \
|
copy-from-other-stores.pl.in \
|
||||||
generate-patches.pl.in \
|
generate-patches.pl.in \
|
||||||
nix-pack-closure.in nix-unpack-closure.in \
|
|
||||||
nix-copy-closure.in \
|
nix-copy-closure.in \
|
||||||
find-runtime-roots.pl.in \
|
find-runtime-roots.pl.in \
|
||||||
build-remote.pl.in \
|
build-remote.pl.in \
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
#! @perl@ -w
|
|
||||||
|
|
||||||
# This tool computes the closure of a path (using "nix-store --query
|
|
||||||
# --requisites") and puts the contents of each path in the closure in
|
|
||||||
# a big NAR archive that can be installed on another Nix installation
|
|
||||||
# using "nix-unpack-closure".
|
|
||||||
|
|
||||||
# TODO: make this program "streamy", i.e., don't use a temporary
|
|
||||||
# directory.
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use File::Temp qw(tempdir);
|
|
||||||
|
|
||||||
my $binDir = $ENV{"NIX_BIN_DIR"};
|
|
||||||
$binDir = "@bindir@" unless defined $binDir;
|
|
||||||
|
|
||||||
my $tmpDir = tempdir("nix-pack-closure.XXXXXX", CLEANUP => 1, TMPDIR => 1)
|
|
||||||
or die "cannot create a temporary directory";
|
|
||||||
|
|
||||||
mkdir "$tmpDir/contents", 0755 or die;
|
|
||||||
mkdir "$tmpDir/references", 0755 or die;
|
|
||||||
mkdir "$tmpDir/derivers", 0755 or die;
|
|
||||||
|
|
||||||
open TOPLEVEL, ">$tmpDir/top-level" or die;
|
|
||||||
|
|
||||||
|
|
||||||
my %storePaths;
|
|
||||||
|
|
||||||
|
|
||||||
while (@ARGV) {
|
|
||||||
my $storePath = shift @ARGV;
|
|
||||||
|
|
||||||
# $storePath might be a symlink to the store, so resolve it.
|
|
||||||
$storePath = (`$binDir/nix-store --query --resolve '$storePath'`
|
|
||||||
or die "cannot resolve `$storePath'");
|
|
||||||
chomp $storePath;
|
|
||||||
print TOPLEVEL $storePath, "\n";
|
|
||||||
|
|
||||||
# Get the closure of this path.
|
|
||||||
my $pid = open(READ,
|
|
||||||
"$binDir/nix-store --query --requisites '$storePath'|") or die;
|
|
||||||
|
|
||||||
while (<READ>) {
|
|
||||||
chomp;
|
|
||||||
die "bad: $_" unless /^\//;
|
|
||||||
$storePaths{$_} = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
close READ or die "nix-store failed: $?";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
close TOPLEVEL or die;
|
|
||||||
|
|
||||||
|
|
||||||
foreach my $storePath (sort(keys %storePaths)) {
|
|
||||||
print STDERR "packing `$storePath'...\n";
|
|
||||||
|
|
||||||
$storePath =~ /\/([^\/]+)$/;
|
|
||||||
my $name = $1;
|
|
||||||
|
|
||||||
system("$binDir/nix-store --dump '$storePath' > $tmpDir/contents/$name") == 0
|
|
||||||
or die "nix-store --dump failed on `$storePath': $?";
|
|
||||||
|
|
||||||
system("$binDir/nix-store --query --references '$storePath' > $tmpDir/references/$name") == 0
|
|
||||||
or die "nix-store --query --references failed on `$storePath': $?";
|
|
||||||
|
|
||||||
system("$binDir/nix-store --query --deriver '$storePath' > $tmpDir/derivers/$name") == 0
|
|
||||||
or die "nix-store --query --deriver failed on `$storePath': $?";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# Write a NAR archive of everything to standard output.
|
|
||||||
system("nix-store --dump '$tmpDir'") == 0
|
|
||||||
or die "nix-store --dump failed";
|
|
|
@ -1,88 +0,0 @@
|
||||||
#! @perl@ -w
|
|
||||||
|
|
||||||
# This tool unpacks the closures created by "nix-pack-closure" and
|
|
||||||
# adds them to the Nix store.
|
|
||||||
|
|
||||||
# TODO: make this program "streamy", i.e., don't use a temporary
|
|
||||||
# directory.
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use File::Temp qw(tempdir);
|
|
||||||
|
|
||||||
my $binDir = $ENV{"NIX_BIN_DIR"};
|
|
||||||
$binDir = "@bindir@" unless defined $binDir;
|
|
||||||
|
|
||||||
my $tmpDir = tempdir("nix-unpack-closure.XXXXXX", CLEANUP => 1, TMPDIR => 1)
|
|
||||||
or die "cannot create a temporary directory";
|
|
||||||
|
|
||||||
|
|
||||||
# Unpack the NAR archive on standard input.
|
|
||||||
system("nix-store --restore '$tmpDir/unpacked'") == 0
|
|
||||||
or die "nix-store --restore failed";
|
|
||||||
|
|
||||||
|
|
||||||
open VALID, ">$tmpDir/validity" or die;
|
|
||||||
|
|
||||||
|
|
||||||
# For each path in the closure that is not yet valid, add it to the
|
|
||||||
# store. TODO: use proper locking. Or even better, let nix-store do
|
|
||||||
# this.
|
|
||||||
opendir(DIR, "$tmpDir/unpacked/contents") or die "cannot open directory: $!";
|
|
||||||
|
|
||||||
foreach my $name (sort(readdir DIR)) {
|
|
||||||
next if $name eq "." or $name eq "..";
|
|
||||||
|
|
||||||
my $storePath = "@storedir@/$name"; # !!!
|
|
||||||
|
|
||||||
# !!! this really isn't a good validity check!
|
|
||||||
system "$binDir/nix-store --check-validity '$storePath' 2> /dev/null";
|
|
||||||
if ($? != 0) {
|
|
||||||
print STDERR "unpacking `$storePath'...\n";
|
|
||||||
|
|
||||||
# !!! race
|
|
||||||
system("@coreutils@/rm -rf '$storePath'") == 0
|
|
||||||
or die "cannot remove `$storePath': $?";
|
|
||||||
|
|
||||||
system("$binDir/nix-store --restore '$storePath' < '$tmpDir/unpacked/contents/$name'") == 0
|
|
||||||
or die "nix-store --dump failed on `$storePath': $?";
|
|
||||||
|
|
||||||
print VALID "$storePath\n";
|
|
||||||
|
|
||||||
open DRV, "<$tmpDir/unpacked/derivers/$name" or die;
|
|
||||||
my $deriver = <DRV>;
|
|
||||||
chomp $deriver;
|
|
||||||
$deriver = "" if $deriver eq "unknown-deriver";
|
|
||||||
close DRV;
|
|
||||||
|
|
||||||
my @refs;
|
|
||||||
open REFS, "<$tmpDir/unpacked/references/$name" or die;
|
|
||||||
while (<REFS>) {
|
|
||||||
chomp;
|
|
||||||
push @refs, $_;
|
|
||||||
}
|
|
||||||
close REFS;
|
|
||||||
|
|
||||||
print VALID "$deriver\n";
|
|
||||||
|
|
||||||
print VALID (scalar @refs), "\n";
|
|
||||||
foreach my $ref (@refs) {
|
|
||||||
print VALID "$ref\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
closedir(DIR) or die;
|
|
||||||
|
|
||||||
|
|
||||||
# Register the invalid paths as valid.
|
|
||||||
system("nix-store --register-validity <'$tmpDir/validity'") == 0
|
|
||||||
or die "nix-store --register-validity failed";
|
|
||||||
|
|
||||||
|
|
||||||
# Show the top-level paths so that something useful can be done with
|
|
||||||
# them, e.g., passing them to `nix-env -i'.
|
|
||||||
if (-e "$tmpDir/unpacked/top-level") {
|
|
||||||
open TOPLEVEL, "<$tmpDir/unpacked/top-level" or die;
|
|
||||||
while (<TOPLEVEL>) { print "$_"; }
|
|
||||||
close TOPLEVEL;
|
|
||||||
}
|
|
Loading…
Reference in a new issue