离线环境必须禁用 packagist.org 的 fallback 行为:需全局和项目级彻底移除默认源,设置 composer_disable_network=1,并验证 composer config -g repos 无 packagist 字样;否则 install 阶段仍会尝试访问 repo.packagist.org 导致卡住或失败。

离线环境必须禁用 packagist.org 的 fallback 行为
不运行 composer config --global repo.packagist false,所有后续配置都无效。Composer 在 install 阶段会无条件尝试访问 https://repo.packagist.org/packages.json,哪怕你已配了本地仓库、vendor/ 已存在、composer.lock 也完整——只要全局配置里还留着默认源,它就会卡住或报 Could not fetch packages.json。
验证是否生效:composer config -g repos 输出应只含你加的本地源(如 packages 或 offline),不能出现 packagist 字样。项目级配置也要清空:composer config repo.packagist 应返回空。
- Windows 用户注意:PowerShell 里执行
composer config可能因路径权限失败,改用 CMD 或 Git Bash - 如果之前用过
composer create-project,它的模板常自带"repositories": [{"type":"composer","url":"https://packagist.org"}],必须手动删掉composer.json里的这一段 -
composer install -v可看到真实请求地址;若仍有Downloading https://repo.packagist.org/...,说明某处残留没清理干净
选 artifact 还是 path?看你是部署还是开发
artifact 类型用于生产部署:把所有包预打包成 vendor-name/package-name-version.tar.gz,放在一个扁平目录(如 /opt/artifacts/),再配 composer config repositories.offline '{"type":"artifact","url":"/opt/artifacts/"}'。它完全不发 HTTP 请求,只做文件哈希校验,失败即报错,不 fallback。
path 类型适合本地联调:指向一个含合法 composer.json 的本地目录,但要求包名、版本(或 @dev)与 require 命令严格一致。它不下载,直接链接或复制源码,但每次 composer install 都会检查路径是否存在、是否可读。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
artifact包命名必须精确:比如monolog/monolog-2.13.0.tar.gz,里面composer.json的"name"和"version"也得是"monolog/monolog"和"2.13.0" -
path的url值在 Windows 上要带盘符,如C:/projects/my-pkg;Linux/macOS 用相对路径更安全(如./packages/my-pkg) - 别混用:
path仓库无法替代create-project初始化,它只解决“已有代码怎么当包用”,不解决“新项目怎么拉骨架”
COMPOSER_DISABLE_NETWORK=1 是硬性开关,不是可选项
这个环境变量必须在每次 composer install 前显式设置,否则所有 --no-xxx 参数都失效。它强制 Composer 跳过所有远程元数据请求,包括包存在性校验、版本解析、dist URL 获取等环节。
典型命令组合:COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader。执行完必须立刻补一记 composer dump-autoload -o,否则运行时大概率报 Class not found。
- 如果
composer.lock中有"source"类型条目(如 Git URL 或"dev-master"),COMPOSER_DISABLE_NETWORK=1下会直接失败,因为无法校验 commit hash -
--no-autoloader不是省时间,是绕过 autoload.php 生成过程中可能触发的远程类查找逻辑(某些插件或自定义 autoloader 会干这事) - CI 构建机上建议统一加该变量导出:
export COMPOSER_DISABLE_NETWORK=1,避免漏掉
最稳的离线依赖交付方式:直接复制 vendor 目录
只要源机和目标机的 PHP 版本(含小版本)、关键扩展(mbstring、openssl、zlib)、Composer 版本一致,vendor/ 就是可部署资产,不是中间产物。
打包前务必在源机运行:composer install --no-dev --optimize-autoloader,再用最小代码验证 autoload 是否有效:php -r "require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'OK' : 'FAIL';"。目标机解压后优先执行 composer dump-autoload -o,能修复 symlink 路径污染或权限问题。
- 别用
tar -czf直接打vendor/:检查是否有被.gitignore排除但实际需要的文件(如某些包的dist/目录) - 如果项目用了私有 Git 仓库,且依赖是
"type": "vcs",则不能只拷vendor/,必须提前在源机用path仓库替换掉那些 Git 源,再安装 -
composer.lock必须一并拷贝,否则vendor/中的版本可能与 lock 文件记录不一致,导致运行时行为异常










