根本原因是Composer中packagist.org为特殊键名,必须显式设为false才能禁用fallback,仅改URL无效;正确写法是项目级"packagist.org": false或全局composer config --global repo.packagist false。

为什么直接改packagist.org地址没用
很多人在composer.json里把"repositories"改成内网地址,或加个"packagist.org": "https://intranet-mirror.example.com",结果composer install还是去外网请求packages.json。这不是配置写错了,是根本理解反了:Composer 的 packagist.org 是一个特殊键名,必须显式设为 false 才能关闭 fallback 行为,任何 URL 值都会被当作有效源处理。
真正生效的写法只有两种:
-
"packagist.org": false(项目级,写在composer.json顶层) -
composer config --global repo.packagist false(全局级,影响所有项目)
漏掉任意一层,composer install -v里仍会看到Downloading https://repo.packagist.org/packages.json——那说明某处配置没压住。
artifact仓库必须满足的三个硬性条件
用"type": "artifact"建离线源最稳,但它不是“放几个zip就能用”。包文件名、内部结构、目录组织全有强制规范,错一个就报Could not find package xxx at version yyy。
- 文件名必须是
vendor-name-package-name-version.zip(全小写、中划线、无v前缀),例如monolog-monolog-2.13.0.zip - 压缩包内根目录下必须有
composer.json,且其中"name"和"version"字段要与文件名**完全一致** - 所有 zip 必须平铺放在
url指定目录下,不能嵌套子目录(比如./packages/monolog/是错的,必须是./packages/monolog-monolog-2.13.0.zip)
推荐用composer archive --format=zip --dir=./packages/生成,它自动校验命名和结构;别手动改composer.json再打包——版本以文件名为准,JSON 仅作校验用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
离线机上执行install前必须清空两样东西
composer install在离线环境下极其依赖干净的初始状态。残留的vendor/或旧composer.lock会导致行为不可控,常见现象包括:跳过某些包、报Class not found、甚至静默忽略COMPOSER_DISABLE_NETWORK=1。
- 删掉整个
vendor/目录(别只删部分) - 删掉
composer.lock(如果它来自联网机,可能含远程 dist URL,必须重生成)
然后执行:COMPOSER_DISABLE_NETWORK=1 composer install --no-cache --no-plugins --no-scripts。注意--no-cache很关键——它绕过本地缓存查找逻辑,强制走你配的 artifact 源。
path仓库适合调试,不适合部署
"type": "path"看着简单,但只适用于开发联调场景。它要求目标目录存在、可读、含有效composer.json,且每次composer install都会实时检查该路径。一旦离线机上路径不存在、权限不对、或软链接失效(Windows 下尤其常见),就会直接失败。
更麻烦的是:它不生成静态副本,vendor/下是符号链接或复制体,无法打包迁移。所以生产部署必须用artifact;path只建议用于本地复现 bug 或临时替换某个依赖。
另外,require时必须带版本约束,如composer require my-vendor/my-pkg:dev-main@dev,光写my-vendor/my-pkg会被忽略——Composer 不会自动扫描所有注册的 path 源。

















