You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将私有依赖库的wheel打包进主应用的wheel中?

解决方案

方案1:内嵌私有依赖Wheel并自动安装(推荐)

这个方案通过setuptools把私有库的Wheel包嵌入到应用包中,再通过安装后的脚本自动完成依赖安装,客户只需执行pip install x.whl即可。

步骤:

  1. 准备私有依赖Wheel:
    在内部网络(连VPN)下载私有库的Wheel包,放到应用项目的指定目录,比如your_app_package/vendor/(your_app_package是你的应用源码包目录)。

  2. 配置setuptools包含内嵌文件:
    修改setup.py,通过package_data将私有Wheel纳入打包范围:

    from setuptools import setup, find_packages
    
    setup(
        name="your_app",
        version="1.0.0",
        packages=find_packages(),
        # 配置内嵌的私有依赖Wheel
        package_data={
            "your_app_package": ["vendor/private_lib-1.0.0-py3-none-any.whl"],
        },
        include_package_data=True,
        # 公共依赖正常声明,私有依赖不要在这里加(避免客户安装时触发远程下载)
        install_requires=[
            "requests>=2.25.1",
            # 不要加"private_lib>=1.0.0"
        ],
    )
    
  3. 添加安装后自动安装脚本:
    在setup.py中自定义安装命令,在应用安装完成后自动安装内嵌的私有Wheel:

    import os
    import sys
    import subprocess
    from setuptools import setup, find_packages
    from setuptools.command.install import install
    
    class PostInstall(install):
        def run(self):
            # 先执行标准安装流程
            install.run(self)
            # 获取应用安装后的目录路径
            app_install_dir = os.path.join(self.install_lib, "your_app_package")
            wheel_path = os.path.join(app_install_dir, "vendor", "private_lib-1.0.0-py3-none-any.whl")
            # 调用当前环境的pip安装内嵌Wheel
            subprocess.run(
                [sys.executable, "-m", "pip", "install", wheel_path],
                check=True,
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE
            )
    
    setup(
        name="your_app",
        version="1.0.0",
        packages=find_packages(),
        package_data={
            "your_app_package": ["vendor/private_lib-1.0.0-py3-none-any.whl"],
        },
        include_package_data=True,
        install_requires=[
            "requests>=2.25.1",
        ],
        # 指定自定义安装命令
        cmdclass={"install": PostInstall},
    )
    
  4. 区分内部/外部构建:
    如果需要在内部环境仍能通过--extra-index-url正常安装(依赖私有仓库),可以通过环境变量控制:

    import os
    
    install_requires = ["requests>=2.25.1"]
    # 内部构建时添加私有依赖声明
    if os.getenv("INTERNAL_BUILD") == "1":
        install_requires.append("private_lib>=1.0.0")
    
    # 后续setup配置中使用这个install_requires
    

    内部构建Wheel时执行:

    INTERNAL_BUILD=1 python setup.py bdist_wheel
    

    给客户的外部构建则直接执行python setup.py bdist_wheel。

方案2:构建包含所有依赖的"胖Wheel"(适用于纯Python依赖)

在内部环境中,直接构建包含私有依赖的应用Wheel,本质是把依赖的代码合并到应用Wheel中:

  1. 先在内部环境安装wheel和setuptools:

    pip install wheel setuptools>=42
    
  2. 用pip wheel命令构建应用及所有依赖的Wheel,同时指定私有仓库地址:

    pip wheel --wheel-dir=./dist --extra-index-url=https://your-gitlab-private-repo.com/simple/ ./
    

    这会把应用和所有依赖(包括私有库)的Wheel下载到./dist目录。

  3. 使用wheel工具合并依赖:
    解压应用Wheel和私有依赖Wheel,把私有库的源码目录复制到应用Wheel的site-packages目录下,然后重新打包Wheel。这个步骤可以写脚本自动化,适合依赖较少的场景。

注意事项:

  • 每次私有库版本更新,都要同步替换应用项目中的内嵌Wheel文件,确保版本匹配。
  • 方案1的post-install脚本在某些严格的环境(如无pip权限的系统)可能受限,需提前测试。
  • 避免在install_requires中声明私有依赖,防止客户安装时触发远程下载报错。

内容的提问来源于stack exchange,提问作者Adam Korba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:43:14