Nix copy done

This commit is contained in:
Daniel Flanagan 2024-07-08 12:18:24 -05:00
parent 06c5be472a
commit 18597260bf
2 changed files with 63 additions and 32 deletions

View file

@ -1,11 +1,24 @@
{
inputs.nixpkgs.url = "nixpkgs/nixos-24.05";
outputs = {nixpkgs, ...}: let
outputs = {
self,
nixpkgs,
...
}: let
systems = ["aarch64-linux" "aarch64-darwin" "x86_64-darwin" "x86_64-linux"];
pkgsFor = func: (nixpkgs.lib.genAttrs systems (system: (func (import nixpkgs {inherit system;}))));
in {
packages = pkgsFor (pkgs: {
what-is-my-ip = pkgs.callPackage ./what-is-my-ip.nix {};
default = pkgs.callPackage ./what-is-my-ip.nix {};
});
devShells = pkgsFor (pkgs: {
default = pkgs.mkShell {
packages = [self.outputs.packages.${pkgs.system}.default];
shellHook = ''
echo "Hello, Nix!"
'';
};
});
};
}

74
post.md
View file

@ -12,8 +12,8 @@ Let's walk through a single example of a shell script one may write: _what-is-my
```bash
#!/usr/bin/env bash
curl -s http://httpbin.org/get | \
jq --raw-output .origin
curl -s http://httpbin.org/get \
| jq --raw-output .origin
```
Sure, it's _sort of portable_, if you tell the person running it to have _curl_ and _jq_. What if you relied on a specific version of either though?
@ -31,7 +31,7 @@ We might leverage _[Nixpkgs' trivial builders](https://ryantm.github.io/nixpkgs/
pkgsFor = func: (nixpkgs.lib.genAttrs systems (system: (func (import nixpkgs {inherit system;}))));
in {
packages = pkgsFor (pkgs: {
what-is-my-ip = pkgs.callPackage ./what-is-my-ip.nix {};
default = pkgs.callPackage ./what-is-my-ip.nix {};
});
};
}
@ -50,21 +50,21 @@ pkgs.writeShellScriptBin "what-is-my-ip" ''
Here we are pinning our package to dependencies which come from NixOS/Nixpkgs release branch 24.05.
If we `nix build .#what-is-my-ip` and `readlink result` we get:
If we `nix build` and `readlink result` we get:
**/nix/store/lr6wlz2652r35rwzc79samg77l6iqmii-what-is-my-ip**
And, of course, we can run our result:
And, of course, we can run our built result:
```bash
```console
$ ./result/bin/what-is-my-ip
24.5.113.148
```
Or run it from the Flake:
Or run it from the Flake directly:
```bash
$ nix run .#what-is-my-ip
```console
$ nix run
24.5.113.148
```
@ -77,26 +77,46 @@ $ nix-store --query --graph $(readlink result) | nix shell nixpkgs#graphviz -c d
[![Image of what-is-my-ip dependencies as a graph](/assets/images/what-is-my-ip-deps.png)](/assets/images/what-is-my-ip-deps.png)
Let's create a _developer environment_ and bring in our new tool.
This is a great way to create developer environment with reproducible tools
This is a great way to create developer environments with reproducible tools.
```nix
let
pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/nixos-24.05.tar.gz") {};
what-is-my-ip = import ./what-is-my-ip.nix {inherit pkgs;};
in
pkgs.mkShell {
packages = [what-is-my-ip];
shellHook = ''
echo "Hello, Nix!"
'';
```diff
diff --git a/flake.nix b/flake.nix
index 2a99357..ab32421 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,11 +1,24 @@
{
inputs.nixpkgs.url = "nixpkgs/nixos-24.05";
- outputs = {nixpkgs, ...}: let
+ outputs = {
+ self,
+ nixpkgs,
+ ...
+ }: let
systems = ["aarch64-linux" "aarch64-darwin" "x86_64-darwin" "x86_64-linux"];
pkgsFor = func: (nixpkgs.lib.genAttrs systems (system: (func (import nixpkgs {inherit system;}))));
in {
packages = pkgsFor (pkgs: {
what-is-my-ip = pkgs.callPackage ./what-is-my-ip.nix {};
});
+
+ devShells = pkgsFor (pkgs: {
+ default = pkgs.mkShell {
+ packages = [self.outputs.packages.${pkgs.system}.what-is-my-ip];
+ shellHook = ''
+ echo "Hello, Nix!"
+ '';
+ };
+ });
};
}
```
```
nix-shell what-is-my-ip-shell.nix
```console
$ nix develop -c $SHELL
Hello, Nix!
[nix-shell:~/tutorial]$ which what-is-my-ip
$ which what-is-my-ip
/nix/store/lr6wlz2652r35rwzc79samg77l6iqmii-what-is-my-ip/bin/what-is-my-ip
```
@ -104,11 +124,9 @@ Hello, Nix!
We can now do binary or source deployments 🚀🛠️📦 since we know the full dependency closure of our tool. We simply copy the necessary _/nix/store_ paths to another machine with Nix installed.
```bash
nix copy --to ssh://nixie.tail9f4b5.ts.net \
$(nix-build what-is-my-ip.nix) --no-check-sigs
ssh nixie.tail9f4b5.ts.net
```console
$ nix copy --to ssh://beefcake $(nix build --print-out-paths)
$ ssh beefcake
[fmzakari@nixie:~]$ /nix/store/lr6wlz2652r35rwzc79samg77l6iqmii-what-is-my-ip/bin/what-is-my-ip
98.147.178.19