在Nixpkgs中,是什么让python派生成为应用程序而不是库?

时间:2017-10-03 14:18:05

标签: python nix nixpkgs

我正在尝试为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.nixpypi2nix的输出,而requirements.packages的类型为&#34;派生列表&#34;。尽管如此,当我进入Rednotebook的结果存储路径时,有一个带有一些包装器脚本的/bin目录。我的应用的商店路径只有lib和否/bin

如何告诉Nixpkgs我有申请?

3 个答案:

答案 0 :(得分:2)

buildPythonPackagebuildPythonApplication个功能,但在一天结束时,他们都会调用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.buildEnvpython.withPackages将不包括应用程序及其依赖项。