我叫一个Python脚本myscript.py,并想将它打包了一个nix与推导mkDerivation。
唯一的要求是我的 Python 脚本有一个运行时依赖项,比如说,对于consulPython 库(它本身依赖于requests和sixPython 库)。
例如对于myscript.py:
#!/usr/bin/env python3
import consul
print('hi')
Run Code Online (Sandbox Code Playgroud)
怎么做?
我不知道如何传递mkDerivation单个脚本(它src似乎总是需要一个目录fetchgit或类似的),也无法弄清楚如何在运行时使依赖库可用。
nh2*_*nh2 11
当你有一个 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
'';
};
Run Code Online (Sandbox Code Playgroud)
如果您的脚本是可执行的(我们在chmod +x上面确保)nix将自动将您的#!/usr/bin/env python3行替换为调用正确的特定 python 解释器的行(python36上面示例中的那个),并且在具有 Python 包的环境中执行此操作已在buildInputs可用中指定。
如果您使用 NixOS,那么您还可以将您的包放入environment.systemPackages,并且myscript将在该 NixOS 上的 shell 中可用。
小智 9
这个辅助函数非常好:
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)
''
Run Code Online (Sandbox Code Playgroud)
https://github.com/nixos/nixpkgs/blob/master/pkgs/build-support/writers/default.nix#L319
| 归档时间: |
|
| 查看次数: |
1502 次 |
| 最近记录: |