Hi,
I have started adding flake.nix files to my projects, and really like the overall ergonomics that it provides. I have run into an issue. When connected to a NixOS machine using ssh
, nix develop
along with tmux
are causing strange behavior.
- When using a
nix develop
shell environment withintmux
, theTMPDIR
being used does not exist but the parentTMPDIR
does.
# /path/to/project
tmux new-session -s <project>
# inside tmux
nix develop # tries to use a TMPDIR that does not exist within another
# TMPDIR that exists
# error: creating temporary file '/tmp/nix-shell.dZmZup/nix-shell.EkR9Tx':
# No such file or directory
# Expected behavior: is for there to be a single nix-shell TMPDIR for
# that tmux window
- When using
tmux
within anix develop
shell environment, the TMPDIR is correct but I get
# /path/to/project
nix develop # runs fine
tmux new-session -s <project>
cargo build # build step for the project using pkg from buildInputs
# error: couldn't create a temp dir: No such file or directory (os error 2)
# at path "/tmp/nix-shell.dZmZup/rustcZLnBTI"
# Expected behavior: is for there to be a single nix-shell TMPDIR
# for the tmux session, and for the build step to complete
I mentioned the ssh
part because it seems to be relevant, I tested both methods and they work on my local NixOS machine. There is also a chance that both errors are not related but I do not know enough to be sure.
Any help or guidance is appreciated.
Update: flake.nix seemed relevant, and make it easier if someone wanted to attempt to reproduce the error.
flake.nix
{
description = "rust-dev";
inputs =
{
nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11";
};
outputs = { self, nixpkgs, ... }@inputs:
let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
in
{
devShells.x86_64-linux.default = pkgs.mkShell rec {
buildInputs = with pkgs; [
# rust deps
rustc
cargo
rust-analyzer
rustfmt
# dev deps
pkg-config # general requirement for *-sys crates
tmux entr # QoL
gdb valgrind evcxr # debugging
];
shellHook = ''
root_dir=$(pwd)/.tools
#rust
export CARGO_HOME=$root_dir/cargo
export PATH=$CARGO_HOME/bin:$PATH
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${builtins.toString (pkgs.lib.makeLibraryPath buildInputs)}";
if [ ! -d $root_dir ]; then
echo tools_dir missing, creating
mkdir $root_dir
fi
exec fish
'';
};
};
}