【问题标题】:How write a Symfony Flex recipe for a new bundle?如何为新包编写 Symfony Flex 配方?
【发布时间】:2019-10-28 16:49:45
【问题描述】:

我试图找到任何有关使用 Symfony Flex 的文档,但到目前为止没有运气。

几乎所有文档都指向安装使用 symfony Flex 的包,而不是如何创建使用它的包。

我什至尝试对一些软件包进行逆向工程,但同样没有运气。

我的目标是在config/packages/my_bundle.yaml 中为我的包生成一个默认配置文件。

我需要知道的是我需要把它放在哪里以及我可以使用哪些环境变量(如果有的话)?

【问题讨论】:

标签: php symfony symfony4 symfony-flex


【解决方案1】:

什么是弹性配方?

请记住,flex 配方是与您的包存储库独立的存储库,需要托管在 Flex 服务器上。该过程使食谱对第三方捆绑包(IMO)的用处大大降低。对于“官方”Symfony 食谱来说,它非常简洁,但对于其他用户来说就不是那么好了。

很可能,您必须将您的食谱提交到contrib repository,获得批准并合并,以便它可以作为社区食谱使用。 (另一种选择是self-hosted Flex server,但这仅在测试配方时有用,如有必要)。

此外,请务必记住,大多数用户默认情况下不会启用 contrib 存储库。因此,如果这对于安装此捆绑包很重要,您应在用户安装您的配方之前告诉他们如何执行此操作(例如,在捆绑包的 readme 文件中)。

除此之外:基本上,Flex 配方是一个存储库,其中包含一个 manifest.json 文件,其中包含用于启用某些“配置器”的特定密钥。

可用的manifest.json 配置器是:

捆绑

应在bundles.php 上启用哪些捆绑包。这些在安装配方时添加,并在卸载配方时删除。

{
    "bundles": {
        "Symfony\\Bundle\\DebugBundle\\DebugBundle": ["dev", "test"],
        "Symfony\\Bundle\\MonologBundle\\MonologBundle": ["all"]
    }
}

配置

“配置”配置器处理两个键:copy-from-recipecopy-from-package。第一个可以从 recipe 存储库中复制文件,第二个可以从 package 存储库中复制文件。

{
    "copy-from-package": {
        "bin/check.php": "%BIN_DIR%/check.php"
    },
    "copy-from-recipe": {
        "config/": "%CONFIG_DIR%/",
        "src/": "%SRC_DIR%/"
    }
}

在本例中,中的一个文件bin/check.php将被复制到项目%BIN_DIR%中,同时复制配方包上configsrc的内容对应的目录。

例如,这是提供默认配置文件的典型用例。根据您的要求,这是您想要创建弹性配方的既定目的。

环境变量

此配置器只是将适当的环境变量值添加到项目的.env.env.dist。 (同样,如果您卸载了配方,这些将被删除)

{
    "env": {
        "APP_ENV": "dev",
        "APP_DEBUG": "1"
    }
}

作曲家脚本

此配置器将任务从项目的​​ composer.json 添加到 scripts:auto-scripts 数组。 auto-scripts 是每次在项目中执行composer updatecomposer install 时执行的任务。

{
    "composer-scripts": {
        "vendor/bin/security-checker security:check": "php-script",
        "make cache-warmup": "script",
        "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd"
    }
}

每行的第二部分指定它是什么类型命令:一个普通的 PHP 脚本 (php-script)、一个 shell 脚本 (script) 或一个 Symfony 命令 (@987654349 @,通过bin/console执行)。

Gitignore

这会将条目添加到项目的 .gitignore 文件中。

{
    "gitignore": [
        "/phpunit.xml"
    ]
}

manifest.json 的完整示例(取自 here,与本文中的大多数其他示例一样):

{
    "bundles": {
        "Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle": ["all"]
    },
    "copy-from-recipe": {
        "config/": "%CONFIG_DIR%/",
        "public/": "%PUBLIC_DIR%/",
        "src/": "%SRC_DIR%/"
    },
    "composer-scripts": {
        "make cache-warmup": "script",
        "assets:install --symlink --relative %PUBLIC_DIR%": "symfony-cmd"
    },
    "env": {
        "APP_ENV": "dev",
        "APP_DEBUG": "1",
        "APP_SECRET": "%generate(secret)%"
    },
    "gitignore": [
        ".env",
        "/public/bundles/",
        "/var/",
        "/vendor/"
    ]
}

其他配置器

有两个配置器不依赖manifest.json 文件:

安装后输出。

如果配方的包中存在名为post-install.txt 的文件,则安装完成时会显示其内容。您甚至可以使用样式as defined here,以获得额外的漂亮/讨厌。

例子:

<bg=green;fg=white>                </>
<bg=green;fg=white> Much success!! </>
<bg=green;fg=white>                </>

  * <fg=yellow>Next steps:</>
    1. Foo
    2. <comment>bar</>;
    3. Baz <comment>https://example.com/</>.

这将在安装完成后呈现给用户。

生成文件

如果配方的存储库中存在名为 Makefile 的文件,则此处定义的任务将添加到项目的 Makefile 中(如果 Makefile 不存在,则创建它)。

cache-clear:
    @test -f bin/console && bin/console cache:clear --no-warmup || rm -rf var/cache/*
.PHONY: cache-clear

就这么简单。我猜大多数包都不需要 makefile 命令,所以它的使用会比其他配置器少得多。

您可以阅读完整的文档here

【讨论】:

  • 感谢您的详细描述。所以基本上没有办法将它包含在包本身中?而且由于我的包是私有包,因此无法使用 symfony flex(因为我需要发布配方,可能还需要发布包),而不必首先对项目进行额外配置。
  • 感谢或澄清。这是我一直在寻找的。​​span>
  • 很遗憾这种文档是在 Stack Overflow 上找到的,而不是在实际的 Symfony 文档中。这就是公司资金对您的开源项目所做的事情,他们将其混为一谈。不过感谢您的总结!
  • @HubertNNN,你好,我们在 2021 年,现在可以为你的私人存储库做你自己的食谱?! Symfony Blog news
  • 是的,@Floran。我正在等待一些时间来更新这个答案以提及和解释这一点,以便在 5.4/6.0 发布之前准备好它。也许明天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2011-05-09
  • 2021-10-04
  • 2015-06-25
  • 2013-09-29
相关资源
最近更新 更多