2

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

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

4

3 回答 3

2

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

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

于 2017-10-04T18:51:45.513 回答
1

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

要点

如果您正在利用setuptools分发您的应用程序,您需要在调用中具有entry_points价值:setup

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

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

我的整个构建配置是:

# 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>
于 2019-09-16T15:59:01.727 回答
1

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

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

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

于 2019-07-10T07:47:09.557 回答