composer配国内镜像源对laravel nova无效,因其使用独立私有仓库https://nova.laravel.com,不被镜像代理;必须在composer.json中手动配置nova源、设置http-basic凭证,并确保域名、协议及license key准确无误。

Composer 配国内镜像源对 Laravel Nova 这类商业包**基本无效**——不是配置错了,而是根本绕不过授权校验环节。
为什么 composer install 卡在 Nova 包上,换镜像也没用
现象:命令停在 Downloading https://nova.laravel.com/packages.json 或反复提示 Authentication required;即使全局配了阿里云镜像,composer config -g repo.packagist 显示正常,Nova 依然走不了镜像。
- Laravel Nova 不托管在 Packagist,它使用独立的私有 Composer 仓库
https://nova.laravel.com - 镜像只代理
packagist.org及其镜像源(如https://mirrors.aliyun.com/composer/),不代理nova.laravel.com这类商业源 - Composer 在解析
require时发现laravel/nova不在 packagist 元数据里,会直接回退到repositories中定义的源,跳过全局镜像
正确配置 Nova 下载的三步实操
必须手动在项目 composer.json 中声明 Nova 源,并提供有效凭证,不能依赖全局镜像。
- 在
composer.json的repositories数组开头添加 Nova 源(顺序重要,越靠前优先级越高):
{
"repositories": [
{
"type": "composer",
"url": "https://nova.laravel.com"
},
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
}
],
"packagist.org": false
}
- 执行
composer config http-basic.nova.laravel.com your-email@example.com your-nova-license-key(邮箱和 license key 必须与 Nova 账户一致) - 运行
composer require laravel/nova --with-dependencies;不要加--repository参数,它不识别nova.laravel.com的认证上下文
常见失败点:凭证、域名、协议一个都不能错
错误现象包括 Could not fetch https://nova.laravel.com/packages.json、401 Unauthorized 或 Repository not found。
-
http-basic.nova.laravel.com的键名必须严格匹配域名,写成http-basic.nova.laravel.com.(多点)或http-basic.nova.laravel(少.com)均失效 - License key 必须是 Nova 后台「API Tokens」页生成的 long string,不是购买订单号或订阅 ID
- URL 必须用
https://,且不能带路径(如https://nova.laravel.com/api是错的) - 如果公司网络拦截了
nova.laravel.com的 TLS 握手(常见于企业防火墙),需联系 IT 开放该域名的 443 端口,镜像无法绕过此层拦截
想提速?只能优化本地链路,不是换源
Nova 包体本身不大(通常
- 在
/etc/hosts(Linux/macOS)或C:\Windows\System32\drivers\etc\hosts(Windows)中静态绑定:104.28.23.217 nova.laravel.com(IP 来自dig nova.laravel.com +short,定期更新) - 临时关闭杀毒软件或代理工具,它们常劫持 HTTPS 请求导致
nova.laravel.com认证失败 - 避免在 CI 中重复
composer config http-basic,应把凭证存为 secret 并注入环境变量:COMPOSER_AUTH='{"http-basic":{"nova.laravel.com":{"username":"...","password":"..."}}}'
真正卡 Nova 的从来不是下载速度,而是授权链路上任意一环失败后 Composer 的重试逻辑——它默认重试 3 次,每次间隔 1 秒,失败日志藏在 -vvv 输出末尾,不翻到底根本看不到真实错误。











