必须显式禁用网络:设composer_disable_network=1,全局及项目级禁用packagist.org,并用--no-plugins--no-scripts--no-autoloader执行install;path仓库需本地composer.json字段匹配且加dev分支标识;cache-files-dir专存zip供--prefer-dist离线复用。

怎么让 composer install 完全不发 HTTP 请求
离线环境下,composer install 默认仍会尝试访问 repo.packagist.org 校验包元数据——哪怕 vendor/ 和 composer.lock 都完整。必须显式切断所有网络通路,否则必报 Could not fetch https://repo.packagist.org/packages.json。
关键操作有三步,缺一不可:
-
composer config --global repo.packagist false(全局禁用 Packagist) - 检查项目级配置:
composer config repo.packagist输出应为空;若非空,删掉composer.json中repositories里任何指向https://packagist.org的条目 - 执行时加环境变量:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader
注意:--no-plugins 不是可选优化,它能防止 phpstan/extension-installer 等插件偷偷联网;--no-autoloader 是为了跳过 autoload 重建阶段的远程类探测(某些自定义 autoloader 会触发)。
repositories 里写 path 类型要注意什么
想让 Composer 从本地目录加载包,不能只放代码,必须靠 path 类型仓库声明。常见失败不是因为路径错,而是 composer.json 缺失或字段不匹配。
本地包根目录下必须有合法 composer.json,且满足:
-
name字段必须和你在项目中require时写的完全一致(包括大小写、vendor 名),例如"acme/utils" -
version可省略,但 require 时必须用dev-main或dev-develop这类分支名(不是1.0.0) - 目录需已运行
git init并至少有一个 commit,否则 Composer 拒绝识别
项目根目录 composer.json 中添加:
"repositories": [
{
"type": "path",
"url": "./packages/my-utils"
}
]
然后运行:composer require acme/utils:dev-main。Windows 下 url 必须带盘符,如 C:/projects/my-utils;Linux/macOS 用相对路径即可。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
cache-files-dir 是离线打包唯一该配的路径
别再折腾 cache-dir。它混着 repo/(元数据)、archived/(解压副本)、files/(原始 ZIP),而只有 files/ 下的 ZIP 包能在断网时被 --prefer-dist 直接复用。
正确做法是单独配置 cache-files-dir,专用于离线场景:
- 先清旧配置:
composer config --global --unset cache-dir(避免冲突) - 设新路径:
composer config --global cache-files-dir /opt/composer-offline-cache(必须是绝对路径) - 在联网机上执行:
composer install --prefer-dist --no-scripts --no-plugins,所有 ZIP 就会落进该路径 - 验证:
ls /opt/composer-offline-cache/acme/utils/1.0.0/acme-utils-abc123.zip应存在
离线机上只需把整个 /opt/composer-offline-cache 复制过去,并确保 cache-files-dir 指向它。其他子目录(如 repo/)断网即失效,不用管。
为什么 vendor/ 里没看到包文件,只看到符号链接
这是 path 类型仓库的默认行为,不是错误。Composer 为支持热更新,会在 vendor/ 下创建符号链接(Linux/macOS)或复制(Windows),而非拷贝静态副本。
检查方式很简单:
- Linux/macOS:
ls -l vendor/acme/utils,如果输出含->指向你本地./packages/my-utils,说明成功 - Windows:目录属性里看“目标”是否指向本地路径;若只是普通文件夹,大概率是
url路径写错或权限不足 - 软链接失效常见于 Docker 挂载路径变化,或 IDE 重命名了父目录——此时链接仍指旧路径,
composer update不会自动修复
如果你需要静态副本(比如部署到无符号链接支持的环境),在 repositories 中加 "options": {"symlink": false},但注意这会让修改本地包后必须手动 composer update 才生效。










