要让 composer install 不连 packagist.org,需在 composer.json 中配置 artifact 仓库并显式禁用 packagist.org:设置 "repositories": [{"type": "artifact", "url": "./packages/"}] 和 "packagist.org": false;包文件名必须为 vendor-name-package-name-version.zip(全小写、中划线、无 v 前缀),且压缩包内 composer.json 的 name 和 version 必须与文件名严格一致;运行 composer config --list 确认配置生效,删除 vendor/ 和 composer.lock 后执行 composer install --no-cache。

怎么让 composer install 不连 packagist.org?
靠改 composer.json 的 repositories 配置,把默认源换成你自己的 artifact 仓库地址。不能只加一个新源,必须显式禁用 packagist.org,否则它仍会 fallback 查询——这是离线失败最常见的原因。
- 在
composer.json顶层加:"repositories": [{"type": "artifact", "url": "./packages/"}] - 紧接着加:
"packagist.org": false(注意:是键名packagist.org,不是packagist或布尔值写错位置) -
url必须是本地绝对路径或相对路径,且目录下要有.zip或.tar包,每个包一个压缩文件,文件名需含版本号,如monolog-monolog-2.9.1.zip - 如果用 HTTP artifact 源(比如 Nginx 目录索引),
url填完整 URL,但要确保所有包能被直接GET下载,不跳登录页、不返回 HTML
artifact 包怎么生成才被 composer install 识别?
不是随便 zip 一下就行。Composer 对 artifact 包的结构和命名有硬性要求,错一个字符就报 Could not find package xxx at version yyy。
- 包文件名格式必须为:
vendor-name-package-name-version.zip(全部小写,中划线分隔,版本号不含v前缀) - 压缩包内必须包含完整项目结构,即解压后根目录下要有
composer.json,且其中"name"和"version"字段必须与文件名一致 - 推荐用
composer archive命令生成:composer archive --format=zip --dir=./packages/,它自动处理命名和结构 - 别手动改
composer.json里的version后再打包——版本号以文件名为准,JSON 里只是校验用
为什么 composer install 还是去外网?
大概率是配置没生效,或者缓存干扰。Composer 会读全局配置、项目配置、环境变量三层,优先级容易搞混。
- 运行
composer config --list查看实际生效的repositories和packagist.org状态,确认是否真被设为false - 删掉
vendor/和composer.lock,再跑composer install --no-cache,避免旧 lock 文件残留远程包引用 - 检查有没有
COMPOSER_REPO_PACKAGIST环境变量,它会覆盖composer.json配置 - 如果用了
composer create-project,它默认会强制启用 packagist,得加--repository-url参数指定 artifact 地址
内网部署时 autoload 和 scripts 会失效吗?
不会自动失效,但依赖的执行环境可能缺失。artifact 只管下载代码,不解决运行时依赖。
-
autoload是 PHP 层机制,只要文件结构对、composer.json里定义正确,就能正常加载 -
scripts里的命令(如phpunit、php-cs-fixer)需要提前在目标机器装好对应二进制,artifact 不传这些工具 - 如果
scripts调用了未声明为require-dev的包,而该包又不在 artifact 目录里,就会报Class not found—— 因为 dev 包默认不打进 artifact,得单独导出 - 建议用
composer install --no-dev上线,但打包 artifact 时用--with-all-dependencies确保 dev 包也进库(如果测试也要离线跑)
artifact 模式最脆弱的地方不在配置,而在包的一致性:文件名、内部 composer.json、lock 文件三者必须严格对齐。一次手动生成失误,排查起来比网络问题还费时间。










