离线迁移 composer 依赖最稳方案是直接复制 vendor 目录,前提是源机与目标机 php 版本(含小版本)、关键扩展及 composer 版本一致,并在源机执行 composer install --no-dev --optimize-autoloader 后验证 autoload;若用缓存需打包完整 ~/.composer/cache/files 并配置目标机缓存路径;新增包应使用 path 仓库而非 update;artifact 仓库仅支持顶层包,不解决子依赖;composer.lock 文件必须保留且不可手动修改。

离线迁移 Composer 依赖,核心就一条:别指望在断网时让 composer install “现场下载”,它必须有现成的、可验证的“货”——要么是完整的 vendor/ 目录,要么是匹配 composer.lock 的缓存包 + 正确配置。
直接复制 vendor 目录是最稳的方案
只要源机和目标机环境一致,vendor/ 就不是中间产物,而是可部署资产。它跳过所有解析、校验、下载环节,composer install 在离线时根本不会触发网络请求。
- 环境一致性要求严格:PHP 版本(包括小版本,如
8.2.12)、关键扩展(mbstring、openssl、json、curl)、Composer 版本建议对齐 - 打包前务必在源机执行:
composer install --no-dev --optimize-autoloader,再用最小代码验证:require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'OK' : 'FAIL'; - 目标机解压后,优先运行:
composer dump-autoload -o,能修复 symlink 路径污染或 autoload.php 权限问题 - 如果不确定
vendor/是否干净,可用:composer install --no-plugins --no-scripts --no-autoloader --dry-run(Composer 2.5+)预览校验行为
用 composer.lock + 全局缓存迁移也行,但容易漏子依赖
composer.lock 本身不包含代码,它只记录每个包的 dist.url 和 dist.shasum。离线时 Composer 会去 ~/.composer/cache/files/ 找对应 ZIP 包,靠哈希校验匹配——但前提是这些包真被下全了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在线机必须执行完整安装:
composer install --no-dev --prefer-dist,不能只composer update或require主包;否则子依赖(transitive dependencies)不会进缓存 - 必须打包整个
~/.composer/cache/files/目录,不能只拷部分 ZIP;Windows 路径通常是C:\Users\用户名\AppData\Roaming\Composer\Cache\files - 离线机需显式配置缓存路径:
composer config --global cache-files-dir /your/local/cache/path,否则 Composer 默认仍查原路径(可能为空) - 常见失败现象:
Package not found—— 不是主包缺失,而是某个子依赖(比如psr/log)没被提前拉下来
想在离线机上新增包?别碰 composer update,改用 path 仓库
composer update 在离线环境下基本不可行,它必须联网重新解析整棵树。但你可以用 path 类型仓库把本地代码当“包”来装,完全绕过远程元数据。
- 把目标包(含完整
composer.json)放到项目内,例如:./packages/my-utils - 在项目根目录
composer.json中添加:{ "repositories": [{ "type": "path", "url": "./packages/my-utils" }] } - 运行:
composer require vendor/my-utils:@dev(注意必须带@dev,path仓库不识别*或语义化版本约束) - 坑点:URL 必须是相对路径;包名必须和其
composer.json中的"name"完全一致;装完要手动composer dump-autoload,否则自动加载器不会更新
artifact 仓库适合分发已打包的 ZIP,但不解决递归依赖
如果你有一堆预编译好的 ZIP 包(比如从 CI 构建产物里拿的),可以用 artifact 类型仓库让 Composer 从本地目录查包,但它只处理顶层声明的包,不递归解析子依赖。
- 把所有 ZIP 放进一个目录,例如:
./packages/archives,文件名格式应为vendor-name-package-name-version.zip - 配置:
{ "repositories": [{ "type": "artifact", "url": "./packages/archives" }] } - 然后
composer require vendor/package:1.0.0—— 注意版本号必须和 ZIP 文件名里的完全一致 - 致命限制:如果
vendor/package依赖psr/container,而你没把psr/container的 ZIP 也放进archives目录,安装仍会失败并报Could not find package
最常被忽略的一点:无论用哪种方式,composer.lock 文件都不能丢,也不能手改。它像一张精确到 commit hash 的货运清单,少一行或多一个空格,composer install 都可能放弃本地路径,转头去连网络查元数据。










