Symfony2 - 创建自己的供应商包 - 项目和 git 策略

Posted

技术标签:

【中文标题】Symfony2 - 创建自己的供应商包 - 项目和 git 策略【英文标题】:Symfony2 - creating own vendor bundle - project and git strategy 【发布时间】:2014-02-26 17:02:41 【问题描述】:

我们正在考虑为实体映射和服务创建自己的 common 捆绑包,以便在几个单独的应用程序中使用。一个包应该易于修改、运行、包含和测试。我知道Best Practices for Structuring Bundles,但我不知道在开发时使用什么git 策略。

我们应该将common 包创建为一个完整的项目并将整个存储库提交到我们的git 服务器,还是只为common 包的根目录启动源代码控制并仅推送其内容更好?我在 github 上的捆绑包中看到了这种方法,但我不知道以这种方式开发捆绑包的简单舒适的方法。

【问题讨论】:

【参考方案1】:

新建一个空的 symfony 项目

php composer.phar create-project symfony/framework-standard-edition demo/ 2.4.1
cd demo

生成一个新的捆绑包

(例如src/Company/DemoBundle

php app/console generate:bundle
cd src/Company/DemoBundle/

src/Company/DemoBundle中初始化你的github仓库

git init
touch README.md
git add .
git commit -m "initial commit"
git remote add origin https://github.com/YourAccount/DemoBundle.git
git push -u origin master

添加 composer.json 文件

src/Company/DemoBundle/composer.json:


    "name" : "company/demobundle",
    "description" : "A demo bundle",
    "type" : "symfony-bundle",
    "authors" : [
        "name" : "demo",
        "email" : "demo@company.com"
    ],
    "keywords" : [
        "demo bundle"
    ],
    "license" : [
        "MIT"
    ],
    "require" : 
    ,
    "autoload" : 
        "psr-0" : 
            "Company\\DemoBundle" : ""
        
    ,
    "target-dir" : "Company/DemoBundle",
    "repositories" : [
    ],
    "extra" : 
    "branch-alias" : 
            "dev-master" : "some_version-dev"
        
    

现在你有了你的包的基本结构

在其他项目中使用

composer.json:

    [...]
    "require" : 
        [...]
        "company/demobundle" : "dev-master"
    ,
    "repositories" : [
        "type" : "vcs",
        "url" : "https://github.com/Company/DemoBundle.git"
    ],
    [...]

做:

curl -sS https://getcomposer.org/installer | php
php composer.phar update company/demobundle

应用/应用内核:

new Company\DemoBundle\CompanyDemoBundle(),

继续努力

您可以在src/Company 文件夹中克隆您的DemoBundle,然后手动安装它 您可以使用符号链接

结论

您可以在您的第一个项目中开发和测试您的包,并在您的第二个项目中将它与 github 和 composer 一起使用。

【讨论】:

这是一个很好的循序渐进的步骤,但是我建议托管在它自己的存储库上以及使用 Satis 来服务私有依赖项:getcomposer.org/doc/articles/… 当然,但也许他在 github 上有一个私有存储库。 很好的答案@VBee!几天前我对同一主题进行了一些研究,但我对使用私有 Git 存储库或本地存储库(首选)更感兴趣。 @VBee 很棒的教程,谢谢!私人仓库不是问题——我们有自己的 git 服务器。问题是我真的不知道如何使用您的解决方案在团队中开发通用模块。每个开发人员都必须创建新的 sf2 项目和 clone 这个 repo 到 src/ 吗? composer.lock 用于主项目并使用它来确保团队中每个库的版本相同?如果您知道这样做的好方法,请将其添加到您的答案中。谢谢! :) 只是一个错字 composer.phat 应该是 composer.phar【参考方案2】:

要知道的重要一点是,您可以从 /vendor 提交到您的 repo。实际上,composer 会为每个引用包的 repo 的包(或包)创建一个名为“composer”的第二个遥控器,以便您可以在工作环境中处理它。 因此,好的做法是在您的所有项目的 composer.json 中注册您的包,并从您的 /vendor/MyCompany/MyBundle 提交,从任何项目。

作为证明,只需从供应商的任何捆绑包中运行 git remote -v

不好的做法是将您的捆绑软件视为一个单独的项目并带有符号链接。这是不好的做法的主要原因是您将无法使用您的包声明依赖关系。此外,您在部署项目时会遇到一些困难。

【讨论】:

我正在创建自己的供应商捆绑包。例如,我想将此捆绑包放在 GitHub 上并在其他项目中使用它。我应该在开始时在/src/vendor 目录中生成新的Bundle?当我将此 Bundle 包含到其他项目中时,它将位于 /vendor 但我应该在哪里生成它们? 在 GitHub 中创建一个新的空项目来存储你的包。在其中提交一个 composer.json。你甚至可以提交一个非常简单的 composer.json,只有你的包的名称和描述。回到您的项目中,向您的新包添加一个需求并执行composer update。现在您应该在供应商文件夹中看到您的空包,您可以在其中工作。如果您希望您的捆绑包是公开的,请将其添加到 Packagist。【参考方案3】:

在 Symfony4 中,generate:bundle 命令不再可用。相反,您可以关注this tutorial。

首先创建一个项目:

composer create-project symfony/website-skeleton my-project

然后,创建一个my-project/lib/AcmeFooBundle/src 目录。这里将住你的包。这个目录的命名空间是Acme\AcmeFooBundle,所以如果你在lib/AcmeFooBundle/src/Service/Foo.php创建一个服务类,它的命名空间就是Acme\AcmeFooBundle\Service

现在我们需要告诉 composer autoloader 在那个新目录中寻找新的类,所以我们需要编辑 composer.json autoload 部分:

"autoload": 
    "psr-4": 
        "Acme\\AcmeFooBundle\\": "lib/AcmeFooBundle/src/",
    
, 

然后运行composer dump-autoload

现在你只需要将你的bundle类添加到config/bundles.php

return [
    ...
    Acme\AcmeFooBundle\AcmeFooBundle::class => ['all' => true],
];

和依赖注入从你的包中加载配置。

如果你想在添加依赖注入之前检查你的服务,你可以在config/services.yml自动装配它们:

services:
    ...
    Acme\AcmeFooBundle\Services\Foo: ~

就是这样。关注best practices,继续编码。

PS:我已经用a few tips for developing Symfony reusable bundles发表了一篇文章。

【讨论】:

顺便说一句,我还创建了一个用于开发可重用包的项目:github.com/msalsas/symfony-bundle-skeleton

以上是关于Symfony2 - 创建自己的供应商包 - 项目和 git 策略的主要内容,如果未能解决你的问题,请参考以下文章

Symfony - 如何覆盖不在捆绑包中的供应商组件

是否可以共享 Symfony2 安装(一台服务器上的多个网站 [域])

Symfony2,AWS Beanstalk:如何将供应商作为文件而不是 git-submodules 推送到 repo

如何在 Symfony2 中制作高级 ACL?

当供应商在 Symfony 2.1 中不受作曲家管理时,在哪里注册自动加载?

Symfony2 包继承丢失父包路由