Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at python-updates 186 lines 4.2 kB view raw
1{ 2 lib, 3 beamPackages, 4 buildNpmPackage, 5 rustPlatform, 6 fetchFromGitHub, 7 nodejs, 8 runCommand, 9 nixosTests, 10 npm-lockfile-fix, 11 nix-update-script, 12 brotli, 13 tailwindcss_3, 14 esbuild, 15 ... 16}: 17 18let 19 pname = "plausible"; 20 version = "2.1.5"; 21 mixEnv = "ce"; 22 23 src = fetchFromGitHub { 24 owner = "plausible"; 25 repo = "analytics"; 26 rev = "v${version}"; 27 hash = "sha256-4gwK/AxzhsU0vgvKgIXrOyQLCgZMeZyKjj7PWbUmJ+8="; 28 postFetch = '' 29 ${lib.getExe npm-lockfile-fix} $out/assets/package-lock.json 30 sed -ie ' 31 /defp deps do/ { 32 n 33 /\[/ a\ 34 \{:rustler, ">= 0.0.0", optional: true \}, 35 } 36 ' $out/mix.exs 37 cat >> $out/config/config.exs <<EOF 38 config :mjml, Mjml.Native, 39 crate: :mjml_nif, 40 skip_compilation?: true 41 EOF 42 ''; 43 }; 44 45 assets = buildNpmPackage { 46 pname = "${pname}-assets"; 47 inherit version; 48 src = "${src}/assets"; 49 npmDepsHash = "sha256-Rf1+G9F/CMK09KEh022vHe02FADJtARKX4QEVbmvSqk="; 50 dontNpmBuild = true; 51 installPhase = '' 52 runHook preInstall 53 cp -r . "$out" 54 runHook postInstall 55 ''; 56 }; 57 58 tracker = buildNpmPackage { 59 pname = "${pname}-tracker"; 60 inherit version; 61 src = "${src}/tracker"; 62 npmDepsHash = "sha256-ng0YpBZc0vcg5Bsr1LmgXtzNCtNV6hJIgLt3m3yRdh4="; 63 dontNpmBuild = true; 64 installPhase = '' 65 runHook preInstall 66 cp -r . "$out" 67 runHook postInstall 68 ''; 69 }; 70 71 mixFodDeps = beamPackages.fetchMixDeps { 72 inherit 73 pname 74 version 75 src 76 mixEnv 77 ; 78 hash = "sha256-edQ8byeV0WUaYDYMnmrstC6L2jztidR/JikGZLpX3WE="; 79 }; 80 81 mjmlNif = rustPlatform.buildRustPackage { 82 pname = "mjml-native"; 83 version = ""; 84 src = "${mixFodDeps}/mjml/native/mjml_nif"; 85 86 cargoHash = "sha256-zDWOik65PWAMpIDDcG+DibprPVW/k+Q83+fjFI5vWaY="; 87 doCheck = false; 88 89 env = { 90 RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true"; 91 RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required"; 92 }; 93 }; 94 95 patchedMixFodDeps = 96 runCommand mixFodDeps.name 97 { 98 inherit (mixFodDeps) hash; 99 } 100 '' 101 mkdir $out 102 cp -r --no-preserve=mode ${mixFodDeps}/. $out 103 104 mkdir -p $out/mjml/priv/native 105 for lib in ${mjmlNif}/lib/* 106 do 107 # normalies suffix to .so, otherswise build would fail on darwin 108 file=''${lib##*/} 109 base=''${file%.*} 110 ln -s "$lib" $out/mjml/priv/native/$base.so 111 done 112 ''; 113 114in 115beamPackages.mixRelease rec { 116 inherit 117 pname 118 version 119 src 120 mixEnv 121 ; 122 123 nativeBuildInputs = [ 124 nodejs 125 brotli 126 ]; 127 128 mixFodDeps = patchedMixFodDeps; 129 130 passthru = { 131 tests = { 132 inherit (nixosTests) plausible; 133 }; 134 updateScript = nix-update-script { 135 extraArgs = [ 136 "-s" 137 "tracker" 138 "-s" 139 "assets" 140 "-s" 141 "mjmlNif" 142 ]; 143 }; 144 inherit 145 assets 146 tracker 147 mjmlNif 148 ; 149 }; 150 151 env = { 152 APP_VERSION = version; 153 RUSTLER_PRECOMPILED_FORCE_BUILD_ALL = "true"; 154 RUSTLER_PRECOMPILED_GLOBAL_CACHE_PATH = "unused-but-required"; 155 }; 156 157 preBuild = '' 158 rm -r assets tracker 159 cp --no-preserve=mode -r ${assets} assets 160 cp -r ${tracker} tracker 161 162 cat >> config/config.exs <<EOF 163 config :tailwind, path: "${lib.getExe tailwindcss_3}" 164 config :esbuild, path: "${lib.getExe esbuild}" 165 EOF 166 ''; 167 168 postBuild = '' 169 npm run deploy --prefix ./tracker 170 171 # for external task you need a workaround for the no deps check flag 172 # https://github.com/phoenixframework/phoenix/issues/2690 173 mix do deps.loadpaths --no-deps-check, assets.deploy 174 mix do deps.loadpaths --no-deps-check, phx.digest priv/static 175 ''; 176 177 meta = with lib; { 178 license = licenses.agpl3Plus; 179 homepage = "https://plausible.io/"; 180 changelog = "https://github.com/plausible/analytics/blob/${src.rev}/CHANGELOG.md"; 181 description = "Simple, open-source, lightweight (< 1 KB) and privacy-friendly web analytics alternative to Google Analytics"; 182 mainProgram = "plausible"; 183 teams = [ teams.cyberus ]; 184 platforms = platforms.unix; 185 }; 186}