在Nixpkgs中,是什么使python派生成为应用程序而不是库?
我试图为Nix打包一个python应用程序,但是我发现大多数文档都假设我想要打包一个库 为了做到这一点,我查看了Rednotebook示例(并非出于任何特殊原因,只是我碰巧知道它是用python编写的),该示例可以在中找到,但由于该文件非常庞大,下面是相关部分:在Nixpkgs中,是什么使python派生成为应用程序而不是库?,python,nix,nixpkgs,Python,Nix,Nixpkgs,我试图为Nix打包一个python应用程序,但是我发现大多数文档都假设我想要打包一个库 为了做到这一点,我查看了Rednotebook示例(并非出于任何特殊原因,只是我碰巧知道它是用python编写的),该示例可以在中找到,但由于该文件非常庞大,下面是相关部分: redNotebook = buildPythonPackage rec { name = "rednotebook-1.8.1"; src = pkgs.fetchurl { url = "mirro
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;
}
{pkgs?导入{}}
让
requirements=import./nix/requirements.nix{inherit pkgs;};
在里面
pkgs.python35Packages.buildPythonPackage rec{
name=“包名”;
version=“1.0.0”;
名称前缀=”;
src=./。;
多切克=假;
propagatedBuildInputs=builtins.attrValues requirements.packages;
}
requirements.nix
是pypi2nix
和requirements.packages
的输出,类型为“派生列表”。尽管如此,当我将cd放入Rednotebook的结果存储路径时,有一个带有一些包装脚本的/bin
目录。我的应用程序的存储路径只有一个lib
no/bin
我如何告诉Nixpkgs我有一个应用程序?有和函数,但在一天结束时,它们都会调用
一个带有简单Nix包的Python应用程序可以参考:;它使用
buildPythonApplication
。生成的派生在/nix/store/PACKAGE/bin/
buildPythonPackage
中包含一个包装,用于库,也就是说,当您希望它在站点包中公开其模块时buildPythonApplication
适用于恰好用Python编写的应用程序。在这种情况下,当您在另一个派生中包含这样的派生时,您不希望公开库
这种分离很重要,因为Python 3环境可能会调用用Python 2编写的工具,反之亦然
请注意,在撰写本文时,这个问题尚未完全解决,但至少python.buildEnv
或python.withPackages
将不包括应用程序及其依赖项。正在尝试构建和安装用python编写的示例服务。
最后在我的安装程序中使用了buildPythonApplication
要点
如果您正在利用setuptools
分发应用程序,您需要在设置中设置入口点
值
调用:
来自distutils.core导入设置
设置(
...
入口点={
'控制台脚本':['sample\u module=src.app:main']
}
src-源代码文件夹
应用程序-入口点模块名称
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";
};
}
主要区别在于buildPythonApplication
显然没有将解释器版本添加到结果输出名称中。这是构建服务的中间步骤。为了清晰起见,我省略了这些元素。