Satis不适用于OA系统快速分发,因其静态构建特性无法自动同步dev-main等非语义化版本,必须手动维护require配置;OA场景应选用packagist-mirror实现混合源实时同步与自动更新。

直接说结论:OA系统里的定制化PHP包(比如 oa-core、hr-workflow)要快速分发,不能靠手动拷贝或改 composer.json 逐个项目维护——得用自托管 Composer 镜像,但必须选对类型:Satis 适合「少量私有包 + 静态发布」,packagist-mirror 才适合「全量同步 + 混合源(公开+私有)」。
为什么 Satis 在 OA 场景下容易翻车?
Satis 本质是静态构建器,不是服务。OA 系统迭代快、包多、常打 dev-main 或带 commit hash 的版本,而 Satis 默认跳过所有 dev- 分支,除非你显式配置 "skip-dev": false;更关键的是,它不自动感知 Git 仓库新 tag —— 你得手动改 satis.json 加 "require": {"oa/hr-workflow": "dev-main"},否则 build 完根本不会收录。
- OA 包若没打语义化 tag(如
v2.1.0),只推了main分支,Satis 就当它不存在 -
repositories写在satis.json里只是声明数据源,不等于“自动拉取”,必须配合require或require-all: true - build 输出的
packages.json若没被 Web 服务器正确托管(路径 404 / MIME 类型错为text/plain),客户端就会卡在Loading composer repositories
packagist-mirror 才是 OA 团队的真实选择
如果你的 OA 系统依赖大量公开包(symfony/*、laravel/framework)+ 几个内部包(company/oa-auth),packagist-mirror 支持混合源同步:它从官方 Packagist 拉元数据,再按需从内部 GitLab 拉私有包 ZIP,并统一生成 v2 协议兼容的目录结构。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 私有包接入只需在
mirror.yml里加一段:private_repos: ["https://gitlab.internal/company/oa-auth.git"] - 支持 GitHub/GitLab Webhook 实时触发同步,OA 开发者 push tag 后 5 分钟内就能被其他项目
composer require - 生成的
packages.json和provider-company.json直接适配 Composer 2.x,不用改客户端任何配置 - 磁盘占用可控:用
--lock-file composer.lock参数只同步 OA 项目实际用到的包,首同步从 40GB 降到 2–3GB
客户端怎么配才不漏包、不超时?
OA 项目根目录的 composer.json 必须同时满足三件事:禁用默认源、置顶内部镜像、显式声明私有包来源。漏掉任意一条,composer install 就可能 fallback 到公网或报 could not find package。
- 确保
"packagist.org": false和内部镜像同级写在repositories数组里,顺序无关,但必须存在 - type 必须是
"composer",写成"vcs"或"package"会导致无法解析语义化版本 - 私有包若未在镜像中同步成功,Composer 不会报错,只会静默跳过——运行
composer install -v看最后几行是否出现Skipped package company/oa-auth - CI 流水线里别用
composer config -g,改项目级composer.json更可靠,避免不同环境行为不一致
最易被忽略的点:OA 系统上线前,必须验证 vendor/autoload.php 能加载私有包类。镜像只管下载,autoload 是另一层事——私有包自己的 composer.json 里 autoload 块写错,或者没跑 composer dump-autoload,照样 Class not found。

















