Composer脚本需手动加载.env:use Dotenv\Dotenv; $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->safeLoad(); 读取用getenv()而非$_ENV,因variables_order默认不含E;传参用APP_ENV=prod composer run build,脚本内兜底$env = getenv('APP_ENV') ?: 'dev'。

Composer脚本里读不到.env文件?别直接$_ENV硬取
Composer脚本运行在独立的PHP进程里,$_ENV默认为空,getenv()也拿不到.env内容——因为vlucas/phpdotenv不会自动加载,除非你显式触发。常见现象是脚本里getenv('APP_ENV')返回false或空字符串,但php -d variables_order=EGPCS artisan config:clear却能用,这是环境加载时机差异导致的。
正确做法是在脚本入口手动加载.env:
use Dotenv\Dotenv; $dotenv = Dotenv::createImmutable(__DIR__); $dotenv->safeLoad(); // 不抛异常,跳过缺失文件
注意:safeLoad()比load()更稳妥,避免CI环境没.env时脚本中断;路径用__DIR__而非getcwd(),防止从子目录调用时路径错位。
composer.json里的scripts如何传参并解析环境变量?
Composer不支持脚本中直接插值${APP_ENV},也不能在scripts字段里写php build.php --env=${APP_ENV}——这些会被当字面量处理,不是shell展开。
可行方案分两层:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 终端调用时通过
APP_ENV=prod composer run build注入(Linux/macOS)或set APP_ENV=prod && composer run build(Windows) - 脚本内部用
getenv('APP_ENV') ?: $_SERVER['APP_ENV'] ?: 'dev'兜底,优先取环境变量,再 fallback 到默认值 - 若需多级配置(如
DB_HOST随APP_ENV切换),建议在脚本里用match或switch做映射,而不是依赖外部.env嵌套逻辑
为什么phpdotenv加载后$_SERVER有值但$_ENV没有?
这是PHP配置variables_order导致的:默认值通常是GPCS(不含E),所以putenv()设置的变量只进$_SERVER,不进$_ENV。而Dotenv底层用putenv(),因此必须统一用getenv()或$_SERVER读取,不能混用$_ENV。
验证方法:php -i | grep variables_order,若输出不含E,就别碰$_ENV。脚本里统一写成:
$env = getenv('APP_ENV') ?: 'dev';
// 而不是
$env = $_ENV['APP_ENV'] ?? 'dev'; // 可能报未定义索引
构建脚本中动态改config/*.php文件?小心缓存和权限
直接file_put_contents()写配置文件看似快,但容易踩三个坑:
- Laravel/Yii等框架会把配置编译进
bootstrap/cache/config.php,改源文件不生效,得补php artisan config:clear - CI环境常以非root用户运行,
config/目录可能不可写,应提前is_writable()检查并给出明确错误提示 - 用
str_replace()硬替换'debug' => true风险高,推荐用include原配置数组 +array_merge_recursive()覆盖,再var_export()回写,保格式、防注入
真正复杂的构建参数(如CDN域名、API密钥白名单),建议抽成独立build-config.php,由主脚本require,不污染框架配置目录。

















