2017-05-07 50 views
2

我有一個叫做myscript.py的Python腳本,並且想用mkDerivation將它打包爲nix派生。如何打包一個Python腳本與nix?

唯一的要求是,我的Python腳本對於Python庫(它本身取決於requestssix Python庫)具有運行時相關性,例如consul

例如,對於myscript.py

#!/usr/bin/env python3 

import consul 
print('hi') 

如何做到這一點?

我無法弄清楚如何通過mkDerivation一個腳本(其src似乎總是希望有一個目錄,或fetchgit或類似),也無法弄清楚如何使在運行時可用的依賴庫。

回答

1

當你有一個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 
    ''; 
}; 

nix會自動將其中一個調用權的具體Python解釋器(一個在上面的例子中python36),並且在有你specifified的Python包的環境下這樣做替換您的#!/usr/bin/env python3線在buildInputs可用。

如果您使用NixOS,那麼您也可以將您的軟件包放入environment.systemPackages,並且myscript將在該NixOS的shell中可用。

相關問題