Composer 通过 path 仓库类型让本地 PHP 包被识别和加载,需在 composer.json 的 repositories 中配置绝对或相对路径,本地包须有合法 name 和 version,执行 composer require 安装;require 字段不支持直接写路径,必须配 repositories;options 可控 symlink 行为;Windows 启用软链需管理员权限或开发者模式;本地包 autoload 配置必须正确。

Composer 安装本地扩展包,本质是让 composer.json 能识别并加载你本地磁盘上的 PHP 包(比如还没发布到 Packagist 的私有组件、正在开发的 SDK、或需调试的第三方 fork)。关键不在“安装”,而在“怎么告诉 Composer:这个包就在这儿,别去远程拉”。
用 path 仓库类型指向本地目录
这是最常用也最稳妥的方式。Composer 不会复制文件,而是软链接(ln -s)或硬拷贝(取决于 install 时选项),保证你改本地代码,项目里立刻生效。
- 在项目的
composer.json中添加repositories配置,类型设为path -
url值必须是绝对路径或相对于composer.json的相对路径(推荐用相对路径,避免换机器失效) - 本地包自身的
composer.json必须有合法的name(如"myorg/utils")和version(可写"dev-main"或"1.0.x-dev") - 执行
composer require myorg/utils即可安装——Composer 会自动匹配到你配的path仓库
{
"repositories": [
{
"type": "path",
"url": "./packages/my-utils"
}
],
"require": {
"myorg/utils": "*"
}
}
path 仓库的 options 控制链接行为
默认 Composer 对 path 包使用符号链接(Linux/macOS)或复制(Windows),但你可以显式控制:
-
"options": {"symlink": false}→ 强制复制,适合 Windows 开发或 CI 环境 -
"options": {"symlink": true}→ 显式启用软链(Linux/macOS 下默认就是 true) - 加
"options": {"versions": {"myorg/utils": "dev-feature-x"}}可临时覆盖本地包composer.json中的 version,方便测试分支
别直接用 require 指向本地路径(常见错误)
有人尝试这样写:"myorg/utils": "./packages/my-utils" —— 这是错的。Composer 的 require 字段只接受 vendor/name:version 格式,不支持路径值。这么写会导致:
-
composer install报错:Could not find a matching version of package myorg/utils - 即使本地有同名目录,Composer 也完全无视,仍去 Packagist 查找
- 唯一例外是
composer require vendor/name:dev-master --repository-url=file:///path/to/local/repo,但太绕,不如配repositories
Windows 下软链接需要管理员权限或开发者模式
如果你在 Windows 上启用了 "symlink": true 却看到 Failed to create symbolic link,不是 Composer 问题,是系统限制:
- 命令行需以“管理员身份运行”,或
- 开启 Windows 开发者模式(设置 → 更新与安全 → 针对开发人员 → 开发者模式)
- 若不想折腾,直接设
"symlink": false,Composer 会复制整个目录到vendor/,只是改代码后要手动composer update myorg/utils
真正容易被忽略的是:本地包的 autoload 配置是否正确。哪怕路径配对了,如果它的 composer.json 里没写 "psr-4": {"MyOrg\\": "src/"},或者命名空间和实际目录结构不一致,require 后依然会 Class not found。先跑通 composer dump-autoload -o 再测试。










