Composer 不能直接安装任意 zip 包,必须满足:zip 根目录含 composer.json、配置 artifact 仓库指向 zip 所在目录、文件名版本与 composer.json 中 version 一致,且需手动放置 zip 文件。

Composer 不能直接从任意 zip 文件安装包——它只认 composer.json 定义的包源,zip 必须是符合 Composer artifact 仓库规范的归档结构,否则会报错 Invalid package information 或 Could not find package。
zip 包必须包含有效的 composer.json 且位于根目录
Composer 解析 zip 时不会递归查找 composer.json,它只检查解压后顶层是否存在该文件。常见错误是把项目整个打包(比如 PHP 框架源码 zip),结果 composer.json 被埋在 src/ 或子目录里。
- ✅ 正确结构:
your-package-v1.0.0.zip解压后直接看到composer.json、src/、tests/ - ❌ 错误结构:
your-package-v1.0.0.zip解压后是myproject-abc123/文件夹,里面才有composer.json - 如果只有带子目录的 zip,需先重打包:用
unzip解压 +zip -r重新归档,确保composer.json在根层
使用 artifact 类型仓库前必须配置 repositories
Composer 默认不扫描本地 zip,必须显式声明一个 artifact 仓库指向 zip 所在目录。这个配置写在项目根目录的 composer.json 里,不是全局设置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"type": "artifact"的仓库值必须是**目录路径**,不是 zip 文件路径;Composer 会自动扫描该目录下所有.zip和.tar.gz文件 - 路径支持相对路径(如
./packages)和绝对路径(如/var/www/my-artifacts),但不能是 HTTP URL - 示例配置片段:
"repositories": [ { "type": "artifact", "url": "./artifacts" } ] - 如果 zip 放在
./artifacts/foo-1.2.0.zip,且其composer.json中定义了"name": "vendor/foo",那么运行composer require vendor/foo:^1.2才能命中
composer install 不会自动下载 artifact zip,要先确保文件已存在
Artifact 仓库是“只读扫描”,不是“按需拉取”。Composer 不会帮你从远程下载 zip 到本地目录,也不会解压或校验完整性——它只检查 zip 文件是否可读、是否含有效 composer.json。
- 执行
composer update或composer require前,必须手动把 zip 文件放进repositories.url指定的目录 - 如果 zip 被改名或内容变更,Composer 不会感知,仍按旧缓存信息解析(可运行
composer clear-cache强制刷新) - 注意权限:PHP 进程需有读取 zip 文件的权限,Linux 下常见问题为
Permission denied,尤其当 zip 由 root 创建而 web 用户运行 composer 时
最易忽略的一点:artifact 仓库里的 zip 包,其 composer.json 中的 version 字段必须与文件名中的版本一致(如 foo-2.1.0.zip 里 version 得是 "2.1.0"),否则 Composer 会跳过该包——它靠文件名做初步匹配,再靠 composer.json 校验,两者对不上就静默忽略。

















