我有一个名为
myscript.py
的 Python 脚本,并希望将其打包为 nix
的派生 mkDerivation
。
唯一的要求是我的 Python 脚本具有运行时依赖项,例如
consul
Python 库(它本身依赖于 requests
和 six
Python 库)。
例如
myscript.py
:
#!/usr/bin/env python3
import consul
print('hi')
如何做到这一点?
我不知道如何传递
mkDerivation
单个脚本(它的 src
似乎总是需要一个目录,或 fetchgit
或类似的),也无法弄清楚如何使依赖库可用在运行时。
当您使用单个 Python 文件作为脚本时,您的
src
中不需要 mkDerivation
,也不需要解压任何源代码。
默认
mkDerivation
将尝试解压您的源代码;为了防止这种情况,只需设置 dontUnpack = true
。
myscript-package = pkgs.stdenv.mkDerivation {
name = "myscript";
propagatedBuildInputs = [
(pkgs.python3.withPackages (pythonPackages: with pythonPackages; [
consul
six
requests2
]))
];
dontUnpack = true;
installPhase = "install -Dm755 ${./myscript.py} $out/bin/myscript";
};
如果您的脚本是可执行的(我们通过上面的
install -m
确保这一点),Nix 将自动将您的 #!/usr/bin/env python3
行替换为调用正确的特定 python 解释器的行(上例中用于 python36
的行),并且因此,在具有您在 propagatedBuildInputs
中指定的 Python 包的环境中可用。
如果您使用 NixOS,您也可以将包放入
environment.systemPackages
,并且 myscript
将在该 NixOS 的 shell 中可用。
这个辅助功能非常好:
pkgs.writers.writePython3Bin "github-owner-repos" { libraries = [ pkgs.python3Packages.PyGithub ]; } ''
import os
import sys
from github import Github
if __name__ == '__main__':
gh = Github(os.environ['GITHUB_TOKEN'])
for repo in gh.get_user(login=sys.argv[1]).get_repos():
print(repo.ssh_url)
''
https://github.com/nixos/nixpkgs/blob/master/pkgs/build-support/writers/default.nix#L319