Add mix spec. (#8)

Allows pinning the version of mix used to generate new Elixir projects.
pull/9/head
Joshua Potter 2023-11-26 16:38:55 -07:00 committed by GitHub
parent 5b1b129b78
commit d5ff5db55e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 212 additions and 0 deletions

13
specs/mix/runner Executable file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env bash
cp -r template/. "$OUT"
# Generate a new project with the specified name using `mix`. Pipe in `yes`
# since `mix` requires confirmation when writing out to a directory that already
# has content.
nix develop "$OUT" --command bash -c "yes | mix new $OUT --app '$APP'"
# Replace the template name of the flake.nix file with the new app name. The
# mix generator would fail if `$APP` does not consist of just lowercase ASCII
# letters, numbers, or underscores. Thus the following command is safe.
sed -i "s/<APP_NAME>/$APP/g" "$OUT/flake.nix"

6
specs/mix/spec.json Normal file
View File

@ -0,0 +1,6 @@
{
"app": {
"type": "text",
"prompt": "App Name> "
}
}

View File

@ -0,0 +1,3 @@
#!/usr/bin/env bash
use flake

View File

@ -0,0 +1,25 @@
# Mix Flake Template
This is a template for constructing a working environment for Elixir development
(version 1.15.7, Erlang/OTP 25) with the [mix](https://hexdocs.pm/mix/1.12/Mix.html)
tool. [direnv](https://direnv.net/) can be used to launch a dev shell upon
entering this directory (refer to `.envrc`). Otherwise run via:
```bash
$> nix develop
```
## Language Server
The [elixir-ls](https://github.com/elixir-lsp/elixir-ls) LSP (version 0.17.10)
is included in this flake.
## Dependencies
This project pins Mix dependencies using [mix2nix](https://github.com/ydlr/mix2nix).
After updating your `mix.lock` file, make sure to re-run the following:
```bash
mix2nix > deps.nix
```
As of now, `mix2nix` cannot handle git dependencies found inside the `mix.lock`
file. If you have git dependencies, add them manually or use
[FODs](https://nixos.org/manual/nixpkgs/stable/#packaging-beam-applications).

View File

@ -0,0 +1,10 @@
(import
(
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in
fetchTarball {
url = lock.nodes.flake-compat.locked.url or "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{ src = ./.; }
).defaultNix

View File

@ -0,0 +1,13 @@
{ lib, beamPackages, overrides ? (x: y: {}) }:
let
buildRebar3 = lib.makeOverridable beamPackages.buildRebar3;
buildMix = lib.makeOverridable beamPackages.buildMix;
buildErlangMk = lib.makeOverridable beamPackages.buildErlangMk;
self = packages // (overrides self packages);
packages = with beamPackages; with self; {
};
in self

View File

@ -0,0 +1,76 @@
{
"nodes": {
"flake-compat": {
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"revCount": 57,
"type": "tarball",
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz"
},
"original": {
"type": "tarball",
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1694529238,
"narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "ff7b65b44d01cf9ba6a71320833626af21126384",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1700794826,
"narHash": "sha256-RyJTnTNKhO0yqRpDISk03I/4A67/dp96YRxc86YOPgU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "5a09cb4b393d58f9ed0d9ca1555016a8543c2ac8",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"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
}

View File

@ -0,0 +1,66 @@
{
description = ''
An opinionated mix flake.
To generate a copy of this template elsewhere, run:
> bootstrap mix
'';
inputs = {
flake-compat.url = "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz";
flake-utils.url = "github:numtide/flake-utils";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = { self, nixpkgs, flake-utils, ... }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
inherit (pkgs.beam.packages.erlang_25)
beamPackages
buildMix
elixir
elixir-ls
hex
mixRelease;
deps = import ./deps.nix {
lib = pkgs.lib;
inherit beamPackages;
};
in
{
packages = {
lib = buildMix {
name = "<APP_NAME>";
src = ./.;
version = "0.1.0";
beamDeps = builtins.attrValues deps;
};
app = mixRelease {
pname = "<APP_NAME>";
src = ./.;
version = "0.1.0";
mixNixDeps = deps;
};
default = self.packages.${system}.lib;
};
devShells.default = pkgs.mkShell {
inputsFrom = [
self.packages.${system}.app
self.packages.${system}.lib
];
packages = [
elixir
elixir-ls
hex
] ++ (with pkgs; [
mix2nix
]);
};
});
}