通过Event对象获取Composer实例并利用get('vendor-dir')反推根目录或使用getcwd()是最可靠方式,结合PHP原生函数可灵活定位项目路径。

在 Composer 脚本中获取项目根目录或其他路径变量,可以通过几种方式实现。Composer 提供了部分内置能力,结合 PHP 的函数可以灵活处理。
在自定义脚本类或闭包中,Composer 会传递一个 Composer\Script\Event 对象。你可以从中获取 IO 和 Composer 实例,进而访问配置信息和路径。
示例如下:
use Composer\Script\Event;
use Composer\Util\Filesystem;
class BuildScript
{
public static function postInstall(Event $event)
{
$composer = $event->getComposer();
// 获取项目根目录(即 composer.json 所在目录)
$rootDir = $composer->getConfig()->get('vendor-dir') . '/..';
$rootDir = realpath($rootDir);
echo "项目根目录: " . $rootDir . PHP_EOL;
// 其他常用路径
$vendorDir = $composer->getConfig()->get('vendor-dir'); // vendor 目录
$binDir = $composer->getConfig()->get('bin-dir'); // bin 目录
echo "Vendor 目录: " . $vendorDir . PHP_EOL;
echo "Bin 目录: " . $binDir . PHP_EOL;
}
}
如果你的脚本是简单的 PHP 文件或闭包,可以直接用 PHP 原生方法定位根目录。
常见做法:
示例:
public static function myScript(Event $event)
{
// 方法1:推荐,可靠
$root = getcwd();
echo "根目录(getcwd): " . $root . PHP_EOL;
// 方法2:通过 vendor 推算
$vendorDir = $event->getComposer()->getConfig()->get('vendor-dir');
$root = realpath($vendorDir . '/..');
echo "根目录(vendor 推算): " . $root . PHP_EOL;
}
Composer 支持在 script 配置中使用一些预定义变量(需插件支持),但原生仅支持简单命令替换。更推荐在 PHP 脚本中处理逻辑。
不过你可以这样传参:
"scripts": {
"post-install-cmd": "php scripts/build.php root=$(pwd)"
}
然后在 build.php 中解析 $argv,但跨平台兼容性较差,不推荐生产环境使用。
基本上就这些。最稳妥的方式是通过 Event 对象拿到 Composer 实例,再用 get('vendor-dir') 反推根目录,或直接用 getcwd() 获取执行路径。不复杂但容易忽略细节。
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号