Skip to content

Instantly share code, notes, and snippets.

@chaoky
Last active April 23, 2024 22:17
Show Gist options
  • Save chaoky/835e93529722086724aac19b9afe10ec to your computer and use it in GitHub Desktop.
Save chaoky/835e93529722086724aac19b9afe10ec to your computer and use it in GitHub Desktop.
expo react native nix derivation and shell
# I'm using a wrapped mkNodeModules for pnpm support
# mkYarnModules and importNpmLock are avaible for yarn/npm in nixpkgs
# also using chaoky/gradle-dot-nix fork for the local-repos option
{ pkgs, utils, gradle-dot-nix }:
let
nodejs = pkgs.nodejs_21;
pnpm = pkgs.nodePackages.pnpm;
java = pkgs.jdk17;
androidPkgs = pkgs.androidenv.composeAndroidPackages {
platformVersions = [ "34" ];
buildToolsVersions = [ "34.0.0" "33.0.1" ];
cmakeVersions = [ "3.22.1" ];
ndkVersion = "25.1.8937393";
includeNDK = true;
};
nodeModules = utils.mkNodeModules {
inherit nodejs pnpm;
src = ./.;
};
gradleModules = import gradle-dot-nix {
inherit pkgs;
gradle-verification-metadata-file = ./android/gradle/verification-metadata.xml;
local-repos = [ "${nodeModules}/node_modules/jsc-android/dist" ];
};
android = pkgs.stdenv.mkDerivation {
name = "app for android";
src = ./.;
nativeBuildInputs = with pkgs; [
nodejs
vips
java
androidPkgs.androidsdk
androidPkgs.platform-tools
(gradle.override { inherit java; })
];
shellHook = ''
export JAVA_HOME=${java.home}
export ANDROID_SDK_ROOT=${androidPkgs.androidsdk}/libexec/android-sdk
export ANDROID_NDK_ROOT=$ANDROID_SDK_ROOT/ndk-bundle/
'';
buildPhase = ''
runHook shellHook
cp -r ${nodeModules}/node_modules .
chmod -R +w node_modules
bash ./gradlePatch.sh ${gradleModules.mvn-repo}
cd android
gradle \
--offline \
--parallel \
--console=plain \
-Dorg.gradle.internal.plugins.portal.url.override=${gradleModules.mvn-repo} \
-Dorg.gradle.project.android.aapt2FromMavenOverride=$ANDROID_SDK_ROOT/build-tools/34.0.0/aapt2 \
assembleRelease
'';
installPhase = ''
mkdir -p $out
cp app/build/outputs/apk/release/* $out
'';
};
web = pkgs.stdenv.mkDerivation {
name = "app for web";
src = ./.;
nativeBuildInputs = with pkgs; [
nodejs
vips
];
buildPhase = ''
cp -r ${nodeModules}/node_modules .
node ./node_modules/.bin/expo export -p web
'';
installPhase = ''
mkdir -p $out
cp -r dist $out
'';
};
in
{
inherit android web;
shell = pkgs.mkShell {
inputsFrom = [ android ];
packages = with pkgs; [ watchman pnpm ];
};
}
#!/bin/bash
abs=$(realpath $1)
escp=${abs//\//\\/}
search='\(mavenCentral()\|google()\|jcenter()\|gradlePluginPortal()\)'
replace='maven { url = uri("'"$escp"'") }'
find -L . \
-name build.gradle -or \
-name build.gradle.kts -or \
-name settings.gradle -or \
-name settings.gradle.kts \
| xargs sed -i "s/$search/$replace/g"
{ pkgs }:
let
android = pkgs.androidenv.composeAndroidPackages {
platformVersions = [ "34" ];
buildToolsVersions = [ "34.0.0" "33.0.1" ];
cmakeVersions = [ "3.22.1" ];
ndkVersion = "25.1.8937393";
includeNDK = true;
};
in
{
shell = pkgs.mkShell {
buildInputs = with pkgs; [ vips jdk17 nodejs_21 nodePackages.pnpm android.androidsdk ];
shellHook = ''
export JAVA_HOME=${pkgs.jdk17}
export ANDROID_SDK_ROOT=${android.androidsdk}/libexec/android-sdk
'';
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment