composer中如何通过archive命令导出项目源码包_composer打包技巧【详解】

9次阅读

composer archive 不可靠,真正可用的是 composer install –no-dev –prefer-dist 配合手动归档;它不处理 autoload、忽略排除规则、不打包 vendor 外依赖,且 2.x 已移除。

composer中如何通过archive命令导出项目源码包_composer打包技巧【详解】

直接说结论:用 composer archive 导出源码包基本不可靠,它不处理 autoload、忽略 .gitignore 外的排除规则、不打包 vendor 以外的依赖源码——真正能用的其实是 composer install --no-dev --prefer-dist 配合手动归档。

为什么 composer archive 基本没人用

这个命令在 Composer 1.x 中存在,但官方文档几乎没提,2.x 已彻底移除。它本质只是把当前目录(含 vendor)简单 zip,不执行依赖解析,也不尊重 composer.json 中的 archive 配置字段(该字段仅用于 Packagist 包发布时的自动归档)。

  • 运行 composer archive --format=zip myapp.zip 会报错或静默失败,尤其在有 symlink 或未提交 Git 文件时
  • 不会过滤 dev-dependenciestests/docs/ 全被打包进去
  • 不处理 autoload.files 引用的全局 php 文件路径是否有效

真正可用的导出方案:先装再打

标准做法是模拟生产环境安装,再用系统工具压缩。关键是让 vendor 里全是 dist 包(即 zip/tar.gz 源码),而非 git clone 出来的源码目录。

  • 确保 composer.json 中没有 "minimum-stability": "dev""prefer-stable": false,否则可能拉到 dev 分支
  • 执行:
    composer install --no-dev --prefer-dist --optimize-autoloader --no-scripts
  • 此时 vendor/ 下每个包都是解压后的纯源码(无 .git、无 tests/),且 vendor/autoload.php 已优化
  • 再用 zip -r myapp-release.zip . -x "node_modules/*" -x ".git/*" -x "tests/*" 排除无关项

如果必须包含某些 dev-only 资源(如构建脚本)

不能依赖 --no-dev,得改用 scripts + 自定义排除逻辑:

  • composer.jsonscripts 里加一个 archive 命令:
    "scripts": {   "archive": [     "@install",     "rm -rf vendor/*/{.git,.github,tests,Tests,phpunit.xml*,README.md}",     "zip -r release.zip ./ --exclude="*/node_modules/*" --exclude="*/.git/*""   ] }
  • 然后运行 composer run archive
  • 注意:linux/macos 可用 zip --excludewindows 用户得换 7z 或用 PowerShell 做路径过滤

最易被忽略的一点:Composer 不负责“打包”,它只管依赖安装;所谓“源码包”是否可直接运行,取决于 autoload 是否完整、vendor/bin 工具是否保留、以及你的启动入口是否硬编码了开发专用路径——这些都得在归档前验证,而不是依赖某个命令自动搞定。

text=ZqhQzanResources