composer怎么导出为zip包_composer archive命令教程【打包】

2次阅读

composer archive 不是导出当前项目的可靠方式,它专为 packagist 包作者设计,仅打包 composer.json 定义的库,跳过 vendor/、.git/ 等目录,且需严格配置 archive 字段、合法 name/version、已打 git tag;日常项目打包应直接用 zip 或 tar 命令。

composer怎么导出为zip包_composer archive命令教程【打包】

composer archive 不是导出当前项目为 zip 包的可靠方式,它只打包 composer.json 中定义的「包」(package),且默认不包含 vendor/.git/tests/ 等目录——你手动 zip -r 更直接、更可控。

为什么 composer archive 很少被用到

这个命令本质是为 Packagist 上的包作者服务的:把一个可复用的库(比如 monolog/monolog)按规范打包成发行版,供别人 require。它不会理睬你本地项目的结构或部署需求。

  • 默认跳过 vendor/node_modules/.git/.DS_Storephpunit.xml 等——但你可能正需要其中某些
  • 打包路径基于 composer.jsonnameversion,不是当前目录名,容易混淆
  • 不支持自定义压缩格式(只能 zip),也不能指定输出路径,输出固定在 ./dist/
  • 执行前必须先 composer install --no-dev,否则会报错 Could not find package ... in a version matching ...

composer archive 的正确触发条件

只有当你正在维护一个要发布到 Packagist 的独立组件(例如写了个 acme/utils 库),且已配置好 composer.json 中的 archive 字段时,才考虑它。

  • 必须在 composer.json 里显式声明 "archive": {"exclude": [".git", "/tests/"]},否则用的是 Composer 内置黑名单
  • 必须确保 nameversion 字段合法(如 "acme/utils": "1.2.0"),否则打包失败并提示 Invalid package name
  • 运行命令前需确认当前分支已打 tag,因为 archive 会尝试读取 Git tag 推断版本
  • 实际执行:composer archive --format=zip --dir=dist,输出为 dist/acme-utils-1.2.0.zip

真正想打包整个项目?用 shell 命令更稳

99% 的“导出为 zip”场景(比如交付给客户、上传测试环境、备份部署包),应该绕过 composer archive,直接操作文件系统。

  • 排除开发无关内容:zip -r project-v1.0.zip . -x "vendor/*" ".git/*" "node_modules/*" "*.log" "composer.lock"
  • 如果需要干净的生产环境包,先 composer install --no-dev --optimize-autoloader,再 zip
  • 注意路径问题:在项目根目录下执行,避免 zip 包里出现冗余父级目录(如 ../project/src/...
  • windows 用户用 PowerShell:Compress-Archive -Path . -DestinationPath project.zip -Exclude "vendor", ".git", "node_modules"

最常被忽略的一点:zip 包里的文件权限(尤其是 bin/ 下的可执行脚本)在解压后可能丢失,linux/macos 上要用 unzip -X 或改用 tar.gz 保留权限。这不是 Composer 的问题,但打包时没意识到,上线就跑不起来。

text=ZqhQzanResources