如何为新的Bundle编写Symfony Flex配方?

16

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

几乎所有文档都指向安装一个使用Symfony Flex的bundle,而不是如何创建一个正在使用它的bundle。

我甚至试图反向工程一些软件包,但同样没有成功。

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

我需要知道的是,在哪里放置这个文件以及会有哪些环境变量(如果有)可用?


1
这不是一个简单的过程。确保它值得你的时间,只为了节省一点配置时间。https://github.com/symfony/recipes/blob/master/README.rst - Cerad
1个回答

29

什么是Flex Recipe?

请注意,Flex Recipe是一个单独的代码仓库,需要与包仓库分开托管,并且需要独立于Bundle包进行托管。

对于大多数公共Bundle/Recipe而言,您需要将Recipe提交到“contrib”仓库,获得批准并合并后,才能作为社区Recipe提供。

此外,请记住,大多数用户默认情况下不会启用contrib仓库。因此,如果安装此Bundle很重要,则在用户安装Recipe之前应告知用户如何启用contrib仓库(例如在Bundle的自述文件中)。

私有Recipes

另一种选择是使用私有Flex Recipe,如此处所述。生成私有Recipe的最简单方法是遵循Symfony的相同步骤。查看此问题及其答案以获取更多详情:如何从Recipe目录的内容生成私有Recipe JSON?


现在,基本上,Flex Recipe就是一个带有特定密钥的manifest.json文件的代码仓库,以启用某些“配置器”。

可用的manifest.json配置器包括:

Bundles

这些应在bundles.php上启用的Bundle。这些将在安装Recipe时添加,然后在卸载Recipe时删除。

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

配置

"configuration" 配置器处理两个键: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的内容将被复制到相应的目录。

这是提供默认配置文件的典型用例。根据您的要求,这是创建flex recipe的目的。

环境变量

此配置程序只是将适当的环境变量值添加到项目的.env.env.dist中。(如果您卸载了该recipe,则这些环境变量也将被删除)

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

Composer脚本

该配置器从项目的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 示例(摘自这里,因为此帖子中的大多数其他示例也是如此):

{
    "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 的文件,则在安装完成时显示其内容。您甚至可以使用此处定义的样式,以获得额外的美观或烦人效果。

示例:

<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中添加在此定义的任务(如果不存在,则创建Makefile)。

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

就是这么简单。我猜大多数包都不需要makefile命令,所以这个比其他配置程序用得少。

你可以在这里阅读完整的文档。


3
谢谢您提供更详细的说明。基本上没有办法将其包含在捆绑包中吗?由于我的软件包是私有的,因此不可能使用Symfony Flex(因为我需要发布配方和可能还需要发布软件包),而无需对项目进行额外的配置。 - HubertNNN
1
谢谢您的澄清。这正是我一直在寻找的。 - user1077915
1
@HubertNNN,你好,我们已经进入了2021年,现在可以为您的私有存储库创建自己的配方!Symfony博客新闻 - Floran
1
是的,@Floran。我正在等待一些时间来更新这个答案,以提到并解释这一点,在5.4/6.0发布之前准备好它。也许明天。 - yivi
@yivi,非常酷!这是一个相当新的功能,因此如果您需要更多的解释,我们将不胜感激。我已经为我的公司设置了自己的私人配方服务器。如果您需要编辑方面的帮助,我会在这里! - Floran
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接