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

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

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

【问题讨论】:

    标签: php git symfony bundle


    【解决方案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发表了一篇文章。

    【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 2017-02-20
    • 2016-04-06
    • 2015-03-26
    • 1970-01-01
    相关资源
    最近更新 更多