Fix problem building sha3 node module in make setup

This commit is contained in:
Pedro Pombeiro 2019-03-01 19:01:33 +01:00
parent 692de32931
commit 2e7891406b
No known key found for this signature in database
GPG Key ID: C4A24185B2AA48A1
8 changed files with 1048 additions and 7 deletions

View File

@ -5,7 +5,13 @@ let
rev = "168cbb39691cca2822ce1fdb3e8c0183af5c6d0d"; rev = "168cbb39691cca2822ce1fdb3e8c0183af5c6d0d";
sha256 = "0fqasswfqrz2rbag9bz17j8y7615s0p9l23cw4sk2f384gk0zf6c"; sha256 = "0fqasswfqrz2rbag9bz17j8y7615s0p9l23cw4sk2f384gk0zf6c";
}) { config = { }; }; }) { config = { }; };
nodejs = pkgs."nodejs-10_x";
nodeInputs = import ./scripts/lib/setup/nix/global-node-packages/output {
# The remaining dependencies come from Nixpkgs
inherit pkgs;
inherit nodejs;
};
nodePkgs = (map (x: nodeInputs."${x}") (builtins.attrNames nodeInputs));
in pkgs.stdenv.mkDerivation rec { in pkgs.stdenv.mkDerivation rec {
name = "env"; name = "env";
env = pkgs.buildEnv { name = name; paths = buildInputs; }; env = pkgs.buildEnv { name = name; paths = buildInputs; };
@ -27,7 +33,8 @@ in pkgs.stdenv.mkDerivation rec {
unzip unzip
wget wget
yarn yarn
] ++ statusDesktopBuildInputs ] ++ nodePkgs
++ statusDesktopBuildInputs
++ stdenv.lib.optional stdenv.isDarwin cocoapods; ++ stdenv.lib.optional stdenv.isDarwin cocoapods;
shellHook = with pkgs; '' shellHook = with pkgs; ''
local toolversion="$(git rev-parse --show-toplevel)/scripts/toolversion" local toolversion="$(git rev-parse --show-toplevel)/scripts/toolversion"
@ -42,4 +49,4 @@ in pkgs.stdenv.mkDerivation rec {
[ -d "$ANDROID_NDK_ROOT" ] || ./scripts/setup # we assume that if the NDK dir does not exist, make setup needs to be run [ -d "$ANDROID_NDK_ROOT" ] || ./scripts/setup # we assume that if the NDK dir does not exist, make setup needs to be run
''; '';
} }

View File

@ -0,0 +1,13 @@
# Abstract
The purpose of this folder is to allow some tools such as `react-native` to be installed globally through Nix instead of resorting to `npm install -g` (which is not allowed in a Nix environment). We get around that by using the [node2nix tool](https://github.com/svanderburg/node2nix).
## Inputs
The inputs are listed in `node-packages.json`.
## Generating the nix expressions
``` shell
node2nix --nodejs-10 --bypass-cache -i node-packages.json
```

View File

@ -0,0 +1,24 @@
#!/usr/bin/env bash
GIT_ROOT=$(git rev-parse --show-toplevel)
SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"
toolversion="${GIT_ROOT}/scripts/toolversion"
dir="$SCRIPTPATH"
input="${dir}/output/node-packages.json"
output_dir="${dir}/output"
rm -rf $output_dir && mkdir -p $output_dir
react_native_cli_required_version=$($toolversion react_native_cli)
cat << EOF > $input
[
{ "react-native-cli": "${react_native_cli_required_version}" }
]
EOF
node_required_version=$($toolversion node)
node_major_version=$(echo $node_required_version | cut -d. -f1,1)
node2nix --nodejs-${node_major_version} --bypass-cache -i $input \
-o $output_dir/node-packages.nix \
-c $output_dir/default.nix \
-e $output_dir/node-env.nix
rm $input

View File

@ -0,0 +1,17 @@
# This file has been generated by node2nix 1.6.0. Do not edit!
{pkgs ? import <nixpkgs> {
inherit system;
}, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-10_x"}:
let
nodeEnv = import ./node-env.nix {
inherit (pkgs) stdenv python2 utillinux runCommand writeTextFile;
inherit nodejs;
libtool = if pkgs.stdenv.isDarwin then pkgs.darwin.cctools else null;
};
in
import ./node-packages.nix {
inherit (pkgs) fetchurl fetchgit;
inherit nodeEnv;
}

View File

@ -0,0 +1,542 @@
# This file originates from node2nix
{stdenv, nodejs, python2, utillinux, libtool, runCommand, writeTextFile}:
let
python = if nodejs ? python then nodejs.python else python2;
# Create a tar wrapper that filters all the 'Ignoring unknown extended header keyword' noise
tarWrapper = runCommand "tarWrapper" {} ''
mkdir -p $out/bin
cat > $out/bin/tar <<EOF
#! ${stdenv.shell} -e
$(type -p tar) "\$@" --warning=no-unknown-keyword
EOF
chmod +x $out/bin/tar
'';
# Function that generates a TGZ file from a NPM project
buildNodeSourceDist =
{ name, version, src, ... }:
stdenv.mkDerivation {
name = "node-tarball-${name}-${version}";
inherit src;
buildInputs = [ nodejs ];
buildPhase = ''
export HOME=$TMPDIR
tgzFile=$(npm pack | tail -n 1) # Hooks to the pack command will add output (https://docs.npmjs.com/misc/scripts)
'';
installPhase = ''
mkdir -p $out/tarballs
mv $tgzFile $out/tarballs
mkdir -p $out/nix-support
echo "file source-dist $out/tarballs/$tgzFile" >> $out/nix-support/hydra-build-products
'';
};
includeDependencies = {dependencies}:
stdenv.lib.optionalString (dependencies != [])
(stdenv.lib.concatMapStrings (dependency:
''
# Bundle the dependencies of the package
mkdir -p node_modules
cd node_modules
# Only include dependencies if they don't exist. They may also be bundled in the package.
if [ ! -e "${dependency.name}" ]
then
${composePackage dependency}
fi
cd ..
''
) dependencies);
# Recursively composes the dependencies of a package
composePackage = { name, packageName, src, dependencies ? [], ... }@args:
''
DIR=$(pwd)
cd $TMPDIR
unpackFile ${src}
# Make the base dir in which the target dependency resides first
mkdir -p "$(dirname "$DIR/${packageName}")"
if [ -f "${src}" ]
then
# Figure out what directory has been unpacked
packageDir="$(find . -maxdepth 1 -type d | tail -1)"
# Restore write permissions to make building work
find "$packageDir" -type d -print0 | xargs -0 chmod u+x
chmod -R u+w "$packageDir"
# Move the extracted tarball into the output folder
mv "$packageDir" "$DIR/${packageName}"
elif [ -d "${src}" ]
then
# Get a stripped name (without hash) of the source directory.
# On old nixpkgs it's already set internally.
if [ -z "$strippedName" ]
then
strippedName="$(stripHash ${src})"
fi
# Restore write permissions to make building work
chmod -R u+w "$strippedName"
# Move the extracted directory into the output folder
mv "$strippedName" "$DIR/${packageName}"
fi
# Unset the stripped name to not confuse the next unpack step
unset strippedName
# Include the dependencies of the package
cd "$DIR/${packageName}"
${includeDependencies { inherit dependencies; }}
cd ..
${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
'';
pinpointDependencies = {dependencies, production}:
let
pinpointDependenciesFromPackageJSON = writeTextFile {
name = "pinpointDependencies.js";
text = ''
var fs = require('fs');
var path = require('path');
function resolveDependencyVersion(location, name) {
if(location == process.env['NIX_STORE']) {
return null;
} else {
var dependencyPackageJSON = path.join(location, "node_modules", name, "package.json");
if(fs.existsSync(dependencyPackageJSON)) {
var dependencyPackageObj = JSON.parse(fs.readFileSync(dependencyPackageJSON));
if(dependencyPackageObj.name == name) {
return dependencyPackageObj.version;
}
} else {
return resolveDependencyVersion(path.resolve(location, ".."), name);
}
}
}
function replaceDependencies(dependencies) {
if(typeof dependencies == "object" && dependencies !== null) {
for(var dependency in dependencies) {
var resolvedVersion = resolveDependencyVersion(process.cwd(), dependency);
if(resolvedVersion === null) {
process.stderr.write("WARNING: cannot pinpoint dependency: "+dependency+", context: "+process.cwd()+"\n");
} else {
dependencies[dependency] = resolvedVersion;
}
}
}
}
/* Read the package.json configuration */
var packageObj = JSON.parse(fs.readFileSync('./package.json'));
/* Pinpoint all dependencies */
replaceDependencies(packageObj.dependencies);
if(process.argv[2] == "development") {
replaceDependencies(packageObj.devDependencies);
}
replaceDependencies(packageObj.optionalDependencies);
/* Write the fixed package.json file */
fs.writeFileSync("package.json", JSON.stringify(packageObj, null, 2));
'';
};
in
''
node ${pinpointDependenciesFromPackageJSON} ${if production then "production" else "development"}
${stdenv.lib.optionalString (dependencies != [])
''
if [ -d node_modules ]
then
cd node_modules
${stdenv.lib.concatMapStrings (dependency: pinpointDependenciesOfPackage dependency) dependencies}
cd ..
fi
''}
'';
# Recursively traverses all dependencies of a package and pinpoints all
# dependencies in the package.json file to the versions that are actually
# being used.
pinpointDependenciesOfPackage = { packageName, dependencies ? [], production ? true, ... }@args:
''
if [ -d "${packageName}" ]
then
cd "${packageName}"
${pinpointDependencies { inherit dependencies production; }}
cd ..
${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
fi
'';
# Extract the Node.js source code which is used to compile packages with
# native bindings
nodeSources = runCommand "node-sources" {} ''
tar --no-same-owner --no-same-permissions -xf ${nodejs.src}
mv node-* $out
'';
# Script that adds _integrity fields to all package.json files to prevent NPM from consulting the cache (that is empty)
addIntegrityFieldsScript = writeTextFile {
name = "addintegrityfields.js";
text = ''
var fs = require('fs');
var path = require('path');
function augmentDependencies(baseDir, dependencies) {
for(var dependencyName in dependencies) {
var dependency = dependencies[dependencyName];
// Open package.json and augment metadata fields
var packageJSONDir = path.join(baseDir, "node_modules", dependencyName);
var packageJSONPath = path.join(packageJSONDir, "package.json");
if(fs.existsSync(packageJSONPath)) { // Only augment packages that exist. Sometimes we may have production installs in which development dependencies can be ignored
console.log("Adding metadata fields to: "+packageJSONPath);
var packageObj = JSON.parse(fs.readFileSync(packageJSONPath));
if(dependency.integrity) {
packageObj["_integrity"] = dependency.integrity;
} else {
packageObj["_integrity"] = "sha1-000000000000000000000000000="; // When no _integrity string has been provided (e.g. by Git dependencies), add a dummy one. It does not seem to harm and it bypasses downloads.
}
packageObj["_resolved"] = dependency.version; // Set the resolved version to the version identifier. This prevents NPM from cloning Git repositories.
fs.writeFileSync(packageJSONPath, JSON.stringify(packageObj, null, 2));
}
// Augment transitive dependencies
if(dependency.dependencies !== undefined) {
augmentDependencies(packageJSONDir, dependency.dependencies);
}
}
}
if(fs.existsSync("./package-lock.json")) {
var packageLock = JSON.parse(fs.readFileSync("./package-lock.json"));
if(packageLock.lockfileVersion !== 1) {
process.stderr.write("Sorry, I only understand lock file version 1!\n");
process.exit(1);
}
if(packageLock.dependencies !== undefined) {
augmentDependencies(".", packageLock.dependencies);
}
}
'';
};
# Reconstructs a package-lock file from the node_modules/ folder structure and package.json files with dummy sha1 hashes
reconstructPackageLock = writeTextFile {
name = "addintegrityfields.js";
text = ''
var fs = require('fs');
var path = require('path');
var packageObj = JSON.parse(fs.readFileSync("package.json"));
var lockObj = {
name: packageObj.name,
version: packageObj.version,
lockfileVersion: 1,
requires: true,
dependencies: {}
};
function augmentPackageJSON(filePath, dependencies) {
var packageJSON = path.join(filePath, "package.json");
if(fs.existsSync(packageJSON)) {
var packageObj = JSON.parse(fs.readFileSync(packageJSON));
dependencies[packageObj.name] = {
version: packageObj.version,
integrity: "sha1-000000000000000000000000000=",
dependencies: {}
};
processDependencies(path.join(filePath, "node_modules"), dependencies[packageObj.name].dependencies);
}
}
function processDependencies(dir, dependencies) {
if(fs.existsSync(dir)) {
var files = fs.readdirSync(dir);
files.forEach(function(entry) {
var filePath = path.join(dir, entry);
var stats = fs.statSync(filePath);
if(stats.isDirectory()) {
if(entry.substr(0, 1) == "@") {
// When we encounter a namespace folder, augment all packages belonging to the scope
var pkgFiles = fs.readdirSync(filePath);
pkgFiles.forEach(function(entry) {
if(stats.isDirectory()) {
var pkgFilePath = path.join(filePath, entry);
augmentPackageJSON(pkgFilePath, dependencies);
}
});
} else {
augmentPackageJSON(filePath, dependencies);
}
}
});
}
}
processDependencies("node_modules", lockObj.dependencies);
fs.writeFileSync("package-lock.json", JSON.stringify(lockObj, null, 2));
'';
};
# Builds and composes an NPM package including all its dependencies
buildNodePackage =
{ name
, packageName
, version
, dependencies ? []
, buildInputs ? []
, production ? true
, npmFlags ? ""
, dontNpmInstall ? false
, bypassCache ? false
, preRebuild ? ""
, dontStrip ? true
, unpackPhase ? "true"
, buildPhase ? "true"
, ... }@args:
let
forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" "dontStrip" "dontNpmInstall" "preRebuild" "unpackPhase" "buildPhase" ];
in
stdenv.mkDerivation ({
name = "node-${name}-${version}";
buildInputs = [ tarWrapper python nodejs ]
++ stdenv.lib.optional (stdenv.isLinux) utillinux
++ stdenv.lib.optional (stdenv.isDarwin) libtool
++ buildInputs;
inherit dontStrip; # Stripping may fail a build for some package deployments
inherit dontNpmInstall preRebuild unpackPhase buildPhase;
compositionScript = composePackage args;
pinpointDependenciesScript = pinpointDependenciesOfPackage args;
passAsFile = [ "compositionScript" "pinpointDependenciesScript" ];
installPhase = ''
# Create and enter a root node_modules/ folder
mkdir -p $out/lib/node_modules
cd $out/lib/node_modules
# Compose the package and all its dependencies
source $compositionScriptPath
# Pinpoint the versions of all dependencies to the ones that are actually being used
echo "pinpointing versions of dependencies..."
source $pinpointDependenciesScriptPath
# Patch the shebangs of the bundled modules to prevent them from
# calling executables outside the Nix store as much as possible
patchShebangs .
# Deploy the Node.js package by running npm install. Since the
# dependencies have been provided already by ourselves, it should not
# attempt to install them again, which is good, because we want to make
# it Nix's responsibility. If it needs to install any dependencies
# anyway (e.g. because the dependency parameters are
# incomplete/incorrect), it fails.
#
# The other responsibilities of NPM are kept -- version checks, build
# steps, postprocessing etc.
export HOME=$TMPDIR
cd "${packageName}"
runHook preRebuild
${stdenv.lib.optionalString bypassCache ''
if [ ! -f package-lock.json ]
then
echo "No package-lock.json file found, reconstructing..."
node ${reconstructPackageLock}
fi
node ${addIntegrityFieldsScript}
''}
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
if [ "$dontNpmInstall" != "1" ]
then
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
rm -f npm-shrinkwrap.json
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
fi
# Create symlink to the deployed executable folder, if applicable
if [ -d "$out/lib/node_modules/.bin" ]
then
ln -s $out/lib/node_modules/.bin $out/bin
fi
# Create symlinks to the deployed manual page folders, if applicable
if [ -d "$out/lib/node_modules/${packageName}/man" ]
then
mkdir -p $out/share
for dir in "$out/lib/node_modules/${packageName}/man/"*
do
mkdir -p $out/share/man/$(basename "$dir")
for page in "$dir"/*
do
ln -s $page $out/share/man/$(basename "$dir")
done
done
fi
# Run post install hook, if provided
runHook postInstall
'';
} // extraArgs);
# Builds a development shell
buildNodeShell =
{ name
, packageName
, version
, src
, dependencies ? []
, buildInputs ? []
, production ? true
, npmFlags ? ""
, dontNpmInstall ? false
, bypassCache ? false
, dontStrip ? true
, unpackPhase ? "true"
, buildPhase ? "true"
, ... }@args:
let
forceOfflineFlag = if bypassCache then "--offline" else "--registry http://www.example.com";
extraArgs = removeAttrs args [ "name" "dependencies" "buildInputs" ];
nodeDependencies = stdenv.mkDerivation ({
name = "node-dependencies-${name}-${version}";
buildInputs = [ tarWrapper python nodejs ]
++ stdenv.lib.optional (stdenv.isLinux) utillinux
++ stdenv.lib.optional (stdenv.isDarwin) libtool
++ buildInputs;
inherit dontStrip; # Stripping may fail a build for some package deployments
inherit dontNpmInstall unpackPhase buildPhase;
includeScript = includeDependencies { inherit dependencies; };
pinpointDependenciesScript = pinpointDependenciesOfPackage args;
passAsFile = [ "includeScript" "pinpointDependenciesScript" ];
installPhase = ''
mkdir -p $out/${packageName}
cd $out/${packageName}
source $includeScriptPath
# Create fake package.json to make the npm commands work properly
cp ${src}/package.json .
chmod 644 package.json
${stdenv.lib.optionalString bypassCache ''
if [ -f ${src}/package-lock.json ]
then
cp ${src}/package-lock.json .
fi
''}
# Pinpoint the versions of all dependencies to the ones that are actually being used
echo "pinpointing versions of dependencies..."
cd ..
${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
source $pinpointDependenciesScriptPath
cd ${packageName}
# Patch the shebangs of the bundled modules to prevent them from
# calling executables outside the Nix store as much as possible
patchShebangs .
export HOME=$PWD
${stdenv.lib.optionalString bypassCache ''
if [ ! -f package-lock.json ]
then
echo "No package-lock.json file found, reconstructing..."
node ${reconstructPackageLock}
fi
node ${addIntegrityFieldsScript}
''}
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} rebuild
${stdenv.lib.optionalString (!dontNpmInstall) ''
# NPM tries to download packages even when they already exist if npm-shrinkwrap is used.
rm -f npm-shrinkwrap.json
npm ${forceOfflineFlag} --nodedir=${nodeSources} ${npmFlags} ${stdenv.lib.optionalString production "--production"} install
''}
cd ..
${stdenv.lib.optionalString (builtins.substring 0 1 packageName == "@") "cd .."}
mv ${packageName} lib
ln -s $out/lib/node_modules/.bin $out/bin
'';
} // extraArgs);
in
stdenv.mkDerivation {
name = "node-shell-${name}-${version}";
buildInputs = [ python nodejs ] ++ stdenv.lib.optional (stdenv.isLinux) utillinux ++ buildInputs;
buildCommand = ''
mkdir -p $out/bin
cat > $out/bin/shell <<EOF
#! ${stdenv.shell} -e
$shellHook
exec ${stdenv.shell}
EOF
chmod +x $out/bin/shell
'';
# Provide the dependencies in a development shell through the NODE_PATH environment variable
inherit nodeDependencies;
shellHook = stdenv.lib.optionalString (dependencies != []) ''
export NODE_PATH=$nodeDependencies/lib/node_modules
'';
};
in
{
buildNodeSourceDist = stdenv.lib.makeOverridable buildNodeSourceDist;
buildNodePackage = stdenv.lib.makeOverridable buildNodePackage;
buildNodeShell = stdenv.lib.makeOverridable buildNodeShell;
}

View File

@ -0,0 +1,435 @@
# This file has been generated by node2nix 1.6.0. Do not edit!
{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
let
sources = {
"ansi-regex-2.1.1" = {
name = "ansi-regex";
packageName = "ansi-regex";
version = "2.1.1";
src = fetchurl {
url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
};
};
"ansi-styles-2.2.1" = {
name = "ansi-styles";
packageName = "ansi-styles";
version = "2.2.1";
src = fetchurl {
url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
};
};
"async-0.2.10" = {
name = "async";
packageName = "async";
version = "0.2.10";
src = fetchurl {
url = "https://registry.npmjs.org/async/-/async-0.2.10.tgz";
sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1";
};
};
"balanced-match-1.0.0" = {
name = "balanced-match";
packageName = "balanced-match";
version = "1.0.0";
src = fetchurl {
url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
};
};
"brace-expansion-1.1.11" = {
name = "brace-expansion";
packageName = "brace-expansion";
version = "1.1.11";
src = fetchurl {
url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
};
};
"chalk-1.1.3" = {
name = "chalk";
packageName = "chalk";
version = "1.1.3";
src = fetchurl {
url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
};
};
"colors-0.6.2" = {
name = "colors";
packageName = "colors";
version = "0.6.2";
src = fetchurl {
url = "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz";
sha1 = "2423fe6678ac0c5dae8852e5d0e5be08c997abcc";
};
};
"concat-map-0.0.1" = {
name = "concat-map";
packageName = "concat-map";
version = "0.0.1";
src = fetchurl {
url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
};
};
"cycle-1.0.3" = {
name = "cycle";
packageName = "cycle";
version = "1.0.3";
src = fetchurl {
url = "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz";
sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
};
};
"deep-equal-1.0.1" = {
name = "deep-equal";
packageName = "deep-equal";
version = "1.0.1";
src = fetchurl {
url = "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz";
sha1 = "f5d260292b660e084eff4cdbc9f08ad3247448b5";
};
};
"escape-string-regexp-1.0.5" = {
name = "escape-string-regexp";
packageName = "escape-string-regexp";
version = "1.0.5";
src = fetchurl {
url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
};
};
"eyes-0.1.8" = {
name = "eyes";
packageName = "eyes";
version = "0.1.8";
src = fetchurl {
url = "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz";
sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
};
};
"fs.realpath-1.0.0" = {
name = "fs.realpath";
packageName = "fs.realpath";
version = "1.0.0";
src = fetchurl {
url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
};
};
"glob-7.1.3" = {
name = "glob";
packageName = "glob";
version = "7.1.3";
src = fetchurl {
url = "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz";
sha512 = "vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==";
};
};
"has-ansi-2.0.0" = {
name = "has-ansi";
packageName = "has-ansi";
version = "2.0.0";
src = fetchurl {
url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
};
};
"i-0.3.6" = {
name = "i";
packageName = "i";
version = "0.3.6";
src = fetchurl {
url = "https://registry.npmjs.org/i/-/i-0.3.6.tgz";
sha1 = "d96c92732076f072711b6b10fd7d4f65ad8ee23d";
};
};
"inflight-1.0.6" = {
name = "inflight";
packageName = "inflight";
version = "1.0.6";
src = fetchurl {
url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
};
};
"inherits-2.0.3" = {
name = "inherits";
packageName = "inherits";
version = "2.0.3";
src = fetchurl {
url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
sha1 = "633c2c83e3da42a502f52466022480f4208261de";
};
};
"isstream-0.1.2" = {
name = "isstream";
packageName = "isstream";
version = "0.1.2";
src = fetchurl {
url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
};
};
"minimatch-3.0.4" = {
name = "minimatch";
packageName = "minimatch";
version = "3.0.4";
src = fetchurl {
url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
};
};
"minimist-0.0.8" = {
name = "minimist";
packageName = "minimist";
version = "0.0.8";
src = fetchurl {
url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
};
};
"minimist-1.2.0" = {
name = "minimist";
packageName = "minimist";
version = "1.2.0";
src = fetchurl {
url = "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz";
sha1 = "a35008b20f41383eec1fb914f4cd5df79a264284";
};
};
"mkdirp-0.5.1" = {
name = "mkdirp";
packageName = "mkdirp";
version = "0.5.1";
src = fetchurl {
url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
};
};
"mute-stream-0.0.8" = {
name = "mute-stream";
packageName = "mute-stream";
version = "0.0.8";
src = fetchurl {
url = "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz";
sha512 = "nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==";
};
};
"ncp-0.4.2" = {
name = "ncp";
packageName = "ncp";
version = "0.4.2";
src = fetchurl {
url = "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz";
sha1 = "abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574";
};
};
"once-1.4.0" = {
name = "once";
packageName = "once";
version = "1.4.0";
src = fetchurl {
url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
};
};
"path-is-absolute-1.0.1" = {
name = "path-is-absolute";
packageName = "path-is-absolute";
version = "1.0.1";
src = fetchurl {
url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
};
};
"pkginfo-0.3.1" = {
name = "pkginfo";
packageName = "pkginfo";
version = "0.3.1";
src = fetchurl {
url = "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz";
sha1 = "5b29f6a81f70717142e09e765bbeab97b4f81e21";
};
};
"pkginfo-0.4.1" = {
name = "pkginfo";
packageName = "pkginfo";
version = "0.4.1";
src = fetchurl {
url = "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz";
sha1 = "b5418ef0439de5425fc4995042dced14fb2a84ff";
};
};
"prompt-0.2.14" = {
name = "prompt";
packageName = "prompt";
version = "0.2.14";
src = fetchurl {
url = "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz";
sha1 = "57754f64f543fd7b0845707c818ece618f05ffdc";
};
};
"read-1.0.7" = {
name = "read";
packageName = "read";
version = "1.0.7";
src = fetchurl {
url = "https://registry.npmjs.org/read/-/read-1.0.7.tgz";
sha1 = "b3da19bd052431a97671d44a42634adf710b40c4";
};
};
"revalidator-0.1.8" = {
name = "revalidator";
packageName = "revalidator";
version = "0.1.8";
src = fetchurl {
url = "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz";
sha1 = "fece61bfa0c1b52a206bd6b18198184bdd523a3b";
};
};
"rimraf-2.6.3" = {
name = "rimraf";
packageName = "rimraf";
version = "2.6.3";
src = fetchurl {
url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";
sha512 = "mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==";
};
};
"semver-5.6.0" = {
name = "semver";
packageName = "semver";
version = "5.6.0";
src = fetchurl {
url = "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz";
sha512 = "RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==";
};
};
"stack-trace-0.0.10" = {
name = "stack-trace";
packageName = "stack-trace";
version = "0.0.10";
src = fetchurl {
url = "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz";
sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
};
};
"strip-ansi-3.0.1" = {
name = "strip-ansi";
packageName = "strip-ansi";
version = "3.0.1";
src = fetchurl {
url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
};
};
"supports-color-2.0.0" = {
name = "supports-color";
packageName = "supports-color";
version = "2.0.0";
src = fetchurl {
url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
};
};
"utile-0.2.1" = {
name = "utile";
packageName = "utile";
version = "0.2.1";
src = fetchurl {
url = "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz";
sha1 = "930c88e99098d6220834c356cbd9a770522d90d7";
};
};
"winston-0.8.3" = {
name = "winston";
packageName = "winston";
version = "0.8.3";
src = fetchurl {
url = "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz";
sha1 = "64b6abf4cd01adcaefd5009393b1d8e8bec19db0";
};
};
"wrappy-1.0.2" = {
name = "wrappy";
packageName = "wrappy";
version = "1.0.2";
src = fetchurl {
url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
};
};
};
in
{
"react-native-cli-2.0.1" = nodeEnv.buildNodePackage {
name = "react-native-cli";
packageName = "react-native-cli";
version = "2.0.1";
src = fetchurl {
url = "https://registry.npmjs.org/react-native-cli/-/react-native-cli-2.0.1.tgz";
sha1 = "f2cd3c7aa1b83828cdfba630e2dfd817df766d54";
};
dependencies = [
sources."ansi-regex-2.1.1"
sources."ansi-styles-2.2.1"
sources."async-0.2.10"
sources."balanced-match-1.0.0"
sources."brace-expansion-1.1.11"
sources."chalk-1.1.3"
sources."colors-0.6.2"
sources."concat-map-0.0.1"
sources."cycle-1.0.3"
sources."deep-equal-1.0.1"
sources."escape-string-regexp-1.0.5"
sources."eyes-0.1.8"
sources."fs.realpath-1.0.0"
sources."glob-7.1.3"
sources."has-ansi-2.0.0"
sources."i-0.3.6"
sources."inflight-1.0.6"
sources."inherits-2.0.3"
sources."isstream-0.1.2"
sources."minimatch-3.0.4"
sources."minimist-1.2.0"
(sources."mkdirp-0.5.1" // {
dependencies = [
sources."minimist-0.0.8"
];
})
sources."mute-stream-0.0.8"
sources."ncp-0.4.2"
sources."once-1.4.0"
sources."path-is-absolute-1.0.1"
sources."pkginfo-0.4.1"
sources."prompt-0.2.14"
sources."read-1.0.7"
sources."revalidator-0.1.8"
sources."rimraf-2.6.3"
sources."semver-5.6.0"
sources."stack-trace-0.0.10"
sources."strip-ansi-3.0.1"
sources."supports-color-2.0.0"
sources."utile-0.2.1"
(sources."winston-0.8.3" // {
dependencies = [
sources."pkginfo-0.3.1"
];
})
sources."wrappy-1.0.2"
];
buildInputs = globalBuildInputs;
meta = {
description = "The React Native CLI tools";
homepage = "https://github.com/facebook/react-native#readme";
license = "BSD-3-Clause";
};
production = true;
bypassCache = true;
};
}

View File

@ -70,6 +70,13 @@ There are a few @b[[manual steps]] you might want to do:
@blue[[https://facebook.github.io/react-native/docs/getting-started.html]] @blue[[https://facebook.github.io/react-native/docs/getting-started.html]]
3. Add your SSH public key to Github if it isn't already in there. 3. Add your SSH public key to Github if it isn't already in there.
To build the app, please run one of the following commands, depending on the desired target:
- @b[[make prepare-mobile]]
- @b[[make prepare-desktop]]
followed by one of the @b[[make release-*]] commands.
" "
echo echo

View File

@ -64,14 +64,10 @@ fi
setup_header "Installing requirements..." setup_header "Installing requirements..."
install_nix && \ install_nix && \
install_react_native_cli && \
install_nsis && \ install_nsis && \
install_android_sdk && \ install_android_sdk && \
install_android_ndk || \ install_android_ndk || \
exit $? exit $?
#### ####
echo && setup_header "Installing dependencies..."
dependency_setup make prepare-mobile && \
setup_complete setup_complete