构建DocArray包时出现"Backend 'poetry.core.masonry.api'不可用"错误求助
问题:Nix构建DocArray时提示找不到Poetry模块错误
由于Python包DocArray不在Nix包集合中,我尝试使用pkgs.python3Packages.buildPythonPackage自行构建,从PyPI获取了sha256哈希,配置了如下Flake文件:
{ description = "Python environment with ollama"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; python = pkgs.python311; ollama = pkgs.ollama; docarray = pkgs.python3Packages.buildPythonPackage rec { pname = "docarray"; version = "0.40.0"; format = "pyproject"; # Specify the package format src = pkgs.fetchPypi { inherit pname version; sha256 = "c3f3b88b7b6128c10308dddbd21650c9845e270da850cf6718cb1d3d867d5986"; # TODO }; #code proposed by phind (something like chatgpt) but it didn't help. Therefore it is commented # Add Poetry to the build inputs #buildInputs = [ pkgs.poetry ]; # Add any runtime dependencies here #propagatedBuildInputs = []; # Add any Python package metadata here #meta = with pkgs.lib; { # homepage = "https://github.com/docarray/docarray"; # description = "A Python package for managing document arrays"; # license = licenses.mit; #}; }; Py = python.withPackages (ps: with ps; [ langchain-community langchainplus-sdk langchain tiktoken docarray ]); in { devShells.default = pkgs.mkShell { buildInputs = [ pkgs.curl ollama Py ]; }; }); }
运行nix develop后出现如下错误:
error: builder for '/nix/store/0dq2bsq9zkgmp845l2ncqkk2i9p1pqlm-python3.11-docarray-0.40.0.drv' failed with exit code 1; last 10 log lines: > File "<frozen importlib._bootstrap>", line 1204, in _gcd_import > File "<frozen importlib._bootstrap>", line 1176, in _find_and_load > File "<frozen importlib._bootstrap>", line 1126, in _find_and_load_unlocked > File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed > File "<frozen importlib._bootstrap>", line 1204, in _gcd_import > File "<frozen importlib._bootstrap>", line 1176, in _find_and_load > File "<frozen importlib._bootstrap>", line 1140, in _find_and_load_unlocked > ModuleNotFoundError: No module named 'poetry' > > ERROR Backend 'poetry.core.masonry.api' is not available. For full logs, run 'nix-store -l /nix/store/0dq2bsq9zkgmp845l2ncqkk2i9p1pqlm-python3.11-docarray-0.40.0.drv'. error: 1 dependencies of derivation '/nix/store/rqg7i9w02fmbxqf2c4i3gz16icsx7q68-python3-3.11.8-env.drv' failed to build error: 1 dependencies of derivation '/nix/store/qxx83jf2n4l8zchdwagg6wsk4pz439v7-nix-shell-env.drv' failed to build
解决方案
错误原因
DocArray使用poetry.core.masonry.api作为构建后端,Nix在构建过程中找不到该依赖。之前尝试添加系统级的pkgs.poetry是错误的,因为构建后端需要的是Python包poetry-core,而非系统工具。
修改后的Flake配置
对docarray的构建配置做如下调整:
docarray = pkgs.python3Packages.buildPythonPackage rec { pname = "docarray"; version = "0.40.0"; format = "pyproject"; src = pkgs.fetchPypi { inherit pname version; sha256 = "c3f3b88b7b6128c10308dddbd21650c9845e270da850cf6718cb1d3d867d5986"; }; # 添加构建后端所需的poetry-core包 nativeBuildInputs = [ pkgs.python3Packages.poetry-core ]; # 添加DocArray的运行时依赖(根据PyPI官方依赖列表整理) propagatedBuildInputs = with pkgs.python3Packages; [ numpy pydantic requests typing-extensions pillow python-multipart jinja2 markdown-it-py mdurl pygments rich grpcio grpcio-tools protobuf cloudpickle psutil orjson python-dotenv ]; meta = with pkgs.lib; { homepage = "https://github.com/docarray/docarray"; description = "A Python package for managing document arrays"; license = licenses.mit; }; };
关键调整说明
- 添加
nativeBuildInputs:将poetry-core加入构建时的依赖,确保Nix能找到DocArray的构建后端。 - 补充
propagatedBuildInputs:DocArray运行时需要多个依赖包,必须显式声明,否则构建完成后运行代码会出现模块缺失错误。 - 启用
meta配置:完善包的元信息,符合Nix打包规范。
替换原配置中的docarray部分后,重新运行nix develop即可完成构建。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

