如何为新捆绑包编写 Symfony Flex 配方?

How write a Symfony Flex recipe for a new bundle?

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

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

我什至尝试对某些软件包进行逆向工程,但还是失败了。

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

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

什么是 Flex 食谱?

请记住,flex 配方是来自您的包存储库的单独存储库,需要与 Bundle 包分开托管。

在最有可能的情况下,您是 public bundle/recipe,您必须将您的食谱提交给 "contrib" repository,获得批准并合并,以便可用作为社区食谱。

此外,重要的是要记住大多数用户默认情况下不会启用贡献存储库。因此,如果这对于安装此捆绑包很重要,您 应该在用户安装您的食谱 之前告诉他们如何操作(例如,在您的捆绑包的 自述文件 文件)。

私人食谱

另一种选择是使用私有 Flex 配方,如 here. The easiest way to generate a private recipe is to follow the same steps that Symfony does. Check this question and its answers for more details: How to generate a private recipe JSON from the contents of a recipe directory?

所述

除此之外:基本上,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%config的内容而食谱包上的src会复制到对应的目录下。

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

环境变量

此配置器只是将适当的环境变量值添加到项目的 .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 命令(symfony-cmd,通过 bin/console 执行)。

Gitignore

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

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

manifest.json 的完整示例(从 here 中提取,与此 post 上的大多数其他示例一样):

{
    "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-安装输出。

如果食谱包中存在名为 post-install.txt 的文件,安装完成后会显示其内容。您甚至可以使用样式 as defined here,以获得额外的 prettiness/obnoxiousness.

示例:

<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