Symfony3 - 创建基于供应商的包

Symfony3 - creating a vendor-based bundle

我们想创建一个可以通过 composer/packagist 部署的包供其他人使用。它将包装由 MessageBird 的所有者创建的逻辑。基本上是一种服务,确实会通过 ourvendor.messagebird.messaging.

与容器一起调用

由于它是一种捆绑包(根据 Sf3 的文档),我们在遵循文档的同时创建了一个捆绑包: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_bundle.html

我们使用 /vendor 作为目录 /src。就在那时,一切都出了问题。我们的命名空间无法定位、加载,甚至当我们手动将其添加到 Composer 的自动加载 classes 时,它仍然失败。

问题是,解决此问题的最佳做法是什么?我们现在让它工作了,我们做了以下事情:

  1. 我们使用以下命令创建了一个包:
    • bin/console generate:bundle --shared --namespace=OurVendor/MessageBird/MessageBirdBundle --bundle-name=MessageBirdBundle --format=yml
  2. 我们将 /src/OurVendor 目录移动到 /vendor/OurVendor,因为获得完美生成的唯一方法是使用默认的 /src 文件夹。
  3. 我们手动更新了 AppKernel.php
  4. 我们对 Composer 的命名空间进行了一些调试,但最终我们将 "OurVendor\":"vendor/" 添加到根 composer.json
  5. 中的 "autoload/psr-4" 指令中
  6. 我们运行composer dumpautoload && bin/console cache:clear -e dev导致错误。
  7. 我们 运行 composer -o update 检查所有依赖项并相应更新,包括自动生成的自动加载文件
  8. St运行我们不得不将 Bundle 添加到 AppKernel.php class 并再次清理缓存。

在所有这一切之后,它起作用了,但文档没有说开发第 3 方供应商捆绑包。 http://symfony.com/doc/current/bundles/best_practices.html

长话短说,我们是走错了路还是怎么了?

/vendor 目录由 composer 管理。不要 copy/move 那里有任何东西。除非您了解所有后果,否则甚至不要在那里编辑任何内容。

创建共享包时,需要将其推送到您选择的 VCS,并将其作为依赖项添加到使用它的项目的 composer.json 中。

当您 运行 composer update 时,它会将您的包检出到 /vendor 目录并生成正确的自动加载文件。

请阅读更多how to use private repositories with composer