最稳方案是直接复制vendor目录,前提是源与目标机php版本(含小版本)、扩展、架构完全一致,并在源机执行composer install --no-dev --optimize-autoloader验证后打包;或使用artifact仓库+composer_disable_network=1强制读取本地zip包,文件名须为vendor-name-package-name-version.zip且版本号严格匹配。

离线安装 Composer 包,最稳的不是“怎么装”,而是“不让它想联网”。只要 composer.lock 完整、PHP 环境一致、包源可触达,composer install 本身就能纯离线跑通——关键在提前切断它对外网的依赖路径。
用 artifact 仓库直接读本地 ZIP 包
这是原生支持、零额外服务、不碰 Git 或缓存的离线方案。Composer 会按文件名匹配版本,找到就解压进 vendor/,全程不发任何 HTTP 请求。
-
ZIP文件必须放在指定目录(如./packages/archives),不能嵌套子目录 - 文件名格式严格为
vendor-name-package-name-version.zip(短横线分隔,不是斜杠或下划线) -
composer.json中require的版本号必须和 ZIP 名字里的version完全一致,比如写"1.2.0"就不能写"^1.2" - 在项目根目录
composer.json顶部加:{"repositories": [{"type":"artifact","url":"./packages/archives"}]} - 执行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts(加环境变量是防插件偷偷联网)
直接复制 vendor 目录是最简方案,但有硬约束
这不是“偷懒”,而是生产环境最常被验证有效的做法——前提是源与目标机器的运行时环境完全对齐。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PHP 版本号需精确到小版本(如
8.2.12),不同编译选项或 opcache 行为可能导致undefined symbol - 必须已安装所有扩展依赖:比如
ext-redis、ext-zip、ext-mbstring,缺一个,autoload 或运行时就崩 - 打包前在源机运行:
composer install --no-dev --optimize-autoloader,再用最小代码验证:require 'vendor/autoload.php'; echo class_exists('Monolog\Logger') ? 'OK' : 'FAIL'; - 目标机解压后,先运行:
composer dump-autoload -o,刷新自动加载器,绕过 symlink 路径污染或缓存残留 - 别让
composer install自作主张——加--no-plugins --no-scripts --no-autoloader,只校验vendor/是否和composer.lock完全吻合
用 path 仓库引用本地源码目录(适合调试或私有组件)
当你手头是未打包的完整源码(含 src/、tests/、composer.json),且需要实时修改时,path 是唯一合理选择。
-
url值支持相对路径(如../my-internal-lib)或绝对路径(Windows 注意双反斜杠) - 本地目录下必须有合法
composer.json,其中name和version(或分支名如dev-main)要和require行完全匹配 - 执行:
composer require my-vendor/my-lib:dev-main(注意带@dev后缀,如果"minimum-stability": "dev") - Linux/macOS 下默认创建软链接,Windows 则复制;若部署时不允许软链,改用
"symlink": false配置项(需 Composer 2.2+) - 别在
path包里放post-install-cmd脚本——离线机没 npm 或 git,一跑就挂
真正容易被忽略的点是:离线不是“关掉网络”就完事,而是确保 composer.lock 里每个包的 dist.url 字段要么是 file:// 协议,要么能被 artifact/path 机制覆盖;一旦它仍指向 https://repo.packagist.org,哪怕加了 COMPOSER_DISABLE_NETWORK=1,也会在校验阶段报错退出。










