打包优化
项目包管理通过uv或者poetry工具来管理,推荐使用uv来管理。现在通过setup.py,安装的时候会安装很多不需要的依赖,比如我只需要redis的broker,使用 uv add funboost[broker-redis]这样就可以了,不需要安装所有中间件的依赖。
现在的 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管理页面所需的三方包
redis 是必选安装,不能让用户选择是否安装redis。因为有很多功能需要用到它,不光是作为redis队列。 例如funboost web manager的很多功能,都是依赖redis数据库的数据和通信的。 包括任务过滤 分布式控频,都是要redis
例如这个界面就是高度依赖redis的,你用rabbitmq kafka,也要安装redis
现在安装broker的时候所有的中间件会全部都安装,我不希望将所有的broker都安装上,只安装我用的的broker所依赖的库。
高度依赖redis的话,那可以在安装funboost的时候就将redis安装上。就是对下面这个依赖做一下分组,根据选择的broker只安装对应broker的依赖。
这个是我用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 = []
用户自己安装就好了, 例如kafka,用户不是非得 pip install funboost[kafka] ,用户使用 pip install funboost kafka 分两次安装funboost和kafka不行吗