【问题标题】:In Nixpkgs, what makes a python derivation an application rather than a library?在 Nixpkgs 中,是什么让 python 派生成为应用程序而不是库?
【发布时间】:2018-03-14 18:45:44
【问题描述】:

我正在尝试为 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 的类型为“派生列表”。尽管如此,当我 cd 进入 Rednotebook 的结果存储路径时,还是有一个带有一些包装脚本的 /bin 目录。我的应用程序的商店路径只有lib 没有/bin

我如何告诉 Nixpkgs 我有一个应用程序?

【问题讨论】:

    标签: python nix nixpkgs


    【解决方案1】:

    正在尝试构建和安装一个用 Python 编写的示例服务。 最终在我的安装程序中使用buildPythonApplication

    要点

    如果您使用setuptools 分发您的应用程序,您需要在您的setup 调用中包含entry_points 值:

    from distutils.core import setup
    setup(
    ...
    entry_points = {
      'console_scripts': ['sample_module = src.app:main']
    }
    

    src - 源代码文件夹 app - 入口点模块名称 ma​​in - 入口点函数的名称

    我的整个构建配置是:

    # 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】:

    buildPythonPackage 用于库,即当您希望它在site-packages 中公开其模块时。 buildPythonApplication 适用于恰好用 Python 编写的应用程序。在这种情况下,当您在另一个派生中包含这样的派生时,您不想公开这些库。

    这种分离很重要,因为 Python 3 环境可能会调用用 Python 2 编写的工具,反之亦然。

    请注意,在撰写本文时,此问题尚未完全解决,但至少 python.buildEnvpython.withPackages 不会包含应用程序及其依赖项。

    【讨论】:

      【解决方案3】:

      buildPythonPackagebuildPythonApplication 函数,但归根结底,它们都调用mkPythonDerivation

      您可以参考的带有简单 Nix 包的 Python 应用程序是 Ranger;它使用buildPythonApplication。生成的派生在/nix/store/PACKAGE/bin/中包含一个包装器

      【讨论】:

      • 主要区别在于buildPythonApplication 显然不会将解释器版本添加到结果输出名称中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2015-09-16
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多