如何在composer脚本中获取项目根目录等变量?
发布时间 - 2025-11-23 00:00:00 点击率:次通过Event对象获取Composer实例并利用get('vendor-dir')反推根目录或使用getcwd()是最可靠方式,结合PHP原生函数可灵活定位项目路径。
在 Composer 脚本中获取项目根目录或其他路径变量,可以通过几种方式实现。Composer 提供了部分内置能力,结合 PHP 的函数可以灵活处理。
使用 $composer->getInstallationManager() 或上下文参数
在自定义脚本类或闭包中,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 文件或闭包,可以直接用 PHP 原生方法定位根目录。
常见做法:
- dirname(__DIR__):适用于脚本在 vendor 或子目录中运行时
- getcwd():获取当前工作目录,通常就是项目根目录
- realpath(__DIR__.'/../'):从脚本位置反推根目录
示例:
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.json 中使用变量占位符
Composer 支持在 script 配置中使用一些预定义变量(需插件支持),但原生仅支持简单命令替换。更推荐在 PHP 脚本中处理逻辑。
不过你可以这样传参:
"scripts": {
"post-install-cmd": "php scripts/build.php root=$(pwd)"
}
然后在 build.php 中解析 $argv,但跨平台兼容性较差,不推荐生产环境使用。
基本上就这些。最稳妥的方式是通过 Event 对象拿到 Composer 实例,再用 get('vendor-dir') 反推根目录,或直接用 getcwd() 获取执行路径。不复杂但容易忽略细节。
# composer
# php
# js
# json
# 常量
# Event
# 闭包
# 对象
# 你可以
# 适用于
# 可以通过
# 可以直接
# 或其他
# 几种
# 自定义
# 再用
# 包中
# 最可靠
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在Windows服务器上快速搭建网站?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
jquery插件bootstrapValidator表单验证详解
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何快速查询网址的建站时间与历史轨迹?
教你用AI将一段旋律扩展成一首完整的曲子
如何续费美橙建站之星域名及服务?
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
使用spring连接及操作mongodb3.0实例
Linux网络带宽限制_tc配置实践解析【教程】
如何实现javascript表单验证_正则表达式有哪些实用技巧
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
如何在企业微信快速生成手机电脑官网?
如何在Tomcat中配置并部署网站项目?
高端建站三要素:定制模板、企业官网与响应式设计优化
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何自定义建站之星网站的导航菜单样式?
Laravel如何使用Service Container和依赖注入?(代码示例)
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
java中使用zxing批量生成二维码立牌
如何在IIS中配置站点IP、端口及主机头?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
如何用腾讯建站主机快速创建免费网站?
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
如何在阿里云通过域名搭建网站?
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
微信公众帐号开发教程之图文消息全攻略
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
进行网站优化必须要坚持的四大原则
b2c电商网站制作流程,b2c水平综合的电商平台?
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何快速搭建支持数据库操作的智能建站平台?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
在centOS 7安装mysql 5.7的详细教程
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Linux系统运维自动化项目教程_Ansible批量管理实战
上一篇:一千克拉女王商务圆桌指南
上一篇:一千克拉女王商务圆桌指南


r\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;
}
}