I am trying to set up a development mode Nix Shell for a Python project I am working on. The project is setup.py
-based, which according to the documentation is supported for a editable install. However, running nix-shell
produces a classical installation of the package.
Here are the relevant shell.nix
and default.nix
I use:
# shell.nix
{ pkgs ? import <nixpkgs> {} }:
with pkgs;
mkShell {
name = "roast-devshell";
buildInputs = [ (callPackage ./. {}) ];
}
# default.nix
{ lib, pkgs ? import <nixpkgs> { } }:
with pkgs.python310Packages;
let
f90nml = buildPythonPackage rec {
pname = "f90nml";
version = "1.3.1";
src = fetchPypi {
inherit pname version;
sha256 =
"145c1f2c55bad628d225af22fc9bf06347eb0d33e7bae8a05869a68274b8fb2d";
};
};
in
buildPythonPackage rec {
name = "roast";
version = "0.1";
src = ./.;
propagatedBuildInputs = [ numpy matplotlib scipy pyfftw f90nml ];
pythonImportsCheck = [ "roast" ];
doCheck = false;
meta = with lib; {
description = "Post-processing tool dedicated to the CFD DNS solver POUSSINS";
homepage = "https://gitlab.in2p3.fr/poussins/roast";
maintainers = with maintainers; [ loicreynier ];
platforms = platforms.unix;
};
}
The documentation tells you to just create a default.nix
containing the python package, not a shell.nix
too where the package is a dependency. nix-shell
works by creating and environment where the wanted package can be built by installing all the buildInputs
and the tools to build the package. So remove the shell.nix
and try again
1 Like
Thank you. I misunderstood the documentation. I removed the shell.nix
and migrated to a flake.nix
:
# flake.nix
{
description = "ROAST";
inputs.utils.url = "github:numtide/flake-utils";
outputs = { self, utils, nixpkgs }:
{
overlay = nixpkgs.lib.composeManyExtensions [
(final: prev: { roast = final.callPackage ./. { }; })
];
} // (utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
inherit system;
overlays = [ self.overlay ];
};
in
{
defaultPackage = pkgs.roast;
}));
}
Now nix develop
creates a proper “development mode” shell.
Following this, I was curious to know if it could be possible to have additional non-Python packages installed in the shell while keeping the package in development mode. My goal is to have a reproductive shell where I can have the package in development mode and all the external tools I use to work on it.
clearly it’s possible, there are various way to achieve it. For example you could use two “environments” one “inside” the other… a nix shell
that installs the tools followed by your nix develop
or you could use the same pip install -e
inside shellHook
of a devShell
that installs your tools. There was another thread on installing python packages without nix just before this one, have a look at it. Just remember that the purpose of both nix-shell
and nix develop
is that of give you a shell environment where your package can be built, not that of dealing with the details of preparing an environment for this or that editing tool…
1 Like