nystudio107/dotenvy

通过将.env文件替换为Apache、Nginx和shell等效的关键字/值变量对来加速您的生产站点。

资助包维护!
khalwat

1.1.0 2019-08-14 20:02 UTC

This package is auto-updated.

Last update: 2024-09-15 07:05:39 UTC


README

Scrutinizer Code Quality Code Coverage Build Status Code Intelligence Status

Dotenvy

通过将.env文件替换为Apache、Nginx和shell等效的关键字/值变量对来加速您的生产站点

要求

PHP 7.0或更高版本,以及使用Composer的项目

安装

要安装此包,请按照以下说明操作。

  1. 打开您的终端并进入您的项目

     cd /path/to/project
    
  2. 然后告诉Composer需要该包

     composer require nystudio107/dotenvy
    

CraftQuest.io视频:使用Dotenvy注入环境变量

CraftQuest.io video: Injecting Environment Variables with Dotenvy

Dotenvy概述

Dotenvy是一个小型工具,它将您的.env文件内容转换为可以直接粘贴到Apache服务器配置、Nginx服务器配置、shell CLI .bashrc或Docker Dockerfile的格式。

为什么?因为根据phpdotenv文档

phpdotenv是为开发环境制作的,通常不应在生产环境中使用。在生产中,实际的环境变量应该被设置,这样在每次请求时就不需要加载.env文件的开销。这可以通过使用Vagrant、chef或Puppet等工具的自动化部署过程来实现,也可以通过Pagodabox和Heroku等云主机手动设置。

.env文件旨在方便在本地开发环境中更改事物。

phpdotenv包所做的是解析您的.env文件,然后调用putenv()来设置每个环境变量。这设置了$_ENV超级全局变量,您的应用程序可以稍后通过getenv()读取。

使用这里描述的技术,相同的$_ENV超级全局变量使用环境变量设置,并通过相同的getenv()函数提供。不同之处在于您的web服务器或CLI直接设置变量,而不需要解析.env文件。

毫无疑问,这是一个微优化...并且可能不会产生重大的性能差异。但为什么要无端增加开销呢?

这是我一直希望Craft CMS核心以某种形式实现的特性的部分实现:[https://github.com/craftcms/cms/issues/1607](https://github.com/craftcms/cms/issues/1607)添加craft config/cache作为控制台命令

使用Dotenvy

从包含.env和/vendor目录的项目根目录开始,执行以下操作

vendor/bin/dotenvy

如果您使用的是Windows,则执行以下操作

vendor/bin/dotenvy.bat

如果您的.env文件位于其他位置,您可以通过传递目录到.env文件来执行此操作

vendor/bin/dotenvy /path/to/some/dir/

然后**不要**在您的生产环境中创建.env文件,而是通过部署系统粘贴或插入Dotenvy为您生成的结果文件。

这样,Apache服务器、Nginx服务器或CLI将自动注入适当的.env变量。

这意味着不再需要在每次请求上解析.env文件。

更新.gitignore

请确保您在根项目的.gitignore文件中使用如下行来忽略所有.env*文件

.env*

...为确保在生成的 .env* 文件中没有任何秘密被提交到git中。请注意末尾的 *

示例 .env 文件

给定一个看起来是这样的 .env 文件

# The environment Craft is currently running in ('dev', 'staging', 'production', etc.)
ENVIRONMENT="local"

# The secure key Craft will use for hashing and encrypting data
SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"

# The database driver that will be used ('mysql' or 'pgsql')
DB_DRIVER="mysql"

# The database server name or IP address (usually this is 'localhost' or '127.0.0.1')
DB_SERVER="localhost"

# The database username to connect with
DB_USER="homestead"

# The database password to connect with
DB_PASSWORD="secret"

# The name of the database to select
DB_DATABASE="craft3"

# The database schema that will be used (PostgreSQL only)
DB_SCHEMA="public"

# The prefix that should be added to generated table names (only necessary if multiple things are sharing the same database)
DB_TABLE_PREFIX=""

# The port to connect to the database with. Will default to 5432 for PostgreSQL and 3306 for MySQL.
DB_PORT="3306"

以下文件将以与 .env 文件相同的目录输出

Apache .env_apache.txt

将这些粘贴到 <VirtualHost> 块中

# Apache .env variables
# Paste these inside the <VirtualHost> block:
SetEnv    ENVIRONMENT             "local"
SetEnv    SECURITY_KEY            "jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"
SetEnv    DB_DRIVER               "mysql"
SetEnv    DB_SERVER               "localhost"
SetEnv    DB_USER                 "homestead"
SetEnv    DB_PASSWORD             "secret"
SetEnv    DB_DATABASE             "craft3"
SetEnv    DB_SCHEMA               "public"
SetEnv    DB_TABLE_PREFIX         ""
SetEnv    DB_PORT                 "3306"

...或者您可以直接通过以下方式将Dotenvy生成的文件包含到您的Apache conf中

Include /home/forge/SOMEDOMAIN/.env_apache.txt

Nginx .env_nginx.txt

将这些粘贴到 server {}location ~ \.php {} 块中,或在 fastcgi_params 文件中

# Nginx .env variables
# Paste these inside the server {} or location ~ \.php {} block or in the fastcgi_params file:
fastcgi_param    ENVIRONMENT             "local";
fastcgi_param    SECURITY_KEY            "jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7";
fastcgi_param    DB_DRIVER               "mysql";
fastcgi_param    DB_SERVER               "localhost";
fastcgi_param    DB_USER                 "homestead";
fastcgi_param    DB_PASSWORD             "secret";
fastcgi_param    DB_DATABASE             "craft3";
fastcgi_param    DB_SCHEMA               "public";
fastcgi_param    DB_TABLE_PREFIX         "";
fastcgi_param    DB_PORT                 "3306";

...或者您可以直接通过以下方式将Dotenvy生成的文件包含到您的Nginx conf中

include /home/forge/SOMEDOMAIN/.env_nginx.txt

有关详细信息,请参阅 Nginx-Craft

CLI (Bash shell) .env_cli.txt

将这些粘贴到您 $HOME 目录下的 .bashrc 文件中

# CLI (bash) .env variables
# Paste these inside your .bashrc file in your $HOME directory:
export ENVIRONMENT="local"
export SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"
export DB_DRIVER="mysql"
export DB_SERVER="localhost"
export DB_USER="homestead"
export DB_PASSWORD="secret"
export DB_DATABASE="craft3"
export DB_SCHEMA="public"
export DB_TABLE_PREFIX=""
export DB_PORT="3306"

Docker .env_docker.txt

将这些粘贴到您的 Dockerfile 文件中

# Docker .env variables
# Paste these into your Dockerfile
ENV ENVIRONMENT="local"
ENV SECURITY_KEY="jMgCxHuaM1g3qSzHiknTt5S8gDy5BNW7"
ENV DB_DRIVER="mysql"
ENV DB_SERVER="localhost"
ENV DB_USER="homestead"
ENV DB_PASSWORD="secret"
ENV DB_DATABASE="craft3"
ENV DB_SCHEMA="public"
ENV DB_TABLE_PREFIX=""
ENV DB_PORT="3306"

Craft CMS CLI

请注意,如果您直接在Apache或Nginx配置中设置 .env 变量,则这些变量将 无法 通过Craft CMS ./craft CLI命令使用。

这是因为对于CLI请求,web服务器根本不会运行。相反,您需要按照上述说明将它们添加到您的 .bashrc 文件中,或者您可以使用Unix source 命令,例如

source .env_cli.txt && ./craft migrate/all

在上面的示例中,source 命令将执行 .env_cli.txt 中的 export 语句,然后以设置的环境变量运行 ./craft 可执行文件。

如果您在单个实例上运行多个网站,并且通过 .bashrc 为用户全局设置 .env 变量没有意义,这种模式很有用。

Dotenvy 路线图

要完成的事情,以及潜在功能的想法

  • 发布

nystudio107 提供