#lock-file #shell #revision #nix #packages #nixpkgs #transient

app nix-shell-locked

用于从 lockfiles 读取以获取在临时 shell 中安装的软件包时要使用的 nixpkgs 版本的 nix shell 的包装器

4 个版本

0.2.1 2023 年 5 月 1 日
0.2.0 2023 年 4 月 30 日
0.1.1 2023 年 4 月 30 日
0.1.0 2023 年 4 月 30 日

#364配置

每月 42 次下载

MIT 许可证

16KB
223

Nix Shell Locked

Latest Version

nix-shell-locked 是一个程序,它启动一个新的 shell,其中包含一些指定的软件包,但不会在用户或系统范围内安装它们。软件包从与系统或 home-manager 配置关联的 flake.lock 文件中读取 nixpkgs 的修订版进行安装。读取位于 ~/.config/nix-shell-locked.toml 的配置文件,以确定要查找的 flake lockfile 以确定要使用的 nixpkgs 版本。

# ~/.config/nix-shell-locked.toml
flake_lockfile = "/path/to/config/repo/flake.lock"

此版本旨在作为 nix-shell 的替代品,在需要使用 flakes 来管理 NixOS 系统配置或 home-manager 的情况下。问题在于 nix-shell 使用 nixpkgs 通道,这可能无法与 flakes-managed 系统或 home-manager 配置中的 nixpkgs 版本保持同步,这可能导致运行时错误。

快速示例

# initially `cowsay` is not installed
$ cowsay
bash: cowsay: command not found

# enter a new shell with cowsay available
$ nix-shell-locked cowsay

# now `cowsay` is installed (but only in this shell session)
$ cowsay "Hello, World!"
 _______________
< Hello, World! >
 ---------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

# leave the shell session
$ exit
exit

# now `cowsay` is once again unavailable
$ cowsay
bash: cowsay: command not found

安装

在 nix 配置文件中安装 flake

$ nix profile install github:gridbugs/nix-shell-locked

使用 cargo 安装

$ cargo install nix-shell-locked

使用基于 flakes 的 home-manager 安装

在此处查看示例配置 here

用法

$ nix-shell-locked --help
Usage: nix-shell-locked [OPTIONS] [PACKAGES ...] -- [ARGS ...]
Start a transient shell with some specified packages installed.
Packages are installed from the nixpkgs repo matching the revision from a flake.lock file.
Intended to be used to temporarily test out packages without committing to installing them,
and to guarantee that the packages are compatible with system-wide or home-manager configs
managed with flakes.

Configure with a file ~/.config/nix-shell-locked.toml, e.g.:
flake_lockfile = "/path/to/flake.lock"

Read more at https://github.com/gridbugs/nix-shell-locked


Args:
    [PACKAGES ...]     list of packages to install in shell

Options:
    [--dry-run]               print the command that would be executed instead of executing it
    [-c, --config PATH]       path to config file to use (defaults to $XDG_CONFIG_HOME/nix-shell-locked.toml)
    [-l, --lockfile PATH]     path to flake lockfile to use when determining nixpkgs revision
    [-h, --help]              print help message
    [-v, --version]           print version information

Extra Args:
    [ARGS ...]    Additional arguments to pass to `nix shell`

详细示例

我使用 flakes 来管理我的 NixOS 系统配置和 home-manager。我想尝试游戏机模拟器 "sameboy",但我不想将其安装到系统范围内或添加到我的 home-manager 配置中,因此我使用以下命令在临时 shell 中安装它

$ nix-shell -p sameboy

当我尝试运行它时

$ sameboy
SameBoy v0.15.8
Couldn't find matching GLX visual

这看起来是图形库和sameboy之间的版本不匹配。图形库在系统级配置中配置,我使用flakes进行管理,并定期更新。由于我现在几乎用flakes做所有事情,所以我忽略了保持渠道更新,因此sameboy的这个版本可能相当旧。理想情况下,应该有一种方法可以在临时shell中安装sameboy,其中sameboy的版本来自与系统级配置相同的nixpkgs修订版,而且已经有了。

我的系统配置中有一个包含以下部分的flake.lock文件:

// /path/to/config/repo/flake.lock
{
  "nodes": {
    "nixpkgs": {
      "locked": {
        "lastModified": 1682268651,
        "narHash": "sha256-2eZriMhnD24Pmb8ideZWZDiXaAVe6LzJrHQiNPck+Lk=",
        "owner": "nixos",
        "repo": "nixpkgs",
        "rev": "e78d25df6f1036b3fa76750ed4603dd9d5fe90fc",
        "type": "github"
      },

注意修订版 e78d25df6f1036b3fa76750ed4603dd9d5fe90fc

我们可以使用以下命令从这个修订版安装sameboy来创建一个临时shell:

$ nix shell nixpkgs/e78d25df6f1036b3fa76750ed4603dd9d5fe90fc#sameboy --command sameboy

这将下载并运行sameboy,使用与系统级图形库安装兼容的版本。这可以工作,但很麻烦。命令nix-shell-locked自动执行上述过程。创建一个配置文件~/.config/nix-shell-locked.toml来告诉nix-shell-locked在哪里查找要使用以获取当前修订版哈希的flake.lock文件。

# ~/.config/nix-shell-locked.toml
flake_lockfile = "/path/to/config/repo/flake.lock"

现在您可以通过运行以下命令启动具有正确版本sameboy的临时shell:

$ nix-shell-locked sameboy

幕后,这只是在运行 nix shell ... 并将所有参数传递给 nix shell,因此您可以这样做:

$ nix-shell-locked sameboy -- --command sameboy --help
SameBoy v0.15.8
Usage: sameboy [--fullscreen|-f] [--nogl] [--stop-debugger|-s] [rom]

您可以将多个包传递给 nix-shell-locked 以获取具有所有可用包的shell

$ nix-shell-locked ksh hello cowsay -- --command ksh -c "hello | cowsay -f tux"
 _______________
< Hello, world! >
 ---------------
   \
    \
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/

依赖项

~4–6.5MB
~114K SLoC