Composer require vendor/name 失败是因为默认只查询 Packagist,未配置 repositories 时不会识别本地 ZIP 文件;需显式声明 artifact 或 package 类型仓库,且 artifact 要求 ZIP 命名严格匹配 {vendor}-{name}-{version}.zip 格式。

Composer 默认不认本地 zip 文件,必须显式声明 repositories 为 package 或 artifact 类型,否则 composer require 会直接报 Could not find package。
为什么 composer require vendor/name 会失败?
因为 Composer 默认只查 Packagist,不扫描本地文件系统。即使你把 utils-1.2.0.zip 放在项目根目录,它也不会自动识别——这不是缓存问题,是仓库发现机制缺失。
-
artifact类型:适合已有 ZIP 包(比如 Nexus 导出、内部归档),只按文件名匹配,不校验composer.json内容 -
package类型:需手动写明name、version和dist.url,支持file://协议或相对路径,要求 ZIP 内含有效composer.json - 别用
path类型试图加载 ZIP——它只接受目录,不是压缩包
artifact 配置怎么写才不报错?
把所有 ZIP 放进一个目录(如 ./packages),然后在 composer.json 里声明:
{
"repositories": [
{
"type": "artifact",
"url": "./packages"
}
],
"require": {
"myorg/utils": "1.2.0"
}
}
注意:myorg/utils-1.2.0.zip 必须严格匹配命名格式;ZIP 内部不需要 composer.json;composer install 时若提示 No zip archive found,八成是文件名大小写或版本号多了一个空格。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 文件名必须是
{vendor}-{name}-{version}.zip,不能是utils-v1.2.0.zip或myorg_utils_1.2.0.zip -
url值是目录路径,不是 ZIP 文件路径 - 不支持版本约束语法(如
^1.2),只能写死具体版本号
package 方式更适合哪些场景?
当你能修改目标包的 composer.json,或者需要灵活控制 autoload、分支别名、平台配置时,package 更可靠。
- ZIP 必须包含合法
composer.json(至少有"name"和"version") -
dist.url可用file://./packages/utils-1.2.0.zip或相对路径./packages/utils-1.2.0.zip - 支持
"version": "dev-main as 1.2.0"这类别名写法 - 比
artifact多一层元数据校验,但构建稍慢
离线安装后为什么仍连外网?
常见于 composer update 或未禁用 packagist fallback。即使配了本地仓库,Composer 仍可能对未覆盖的包回源查询。
- 运行
composer config --global repo.packagist false彻底关闭 Packagist - 不要在离线环境执行
composer update——它必须联网解析依赖树 - 验证是否真离线:临时加
127.0.0.1 repo.packagist.org到/etc/hosts,再跑composer install,看到Connection refused才算生效 -
COMPOSER_DISABLE_NETWORK=1是兜底开关,但掩盖了配置缺陷,不建议长期依赖
最易被忽略的一点:ZIP 包里的 composer.json 若含 require 其他包,而这些包没同时放进本地仓库,package 模式会静默失败——它不会报错,但最终 vendor 里缺依赖。

















