Windows下构建带入口点的noarch conda包的conda-build报错问题咨询
核心逻辑说明
noarch类型的conda包要求所有打包内容为平台无关的纯文本/字节码文件,Windows下setuptools默认生成的foo.exe是PE格式二进制,确实违反noarch规范;Linux下生成的无扩展名入口为纯文本Python脚本,符合要求。
一、合规构建带入口的noarch Python包的可行方案
- 核心思路:放弃setuptools自动生成平台相关入口的默认逻辑,改用跨平台纯文本入口脚本,从根源上消除平台相关二进制
- 具体操作:
- 移除
pyproject.toml、setup.cfg或setup.py中的[options.entry_points]配置,关闭setuptools的自动入口生成逻辑 - 手动编写无扩展名的纯文本入口脚本,同时兼容类Unix和Windows系统,内容参考:
#!/usr/bin/env python from bar import main if __name__ == "__main__": main() - 在包配置中通过
scripts参数指定上述手动编写的脚本,比如在setup.cfg中添加:[options] scripts = foo - 在conda recipe的
meta.yaml中正常设置build.noarch: python即可,所有打包内容均为平台无关文件,不会触发noarch合规报错
- 移除
- 优势:该方案生成的入口为纯文本,Windows和类Unix系统均能正常识别执行,完全符合noarch规范。
二、临时规避生成无扩展名入口包装的方案
如果需要保留entry_points配置的同时绕过Windows下exe生成的问题,可采用以下两类方案:
- 方案1:修改setuptools入口生成参数
构建前设置环境变量SETUPTOOLS_EXT_SUFFIX为空,强制setuptools生成纯文本入口而非exe:# Windows cmd 环境执行 set SETUPTOOLS_EXT_SUFFIX=
该配置会让setuptools跳过Windows下的exe包装流程,直接生成无扩展名的纯文本入口脚本。# Windows PowerShell 环境执行 $env:SETUPTOOLS_EXT_SUFFIX="" - 方案2:conda-build层面临时替换生成文件
在recipe的build.script中添加逻辑,在setuptools生成入口后自动替换exe文件:
该逻辑会删除生成的build: noarch: python script: - python -m pip install . --no-deps -vv - cd %SCRIPTS% - del foo.exe - echo #!/usr/bin/env python > foo - echo from bar import main >> foo - echo main() >> foofoo.exe,替换为功能等价的无扩展名纯文本脚本,绕过noarch合规检查。
内容的提问来源于stack exchange,提问作者marscher
相关产品推荐
相关产品推荐

