有没有办法将包从源代码包含到nix shell中,即链接到实际源代码而不是nix存储中的代码副本的路径,以用于调试目的?
即我正在寻找相当于跑步的尼克斯片
python setup.py develop
在 conda 环境中而不是安装。
我发现最接近的是使用 flake.nix 之类的
{
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
outputs = { self, nixpkgs }:
let
pkgs = import nixpkgs { system = "x86_64-linux"; };
python_library = pkgs.python3Packages.buildPythonPackage {
pname = "python_library";
version = "0.1";
src = /home/user_name/python_library;
doCheck = false;
};
in {
defaultPackage.x86_64-linux = pkgs.buildEnv {
name = "test-env";
paths = [
(pkgs.python3.withPackages(ps: [
ps.numpy
ps.scipy
ps.matplotlib
python_library
]))
pkgs.spyder
];
};
};
}
其中
python_library
包含我希望调试的新代码,例如
class Hello:
def __init__(self):
print("Hello!!! Hello!")
我通过它进行测试
>>> from artiq_library.test import Hello
>>> a=Hello()
Hello!!! Hello!
为了使代码更改生效,我需要运行
nix build
nix shell
只要 flake 不在 git 存储库中,它就会使用更新的代码重建 nix 环境。然而,在更复杂的情况下,如果有很多错误需要修复,并且总是必须在 nix flake 和要执行的代码之间切换文件夹,那么这个重建过程可能会变得非常烦人,所以我想知道是否有一种方法可以编写以这样的方式进行切片,即 nix 存储直接链接到源代码,而不是像 anaconda 那样复制它?
nix develop
命令似乎都没有为我做类似的事情。
有几种不同的方法可以做到这一点,最好的方法可能取决于特定的包以及您想要如何访问源代码。
shell.nix:
let
pkgs = import <nixpkgs> {};
in
pkgs.mkShell {
buildInputs = [ pkgs.python3 ];
src1 = pkgs.python3.src;
src2 = pkgs.fetchzip {
url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
hash = "sha256-JuAdS/B3YTTzkhtgvdY5ehutbDnYS5Q9E2GzafmV+jw=";
};
src3 = builtins.fetchTarball {
url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
};
}
$ nix-shell
$ ls $src1
/nix/store/i17s0hxbiqzphgz72vr6jpvh4h2xa3cv-Python-3.10.13.tar.xz
$ ls $src2
aclocal.m4 configure Grammar Lib Makefile.pre.in Objects PCbuild Python
config.guess configure.ac Include LICENSE Misc Parser Programs README.rst
config.sub Doc install-sh Mac Modules PC pyconfig.h.in Tools
$ ls $src3
aclocal.m4 configure Grammar Lib Makefile.pre.in Objects PCbuild Python
config.guess configure.ac Include LICENSE Misc Parser Programs README.rst
config.sub Doc install-sh Mac Modules PC pyconfig.h.in Tools
有几种不同的方法可以做到这一点,最好的方法可能取决于特定的包以及您想要访问源代码的方式。按照惯例,包通常有一个
src
属性,您可以访问它来获取其源代码的派生,但该派生可能会产生一个 tar 球(就像 python3.src
的情况一样),或者可能会生成该源代码的提取副本源代码。此外, .src
属性通常不包含任何适用于源代码的补丁,这对您来说可能很重要。
shell.nix:
let
pkgs = import <nixpkgs> {};
in
pkgs.mkShell {
buildInputs = [ pkgs.python3 ];
src1 = pkgs.python3.src;
src2 = pkgs.fetchzip {
url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
hash = "sha256-JuAdS/B3YTTzkhtgvdY5ehutbDnYS5Q9E2GzafmV+jw=";
};
src3 = builtins.fetchTarball {
url = "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz";
};
}
$ nix-shell
$ ls $src1
/nix/store/i17s0hxbiqzphgz72vr6jpvh4h2xa3cv-Python-3.10.13.tar.xz
$ ls $src2
aclocal.m4 configure Grammar Lib Makefile.pre.in Objects PCbuild Python
config.guess configure.ac Include LICENSE Misc Parser Programs README.rst
config.sub Doc install-sh Mac Modules PC pyconfig.h.in Tools
$ ls $src3
aclocal.m4 configure Grammar Lib Makefile.pre.in Objects PCbuild Python
config.guess configure.ac Include LICENSE Misc Parser Programs README.rst
config.sub Doc install-sh Mac Modules PC pyconfig.h.in Tools