直接复制 vendor 目录是最简方案,但必须满足环境一致性:源机与目标机的 PHP 版本(含小版本)、关键扩展(mbstring、openssl、json、curl)、Composer 版本一致,且项目不含需编译的扩展依赖(如 ext-redis);否则将出现 Class not found、undefined symbol 或 Extension missing 等错误。

直接复制 vendor 目录是最简方案,但必须满足环境一致性
只要源机和目标机的 PHP 版本(含小版本,如 8.2.12)、关键扩展(mbstring、openssl、json、curl)、Composer 版本一致,且项目不含需编译的扩展依赖(如 ext-redis),vendor/ 就是可直接迁移的运行时资产。
常见错误现象:Class not found、undefined symbol、Extension missing——这些不是打包错了,而是环境不匹配。
- 打包前在源机执行:
composer install --no-dev --optimize-autoloader - 验证 autoload 是否可用:
require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'OK' : 'FAIL'; - 解压到目标机后,优先运行:
composer dump-autoload -o,修复 symlink 路径或权限问题 - 别用
tar -czf vendor.tgz vendor/粗暴打包——检查.gitignore是否排除了某些包的实际资源目录(如resources/或构建产物)
用 composer install --no-install 提前下载所有 dist zip 包
composer install --no-install 不解压、不执行脚本,只按 composer.lock 下载所有包的 dist ZIP 到本地缓存,这是生成离线包的关键前置动作。它确保你拿到的是 lock 文件里记录的 exact commit 对应的压缩包,而非最新 tag 或分支。
常见错误现象:Package not found 在离线机报错,往往是因为联网机没下全子依赖(比如中途中断、磁盘满、或用了 --ignore-platform-reqs 跳过平台约束包)。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在联网机执行:
composer install --no-install --prefer-dist --no-scripts - ZIP 包默认存于:
vendor/composer/cache/files/(按vendor/name/hash.zip结构组织) - 必须一并提取:
vendor/composer/cache/repo/https---packagist.org/packages.json,它包含包名→zip路径映射,离线时不可少 - 打包命令示例:
cd vendor/composer/cache/files && find . -name "*.zip" -print0 | tar -cz0f ~/my-project-offline-packages.tgz -T -
离线机用 --repository-url=file:// 指向本地 dist 目录安装
单纯复制 vendor/ 后再跑 composer install 仍可能触发网络请求(如插件初始化、autoload 重建、post-install-cmd)。更可靠的方式是让 Composer 把本地文件夹当「私有仓库」来读取 dist 包,跳过 packagist 回源逻辑。
该方式强制按 composer.lock 中记录的 exact commit 和 dist.shasum 校验完整性,不信任缓存、不走网络、不执行脚本。
- 把联网机上
vendor/composer/cache/files/全部内容拷贝到离线机某路径,例如:/opt/composer-dist/ - 在离线机项目根目录执行:
composer install --no-dev --prefer-dist --repository-url=file:///opt/composer-dist/ - 若提示
Could not resolve packages,优先检查packages.json是否随 ZIP 一起拷贝,以及路径是否拼写正确(Linux 区分大小写,Windows 注意反斜杠) -
--repository-url只影响 dist 包查找,不影响composer.lock解析逻辑——lock 文件仍必须存在且未被修改
想在离线机新增依赖?别碰 composer update,改用 path 仓库
composer update 在离线环境下几乎必然失败,它默认开启 packagist 回源机制,即使你配了 --repository-url,只要某个包的依赖链中出现未声明的远程源,就会卡住或报错。
离线新增包的唯一合规路径是:把代码放在本地目录,通过 path 类型仓库注册,并用 composer require 显式指定版本。
- 在项目
composer.json的repositories字段添加:{"type": "path", "url": "./packages/my-lib"} -
./packages/my-lib/composer.json必须含有效name和version(或使用dev-main等分支名) - 执行:
composer require my-vendor/my-lib:dev-main(版本必须与本地包composer.json中一致) - 注意:path 包默认创建 symlink(Linux/macOS)或复制(Windows),不是静态副本;若需锁定状态,后续应
composer update --lock固化到 lock 文件

















