diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 0f88591a..8c6da27a 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -1,4 +1,4 @@ -name: Build Web Application on Pull Request +name: PR checks on: pull_request: branches: [main] diff --git a/README.md b/README.md index a7c168dc..2abff708 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,18 @@ pnpm tauri ios dev pnpm tauri build ``` -### 6. More information +### 6. Setup dev environment with Nix + +If you have Nix installed, you can leverage flake to enter a development shell +with all the necessary dependencies: + +```bash +nix develop ./ops # enter a dev shell for the web app +nix develop ./ops#ios # enter a dev shell for the ios app +nix develop ./ops#android # enter a dev shell for the android app +``` + +### 7. More information Please check the [wiki][link-gh-wiki] of this project for more information on development. diff --git a/ops/flake.lock b/ops/flake.lock new file mode 100644 index 00000000..c4855578 --- /dev/null +++ b/ops/flake.lock @@ -0,0 +1,188 @@ +{ + "nodes": { + "android": { + "inputs": { + "devshell": "devshell", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1737231446, + "narHash": "sha256-5lwp4VeKe0/rZzz7tew6egj1f80cY6xQtqf929iscyU=", + "owner": "tadfisher", + "repo": "android-nixpkgs", + "rev": "11344fbb813770ff8f8b8de5e4d512c0c4910a78", + "type": "github" + }, + "original": { + "owner": "tadfisher", + "ref": "stable", + "repo": "android-nixpkgs", + "type": "github" + } + }, + "devshell": { + "inputs": { + "nixpkgs": [ + "android", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1735644329, + "narHash": "sha256-tO3HrHriyLvipc4xr+Ewtdlo7wM1OjXNjlWRgmM7peY=", + "owner": "numtide", + "repo": "devshell", + "rev": "f7795ede5b02664b57035b3b757876703e2c3eac", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "devshell_2": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1735644329, + "narHash": "sha256-tO3HrHriyLvipc4xr+Ewtdlo7wM1OjXNjlWRgmM7peY=", + "owner": "numtide", + "repo": "devshell", + "rev": "f7795ede5b02664b57035b3b757876703e2c3eac", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1737062831, + "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1722073938, + "narHash": "sha256-OpX0StkL8vpXyWOGUD6G+MA26wAXK6SpT94kLJXo6B4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e36e9f57337d0ff0cf77aceb58af4c805472bfae", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1737062831, + "narHash": "sha256-Tbk1MZbtV2s5aG+iM99U8FqwxU/YNArMcWAv6clcsBc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "5df43628fdf08d642be8ba5b3625a6c70731c19c", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "android": "android", + "devshell": "devshell_2", + "flake-utils": "flake-utils_2", + "nixpkgs": "nixpkgs_3" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/ops/flake.nix b/ops/flake.nix new file mode 100644 index 00000000..848ccb10 --- /dev/null +++ b/ops/flake.nix @@ -0,0 +1,107 @@ +{ + description = "Readest development environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + devshell.url = "github:numtide/devshell"; + android = { + url = "github:tadfisher/android-nixpkgs/stable"; + }; + }; + + outputs = { self, nixpkgs, flake-utils, android, devshell }: + { + overlay = final: prev: { + inherit (self.packages.${final.system}) android-sdk android-studio; + }; + } + // + flake-utils.lib.eachDefaultSystem (system: + let + inherit (nixpkgs) lib; + pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + overlays = [ + devshell.overlays.default + self.overlay + ]; + }; + # android-studio is not available in aarch64-darwin + androidConditionalPackages = if pkgs.system != "aarch64-darwin" then [ pkgs.android-studio ] else [ ]; + commonPackages = with pkgs; [ + pnpm + ]; + mkCommonSHell = { name, extraPackages ? [], extraEnv ? [] }: + pkgs.devshell.mkShell { + inherit name; + packages = commonPackages ++ extraPackages; + env = extraEnv; + }; + + in { + packages = { + android-sdk = android.sdk.${system} (sdkPkgs: with sdkPkgs; [ + # Useful packages for building and testing. + build-tools-34-0-0 + cmdline-tools-latest + emulator + platform-tools + platforms-android-34 + ndk-26-1-10909125 + ] + ++ lib.optionals (system == "aarch64-darwin") [ + system-images-android-34-google-apis-arm64-v8a + system-images-android-34-google-apis-playstore-arm64-v8a + ] + ++ lib.optionals (system == "x86_64-darwin" || system == "x86_64-linux") [ + system-images-android-34-google-apis-x86-64 + system-images-android-34-google-apis-playstore-x86-64 + ]); + } // lib.optionalAttrs (system == "x86_64-linux") { + # Android Studio in nixpkgs is currently packaged for x86_64-linux only. + android-studio = pkgs.androidStudioPackages.stable; + }; + + devShells = { + web = mkCommonSHell { + name = "readest-dev"; + }; + + ios = mkCommonSHell { + name = "readest-ios"; + extraPackages = [ pkgs.cocoapods ]; + }; + + android = mkCommonSHell { + name = "readest-android"; + extraPackages = [ + pkgs.android-sdk + pkgs.gradle + pkgs.jdk + ] ++ androidConditionalPackages; + extraEnv = [ + { + name = "ANDROID_HOME"; + value = "${pkgs.android-sdk}/share/android-sdk"; + } + { + name = "ANDROID_SDK_ROOT"; + value = "${pkgs.android-sdk}/share/android-sdk"; + } + { + name = "NDK_HOME"; + value = "${pkgs.android-sdk}/share/android-sdk/ndk/26.1.10909125"; + } + { + name = "JAVA_HOME"; + value = pkgs.jdk.home; + } + ]; + }; + + default = self.devShells.${system}.web; + }; + }); +}