nix: add docs about NodeJS modules, small refactor
Signed-off-by: Jakub Sokołowski <jakub@status.im>
This commit is contained in:
parent
458ef05740
commit
c62abf10c1
|
@ -0,0 +1,18 @@
|
||||||
|
# Description
|
||||||
|
|
||||||
|
This Nix derivation takes the result of the [`nix/deps/nodejs/default.nix`](../nodejs/default.nix) derivation and adjusts it for use with Gradle.
|
||||||
|
|
||||||
|
# Details
|
||||||
|
|
||||||
|
Modules provided by `yarn2nix` are normally fine, but we use `react-native-*` packages which have their own `gradle.build` files that reference external Maven repositories:
|
||||||
|
```js
|
||||||
|
repositories {
|
||||||
|
google()
|
||||||
|
jcenter()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
And these need to be patched and replaced with `mavenLocal()` to make sure Gradle doesn't try to fetch dependencies from remote repos.
|
||||||
|
|
||||||
|
This derivation symlinks most of the modules found in the `yarn2nix` result and copies the ones that require patching of `gradle.build` files in `patchGradlePhase`.
|
||||||
|
|
||||||
|
It also applies other fixes like making `BuildId` static in `patchBuildIdPhase` and fixing a Hermes bug in `patchHermesPhase`.
|
|
@ -6,8 +6,14 @@
|
||||||
|
|
||||||
stdenv.mkDerivation {
|
stdenv.mkDerivation {
|
||||||
name = "${deps.nodejs.name}-patched";
|
name = "${deps.nodejs.name}-patched";
|
||||||
|
phases = [
|
||||||
phases = [ "unpackPhase" "patchPhase" "installPhase" ];
|
"unpackPhase"
|
||||||
|
"patchGradlePhase"
|
||||||
|
"patchBuildIdPhase"
|
||||||
|
"patchHermesPhase"
|
||||||
|
"patchJavaPhase"
|
||||||
|
"installPhase"
|
||||||
|
];
|
||||||
|
|
||||||
# First symlink all modules as is
|
# First symlink all modules as is
|
||||||
# WARNING: Metro has issues when dealing with symlinks!
|
# WARNING: Metro has issues when dealing with symlinks!
|
||||||
|
@ -19,10 +25,10 @@ stdenv.mkDerivation {
|
||||||
cp -r ${deps.nodejs}/node_modules/.bin ./node_modules/
|
cp -r ${deps.nodejs}/node_modules/.bin ./node_modules/
|
||||||
'';
|
'';
|
||||||
|
|
||||||
# Then patch the modules that have build.gradle files
|
# Patch build.gradle files in 'react-native-*' dependencies to replace
|
||||||
patchPhase = ''
|
# maven and google central repositories with our own local directories.
|
||||||
# Patch maven and google central repositories with our own local directories.
|
# This prevents the builder from downloading Maven artifacts
|
||||||
# This prevents the builder from downloading Maven artifacts
|
patchGradlePhase = ''
|
||||||
for modBuildGradle in $(find -L ./node_modules -name build.gradle); do
|
for modBuildGradle in $(find -L ./node_modules -name build.gradle); do
|
||||||
relativeToNode=''${modBuildGradle#*node_modules/}
|
relativeToNode=''${modBuildGradle#*node_modules/}
|
||||||
moduleName=''${relativeToNode%%/*}
|
moduleName=''${relativeToNode%%/*}
|
||||||
|
@ -33,26 +39,26 @@ stdenv.mkDerivation {
|
||||||
fi
|
fi
|
||||||
${patchMavenSources} $modBuildGradle
|
${patchMavenSources} $modBuildGradle
|
||||||
done
|
done
|
||||||
|
'';
|
||||||
patchShebangs ./node_modules
|
# Do not add a BuildId to the generated libraries, for reproducibility
|
||||||
|
patchBuildIdPhase = ''
|
||||||
# Do not add a BuildId to the generated libraries, for reproducibility
|
|
||||||
substituteInPlace ./node_modules/react-native/ReactAndroid/src/main/jni/Application.mk --replace \
|
substituteInPlace ./node_modules/react-native/ReactAndroid/src/main/jni/Application.mk --replace \
|
||||||
'-Wl,--build-id' \
|
'-Wl,--build-id' \
|
||||||
'-Wl,--build-id=none'
|
'-Wl,--build-id=none'
|
||||||
|
'';
|
||||||
# Fix bugs in Hermes usage:
|
# Fix bugs in Hermes usage:
|
||||||
# https://github.com/facebook/react-native/issues/25601#issuecomment-510856047
|
# https://github.com/facebook/react-native/issues/25601#issuecomment-510856047
|
||||||
# - Make PR builds also count as release builds
|
# - Make PR builds also count as release builds
|
||||||
# - Fix issue where hermes command is being called with same input/output file
|
# - Fix issue where hermes command is being called with same input/output file
|
||||||
|
patchHermesPhase = ''
|
||||||
substituteInPlace ./node_modules/react-native/react.gradle --replace \
|
substituteInPlace ./node_modules/react-native/react.gradle --replace \
|
||||||
'targetName.toLowerCase().contains("release")' \
|
'targetName.toLowerCase().contains("release")' \
|
||||||
'!targetName.toLowerCase().contains("debug")'
|
'!targetName.toLowerCase().contains("debug")'
|
||||||
|
'';
|
||||||
# Patch Java files in modules which are not yet ported to AndroidX
|
# Patch Java files in modules which are not yet ported to AndroidX
|
||||||
|
patchJavaPhase = ''
|
||||||
${nodejs}/bin/node ./node_modules/jetifier/bin/jetify
|
${nodejs}/bin/node ./node_modules/jetifier/bin/jetify
|
||||||
'';
|
'';
|
||||||
|
|
||||||
installPhase = ''
|
installPhase = ''
|
||||||
mkdir -p $out
|
mkdir -p $out
|
||||||
cp -R node_modules $out/
|
cp -R node_modules $out/
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
# Description
|
||||||
|
|
||||||
|
This derivation uses a [yarn2nix](https://github.com/nix-community/yarn2nix) to generate a Nix store package containing all NodeJS dependencies.
|
||||||
|
|
||||||
|
# Details
|
||||||
|
|
||||||
|
If you look at [`nix/deps/nodejs/default.nix`](./default.nix) you'll see that it it loads `package.json` and `yarn.lock` files and uses them to generate the derivation:
|
||||||
|
```sh
|
||||||
|
> make nix-repl
|
||||||
|
Welcome to Nix version 2.3.9. Type :? for help.
|
||||||
|
|
||||||
|
nix-repl> pkgs.deps.nodejs
|
||||||
|
«derivation /nix/store/23mpmpjjnq7miclv6bc6ilgypy8wz69p-status-react-node-deps-1.8.0.drv»
|
||||||
|
```
|
||||||
|
You can build the derivation:
|
||||||
|
```
|
||||||
|
nix-repl> :b pkgs.deps.nodejs
|
||||||
|
|
||||||
|
this derivation produced the following outputs:
|
||||||
|
out -> /nix/store/dqb2cjyz1g6n7jic07058y26lnmgaaz9-status-react-node-deps-1.8.0
|
||||||
|
```
|
||||||
|
And look inside:
|
||||||
|
```
|
||||||
|
> cd /nix/store/dqb2cjyz1g6n7jic07058y26lnmgaaz9-status-react-node-deps-1.8.0
|
||||||
|
> ls
|
||||||
|
deps node_modules
|
||||||
|
> ls node_modules | grep react-native-image
|
||||||
|
react-native-image-crop-picker
|
||||||
|
react-native-image-resizer
|
||||||
|
react-native-image-viewing
|
||||||
|
```
|
||||||
|
|
||||||
|
# Known Issues
|
||||||
|
|
||||||
|
It's important that dependencies from GitHub are added in a correct format:
|
||||||
|
```
|
||||||
|
git+https://github.com/status-im/bignumber.js.git#v4.0.2-status
|
||||||
|
```
|
||||||
|
Notice three things:
|
||||||
|
|
||||||
|
* `git+` prefix for the `https://` URL
|
||||||
|
* Repository name ends with `.git`
|
||||||
|
* Tag or branch is added after `#` character
|
||||||
|
|
||||||
|
__WARNING__: Using branches can cause dependencies to change their hash and cause builds to fail. Using them during development is fine, but tags should be used in the final version.
|
||||||
|
|
||||||
|
If this format is not used correctly you can see issues like:
|
||||||
|
```
|
||||||
|
fatal: unable to access 'https://github.com/status-im/bignumber.js.git/': Could not resolve host: github.com
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```
|
||||||
|
error Couldn't find any versions for "bignumber.js" that matches "github.com/status-im/bignumber.js.git#v4.0.2-status" in our cache (possible versions are ""). This is usually caused by a missing entry in the lockfile, running Yarn without the --offline flag may help fix this issue.
|
||||||
|
```
|
||||||
|
or
|
||||||
|
```
|
||||||
|
error Can't make a request in offline mode ("https://codeload.github.com/status-im/bignumber.js/tar.gz/f322b670969512a35c84441036a0ba4836a96428")
|
||||||
|
```
|
|
@ -1,14 +1,10 @@
|
||||||
{ lib, yarn2nix-moretea }:
|
{ lib, yarn2nix-moretea }:
|
||||||
|
|
||||||
let
|
# Create a yarn package for our project that contains all the dependecies.
|
||||||
|
yarn2nix-moretea.mkYarnModules rec {
|
||||||
|
pname = "status-react";
|
||||||
|
name = "${pname}-node-deps-${version}";
|
||||||
version = lib.fileContents ../../../VERSION;
|
version = lib.fileContents ../../../VERSION;
|
||||||
yarnLock = ../../../yarn.lock;
|
yarnLock = ../../../yarn.lock;
|
||||||
packageJSON = ../../../package.json;
|
packageJSON = ../../../package.json;
|
||||||
packageJSONContent = lib.importJSON packageJSON;
|
}
|
||||||
in
|
|
||||||
# Create a yarn package for our project that contains all the dependecies.
|
|
||||||
yarn2nix-moretea.mkYarnModules rec {
|
|
||||||
pname = "status-react";
|
|
||||||
name = "${pname}-node-deps-${version}";
|
|
||||||
inherit version packageJSON yarnLock;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue