【问题标题】:How does composer know symfony environmentcomposer是如何知道symfony环境的
【发布时间】:2017-04-21 09:18:20
【问题描述】:

我尝试在“集成”环境中部署应用,但在“composer update”命令之后,生成的 parameters.yml 文件不包含可能的集成参数

这是我所做的: 我在 app/config 中创建了一个“config_integ.yml”文件:

# app/config/config_integ.yml
imports:
    - { resource: parameters_integ.yml }
    - { resource: config.yml }

framework:
    profiler: { only_exceptions: false }

parameters_integ.yml 文件包含集成环境的参数。开头的例子:

parameters:
    database_host: localhost
    database_port: null
    database_name: test_integ
    database_user: root

parameters.yml.dist 包含这些具有默认值的参数:

parameters:
    database_host:     127.0.0.1
    database_port:     ~
    database_name:     symfony
    database_user:     root

我如何告诉作曲家使用 parameters_integ.yml 文件来构建 parameter.yml 文件?因为之后我会有一个 prod 环境,所以我不能在 parameters.yml.dist 文件中写入我的参数。

如果您需要其他信息,请告诉我

感谢您的帮助

【问题讨论】:

标签: symfony composer-php


【解决方案1】:

1) 你应该在你的 VCS 中包含 composer.jsoncomposer.lock

2) 您不应在 VCS 中包含 parameters.yml

3) 部署 Sf 应用程序时,您应该使用 composer install

4) 我能想到几种在集成环境中创建 parameters.yml 的方法:

  • 您手动创建 parameters.yml 文件并将其放在 parameters.dist.yml 旁边

  • 如果没有parameters.yml或者parameters.yml缺少一些参数,运行composer install时会提示输入缺少的参数和 parameters.yml 将在 composer 安装 过程中创建/更新

  • 您可以拥有一个 app/config/parameters 文件夹,其中包含 parameters_prod.ymlparameters_integ.yml 文件,其中一个文件是在部署期间自动复制到 parameter.yml 文件中(最复杂的解决方案)

如果您希望通过浏览器访问集成环境,您还应该为其创建一个前端控制器。将 web/app.php 文件复制到 web/app_integ.php 并编辑要集成的环境:

// web/app_integ.php
// ...

// change just this line
$kernel = new AppKernel('integ', false);

// ...

更多信息https://symfony.com/doc/current/configuration/environments.html#creating-a-new-environment


以及标题中问题的答案,“作曲家如何知道 symfony 环境” - 我认为作曲家对 Sf 环境一无所知 :)

作曲家有 require-dev 选项,用于您在生产中不需要的包、运行测试所需的包(例如 phpunit)、开发期间的一些调试内容等。 例如,这是我的 composer.json 文件之一的样子:

...
"require-dev": {
    "sensio/generator-bundle": "^3.0",
    "symfony/phpunit-bridge": "^3.0",
    "doctrine/doctrine-fixtures-bundle": "^2.3",
    "nelmio/alice": "^2.1",
    "deployer/deployer": "^4.0"
},
...

如果我运行composer install --no-dev,这些包将不会安装在供应商目录中。

但是,Sf 是如何知道何时在应用程序中包含/省略某些包的。

这是在 AppKernel.php 中定义的。

composer.json 中,在“require-dev”键下,我定义了我不希望在生产中使用学说装置。

所以,在 AppKernel.php 里面我放了这几行代码:

if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
    ...
    $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
}

如果我在生产模式下运行我的应用程序,就不会有 DoctrineFixturesBundle。

【讨论】:

    【解决方案2】:

    最佳做法是在app/config/parameters.yml.dist 文件中设置默认参数。

    查看此链接: http://symfony.com/doc/current/best_practices/configuration.html#canonical-parameters

    当你运行时:

    composer update
    

    它将使用parameters.yml.dist 并用dist 文件中的值覆盖parameters.yml

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    相关资源
    最近更新 更多