funboost icon indicating copy to clipboard operation
funboost copied to clipboard

打包优化

Open danerlt opened this issue 7 months ago • 7 comments

项目包管理通过uv或者poetry工具来管理,推荐使用uv来管理。现在通过setup.py,安装的时候会安装很多不需要的依赖,比如我只需要redis的broker,使用 uv add funboost[broker-redis]这样就可以了,不需要安装所有中间件的依赖。

danerlt avatar May 27 '25 07:05 danerlt

Image

Image

现在的 setup.py 就是选装的,没有自动给你安装 各种以下 中间件。

           'confluent_kafka==1.7.0',
             "pulsar-client==3.1.0; python_version>='3.7'",
             'celery',
             'flower',
             'nameko==2.14.1',
             'sqlalchemy==1.4.13',
             'sqlalchemy_utils==0.36.1',
             'dramatiq==1.14.2',
             'huey==2.4.5',
             'rq==1.15.0',
             'kombu',
             'eventlet==0.33.3',
             'gevent==22.10.2',
             'elasticsearch',
             'gnsq==1.0.1',
             'psutil',
             'peewee==3.17.3',
             'nats-python',
             'aiohttp==3.8.3',
             'paho-mqtt',
             'rocketmq',
             'zmq',
             'pyzmq',
             'kafka-python==2.0.2',

也没有自动给你安装 funboost web manager 管理页面的 flask生态。 extra_flask = ['flask', 'flask_bootstrap', 'flask_wtf', 'wtforms', 'flask_login']

pip install funboost 已经是很克制了。 没有自动给你安装kafka celery pyzmq这些中间件。

pip install funboost[all] 才是安装所有包。 pip install funboost[flask] 是安装 web管理页面所需的三方包

ydf0509 avatar May 27 '25 08:05 ydf0509

redis 是必选安装,不能让用户选择是否安装redis。因为有很多功能需要用到它,不光是作为redis队列。 例如funboost web manager的很多功能,都是依赖redis数据库的数据和通信的。 包括任务过滤 分布式控频,都是要redis

ydf0509 avatar May 27 '25 08:05 ydf0509

Image

例如这个界面就是高度依赖redis的,你用rabbitmq kafka,也要安装redis

ydf0509 avatar May 27 '25 08:05 ydf0509

现在安装broker的时候所有的中间件会全部都安装,我不希望将所有的broker都安装上,只安装我用的的broker所依赖的库。

danerlt avatar May 28 '25 01:05 danerlt

高度依赖redis的话,那可以在安装funboost的时候就将redis安装上。就是对下面这个依赖做一下分组,根据选择的broker只安装对应broker的依赖。

Image

danerlt avatar May 28 '25 01:05 danerlt

这个是我用claude 4 根据setupy.py改写成的pyproject.toml,内容如下,功能我没有验证,可以参考一下。我将broker拆分了一下

[build-system]
requires = ["setuptools>=61.0", "wheel", "setuptools_rust"]
build-backend = "setuptools.build_meta"

[project]
name = "funboost"
dynamic = ["version"]
description = "pip install funboost,python全功能分布式函数调度框架,funboost的功能是全面性重量级,用户能想得到的功能99%全都有;funboost的使用方式是轻量级,只有@boost一行代码需要写。支持python所有类型的并发模式和一切知名消息队列中间件,支持如 celery dramatiq等框架整体作为funboost中间件,python函数加速器,框架包罗万象,用户能想到的控制功能全都有。一统编程思维,兼容50% python业务场景,适用范围广。只需要一行代码即可分布式执行python一切函数,funboost web manager 方便查看和管理消费函数;99%用过funboost的pythoner 感受是 简易 方便 强劲 强大,相见恨晚"
readme = "README.md"
license = {text = "BSD License"}
authors = [
    {name = "bfzs", email = "[email protected]"}
]
maintainers = [
    {name = "ydf", email = "[email protected]"}
]
keywords = [
    "funboost", "distributed-framework", "function-scheduling", "rabbitmq", 
    "rocketmq", "kafka", "nsq", "redis", "disk", "sqlachemy", "consume-confirm", 
    "timing", "task-scheduling", "apscheduler", "pulsar", "mqtt", "kombu", 
    "的", "celery", "框架", "分布式调度"
]
classifiers = [
    "Development Status :: 4 - Beta",
    "Operating System :: OS Independent",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: BSD License",
    "Programming Language :: Python",
    "Programming Language :: Python :: Implementation",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3 :: Only",
    "Topic :: Software Development :: Libraries"
]
requires-python = ">=3.7"
dependencies = [
    "nb_log>=13.2",
    "nb_libs>=1.8",
    "nb_time>=2.4",
    "pymongo>=4.6.3",
    "AMQPStorm==2.10.6",
    "rabbitpy==2.0.1",
    "decorator==5.1.1",
    "tomorrow3==1.1.0",
    "persist-queue>=0.4.2",
    "apscheduler>=3.10.1,<4.0.0",
    "pikav0",
    "pikav1",
    "redis2",
    "redis3",
    "redis5",
    "redis",
    "setuptools_rust",
    "fabric2>=2.6.0",
    "nb_filelock",
    "pysnooper",
    "deprecated",
    "cryptography",
    "auto_run_on_remote",
    "frozenlist",
    "fire",
    "pydantic",
    "orjson",
    "async-timeout",
    "typing-extensions"
]

