我正在尝试为Nix打包一个python应用程序,但我发现大多数文档都假定我要打包一个库。
为了做到这一点,我查看了Rednotebook示例(不是因为我碰巧知道它是用python编写的,除了任何特殊原因),可以在python-packages中找到,但因为该文件是这样的巨大的,这是相关的部分:
redNotebook = buildPythonPackage rec {
name = "rednotebook-1.8.1";
src = pkgs.fetchurl {
url = "mirror://sourceforge/rednotebook/${name}.tar.gz";
sha256 = "00b7s4xpqpxsbzjvjx9qsx5d84m9pvn383c5di1nsfh35pig0rzn";
};
# no tests available
doCheck = false;
propagatedBuildInputs = with self; [ pygtk pywebkitgtk pyyaml chardet ];
meta = {
homepage = http://rednotebook.sourceforge.net/index.html;
description = "A modern journal that includes a calendar navigation, customizable templates, export functionality and word clouds";
license = licenses.gpl2;
maintainers = with maintainers; [ tstrobel ];
};
};
我的推导看起来像这样:
{ pkgs ? import <nixpkgs> {} }:
let
requirements = import ./nix/requirements.nix { inherit pkgs; };
in
pkgs.python35Packages.buildPythonPackage rec {
name = "package-name";
version = "1.0.0";
namePrefix = "";
src = ./.;
doCheck = false;
propagatedBuildInputs = builtins.attrValues requirements.packages;
}
requirements.nix
是pypi2nix
的输出,而requirements.packages
的类型为&#34;派生列表&#34;。尽管如此,当我进入Rednotebook的结果存储路径时,有一个带有一些包装器脚本的/bin
目录。我的应用的商店路径只有lib
和否/bin
如何告诉Nixpkgs我有申请?
答案 0 :(得分:2)
有buildPythonPackage和buildPythonApplication个功能,但在一天结束时,他们都会调用mkPythonDerivation。
一个可以引用的简单Nix包的Python应用程序是Ranger;使用buildPythonApplication
。结果派生包含/nix/store/PACKAGE/bin/
答案 1 :(得分:1)
正在尝试构建和安装以Python编写的示例服务。
最终在我的安装程序中使用了buildPythonApplication
如果您要利用setuptools
分发应用,则需要在entry_points
调用中输入setup
值:
from distutils.core import setup
setup(
...
entry_points = {
'console_scripts': ['sample_module = src.app:main']
}
src -sourceocde文件夹 应用-入口点模块名称 主要-入口点功能的名称
我的整个构建配置是:
# sample.nix
with (import <nixpkgs> {});
python37.pkgs.buildPythonApplication rec {
pname = "sample_service";
version = "0.0.3";
src = ./sample_package;
meta = with lib; {
homepage = "https://www.example.com";
description = "Sample Python Service";
};
}
sample_package 是包含“ src”文件夹和“ setup.py”的文件夹,与“ sample.nix”文件位于同一级别。
此时,如果您运行nix-build sample.nix
,它将为您构建并安装软件包。但是,要使其在路径上可用,您将需要在nix存储中捕获结果路径并运行:
nix-env -i <nix_store_path>
答案 2 :(得分:0)
buildPythonPackage
用于库,也就是说,当您希望它在site-packages
中公开其模块时。 buildPythonApplication
用于恰好用Python编写的应用程序。在那种情况下,当您在另一个派生中包含这样的派生时,您就不想公开这些库。
这种分离很重要,因为Python 3环境可能会调用用Python 2编写的工具,反之亦然。
请注意,在撰写本文时,此问题尚未完全解决,但是至少python.buildEnv
或python.withPackages
将不包括应用程序及其依赖项。