解决WSL上Nix构建因Windows换行符导致的失败问题
问题描述
在WSL上运行NixOS,使用nix 2.18.1版本,在包含如下flake.nix的目录执行nix develop时构建失败。
所用flake.nix代码
{ 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}; jina-hubble-sdk = with pkgs.python3Packages; buildPythonPackage rec { pname = "jina-hubble-sdk"; version = "0.39.0"; src = pkgs.fetchPypi { inherit pname version; sha256 = "9021417794a6d3cf3fad8a880cf668a3a986b9d53d5be5fa391aae1767a5b9b0"; }; nativeBuildInputs = [ poetry-core pkgs.dos2unix # Add dos2unix to convert line endings ]; propagatedBuildInputs = [ pep517 pip requests aiohttp rich importlib-metadata filelock pathspec docker pyyaml python-jose ]; # Convert line endings to Unix-style preConfigure = '' export HOME=$(mktemp -d) ''; # put this code inside preConfigure if you want to run it dos2unix -f /nix/store/v099hqvw5z87423p4hz1vfhzaqa07dii-stdenv-linux/setup }; pythonEnv = pkgs: pkgs.python3.withPackages (ps: with ps; [ jina-hubble-sdk ]); in { devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ curl ollama (pythonEnv pkgs) ]; }; }); }
报错信息
error: builder for '/nix/store/dm6cxw020s7whbfgqj8jivd3dv1pby0i-python3.11-jina-hubble-sdk-0.39.0.drv' failed with exit code 127; last 10 log lines: > Using setuptoolsCheckPhase > Running phase: unpackPhase > unpacking source archive /nix/store/9q6b5l6955sabgvk8ah5xx0sfji25zmn-jina-hubble-sdk-0.39.0.tar.gz > source root is jina-hubble-sdk-0.39.0 > setting SOURCE_DATE_EPOCH to timestamp 1688549032 of file jina-hubble-sdk-0.39.0/setup.cfg > Running phase: patchPhase > Running phase: updateAutotoolsGnuConfigScriptsPhase > Running phase: configurePhase > /nix/store/v099hqvw5z87423p4hz1vfhzaqa07dii-stdenv-linux/setup: line 114: $'\r': command not found > /nix/store/v099hqvw5z87423p4hz1vfhzaqa07dii-stdenv-linux/setup: line 131: pop_var_context: head of shell_variables not a function context For full logs, run 'nix-store -l /nix/store/dm6cxw020s7whbfgqj8jivd3dv1pby0i-python3.11-jina-hubble-sdk-0.39.0.drv'. error: 1 dependencies of derivation '/nix/store/25gl4f29rr56ci1h5k53wmm7wgfmk2p2-python3-3.11.8-env.drv' failed to build error: 1 dependencies of derivation '/nix/store/pxkgnl5nx66fcdi1rkvz86kbfrvlmhn2-nix-shell-env.drv' failed to build
关键错误行:
/nix/store/v099hqvw5z87423p4hz1vfhzaqa07dii-stdenv-linux/setup: line 114: $'\r': command not found
已尝试方法
推测是Linux与Windows换行符差异导致,尝试在preConfigure中添加dos2unix -f /nix/store/v099hqvw5z87423p4hz1vfhzaqa07dii-stdenv-linux/setup,但无效果。
解决方法
修复本地flake.nix文件的换行符
先确保你的flake.nix文件本身使用Unix换行符(LF),在WSL中执行:dos2unix flake.nix在Python包构建阶段转换源码中的换行符
修改jina-hubble-sdk的preConfigure脚本,转换源码目录下所有可执行脚本和文本文件的换行符,而不是修改Nix的stdenv脚本(该路径每次构建都会变化,且属于Nix内部文件):preConfigure = '' export HOME=$(mktemp -d) # 转换源码中所有shell脚本、Python文件、配置脚本的换行符为Unix格式 find . -type f \( -name "*.sh" -o -name "*.py" -o -name "setup" -o -name "configure" -o -name "*.cfg" \) -exec dos2unix {} + '';完整修改后的jina-hubble-sdk部分
jina-hubble-sdk = with pkgs.python3Packages; buildPythonPackage rec { pname = "jina-hubble-sdk"; version = "0.39.0"; src = pkgs.fetchPypi { inherit pname version; sha256 = "9021417794a6d3cf3fad8a880cf668a3a986b9d53d5be5fa391aae1767a5b9b0"; }; nativeBuildInputs = [ poetry-core pkgs.dos2unix # 保留dos2unix依赖 ]; propagatedBuildInputs = [ pep517 pip requests aiohttp rich importlib-metadata filelock pathspec docker pyyaml python-jose ]; preConfigure = '' export HOME=$(mktemp -d) # 转换源码中相关文件的换行符 find . -type f \( -name "*.sh" -o -name "*.py" -o -name "setup" -o -name "configure" -o -name "*.cfg" \) -exec dos2unix {} + ''; };
执行以上修改后,重新运行nix develop即可解决换行符导致的构建错误。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