[project.optional-dependencies]
# Individual broker dependencies
broker-rabbitmq = [
    "AMQPStorm==2.10.6",
    "rabbitpy==2.0.1"
]
broker-rabbitmq-pika = [
    "pika"
]
broker-redis = [
    "redis>=3.0.0"
]
broker-mongodb = [
    "pymongo>=4.6.3"
]
broker-sqlite = []
broker-nsq = [
    "gnsq==1.0.1"
]
broker-kafka = [
    "kafka-python==2.0.2"
]
broker-kafka-confluent = [
    "confluent_kafka==1.7.0"
]
broker-sqlalchemy = [
    "sqlalchemy==1.4.13",
    "sqlalchemy_utils==0.36.1"
]
broker-peewee = [
    "peewee==3.17.3"
]
broker-rocketmq = [
    "rocketmq"
]
broker-zeromq = [
    "zmq",
    "pyzmq"
]
broker-kombu = [
    "kombu"
]
broker-mqtt = [
    "paho-mqtt"
]
broker-pulsar = [
    "pulsar-client==3.1.0; python_version>='3.7'"
]
broker-nats = [
    "nats-python"
]
broker-http = [
    "aiohttp==3.8.3"
]
broker-celery = [
    "celery",
    "flower"
]
broker-dramatiq = [
    "dramatiq==1.14.2"
]
broker-huey = [
    "huey==2.4.5"
]
broker-rq = [
    "rq==1.15.0"
]
broker-nameko = [
    "nameko==2.14.1"
]

# Feature groups
async = [
    "eventlet==0.33.3",
    "gevent==22.10.2",
    "aiohttp==3.8.3"
]
monitoring = [
    "psutil",
    "elasticsearch"
]
web = [
    "flask",
    "flask_bootstrap",
    "flask_wtf",
    "wtforms",
    "flask_login"
]

# Broker category combinations
rabbitmq-all = [
    "AMQPStorm==2.10.6",
    "rabbitpy==2.0.1",
    "pika"
]
kafka-all = [
    "kafka-python==2.0.2",
    "confluent_kafka==1.7.0"
]
database-all = [
    "sqlalchemy==1.4.13",
    "sqlalchemy_utils==0.36.1",
    "peewee==3.17.3",
    "pymongo>=4.6.3"
]
frameworks-all = [
    "celery",
    "flower",
    "dramatiq==1.14.2",
    "huey==2.4.5",
    "rq==1.15.0",
    "nameko==2.14.1"
]

# All brokers combination
all-brokers = [
    "AMQPStorm==2.10.6",
    "rabbitpy==2.0.1",
    "pika",
    "redis>=3.0.0",
    "pymongo>=4.6.3",
    "gnsq==1.0.1",
    "kafka-python==2.0.2",
    "confluent_kafka==1.7.0",
    "sqlalchemy==1.4.13",
    "sqlalchemy_utils==0.36.1",
    "peewee==3.17.3",
    "rocketmq",
    "zmq",
    "pyzmq",
    "kombu",
    "paho-mqtt",
    "pulsar-client==3.1.0; python_version>='3.7'",
    "nats-python",
    "aiohttp==3.8.3",
    "celery",
    "flower",
    "dramatiq==1.14.2",
    "huey==2.4.5",
    "rq==1.15.0",
    "nameko==2.14.1"
]

# Complete installation - combines all feature groups
all = [
    # All brokers
    "AMQPStorm==2.10.6",
    "rabbitpy==2.0.1", 
    "pika",
    "redis>=3.0.0",
    "pymongo>=4.6.3",
    "gnsq==1.0.1",
    "kafka-python==2.0.2",
    "confluent_kafka==1.7.0",
    "sqlalchemy==1.4.13",
    "sqlalchemy_utils==0.36.1",
    "peewee==3.17.3",
    "rocketmq",
    "zmq",
    "pyzmq",
    "kombu",
    "paho-mqtt",
    "pulsar-client==3.1.0; python_version>='3.7'",
    "nats-python",
    "aiohttp==3.8.3",
    "celery",
    "flower",
    "dramatiq==1.14.2",
    "huey==2.4.5",
    "rq==1.15.0",
    "nameko==2.14.1",
    # Async support
    "eventlet==0.33.3",
    "gevent==22.10.2",
    # Monitoring
    "psutil",
    "elasticsearch",
    # Web UI
    "flask",
    "flask_bootstrap",
    "flask_wtf",
    "wtforms",
    "flask_login"
]

[project.scripts]
funboost = "funboost.__main__:main"
funboost_cli_super = "funboost.__main__:main"

[project.urls]
Homepage = "https://github.com/ydf0509/funboost"
Repository = "https://github.com/ydf0509/funboost"

[tool.setuptools]
include-package-data = true

[tool.setuptools.packages.find]
include = ["funboost*"]

[tool.setuptools.package-data]
"*" = ["*"]

[tool.setuptools.dynamic]
version = {attr = "funboost.__version__"}

[tool.uv]
dev-dependencies = []

danerlt avatar May 28 '25 01:05 danerlt

用户自己安装就好了, 例如kafka,用户不是非得 pip install funboost[kafka] ,用户使用 pip install funboost kafka 分两次安装funboost和kafka不行吗

ydf0509 avatar May 28 '25 07:05 ydf0509