我有一个名为myscript.py
的Python脚本,并希望将其打包为nix
派生mkDerivation
。
唯一的要求是我的Python脚本对consul
Python库(它本身依赖于requests
和six
Python库)具有运行时依赖性。
例如myscript.py
:
#!/usr/bin/env python3
import consul
print('hi')
怎么做?
我无法弄清楚如何传递mkDerivation
单个脚本(其src
似乎总是想要一个目录,或fetchgit
或类似),也可以&# 39;弄清楚如何在运行时使依赖库可用。
答案 0 :(得分:3)
如果您的脚本只有一个Python文件,则src
中不需要mkDerivation
,并且您也不需要解压缩任何源代码。
默认mkDerivation
会尝试解压缩您的源代码;为了防止这种情况,只需设置unpackPhase = "true";
(这是/bin/true
,即无效的程序。)
myscript-package = pkgs.stdenv.mkDerivation {
name = "myscript";
buildInputs = [
(pkgs.python36.withPackages (pythonPackages: with pythonPackages; [
consul
six
requests2
]))
];
unpackPhase = "true";
installPhase = ''
mkdir -p $out/bin
cp ${./myscript.py} $out/bin/myscript
chmod +x $out/bin/myscript
'';
};
如果您的脚本是可执行的(我们通过上面的chmod +x
确保)nix
将自动将您的#!/usr/bin/env python3
行替换为调用正确的特定python解释器的行(python36
行1}}在上面的示例中,并且在具有您在buildInputs
中指定的Python包的环境中这样做。
如果你使用NixOS,你也可以把你的包放到environment.systemPackages
,{N}在shell上可以使用myscript
。
答案 1 :(得分:0)
这个辅助函数真的很好:
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