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


78

我们正在考虑common为实体映射和服务创建自己的捆绑软件,以便在几个单独的应用程序中使用。捆绑软件应该易于修改,运行,包含和测试。我了解有关构建捆绑包的最佳实践的信息,但是我不知道git在开发时使用哪种策略。

我们应该将commonbundle作为一个整体项目创建,然后将整个存储库提交到我们的git服务器,还是最好仅针对commonbundle的根目录启动源代码控制并仅推送其内容?我在上看到了捆绑销售中的这种方法github,但是我不知道以这种方式开发捆绑销售的简便方法。

Answers:


176

创建一个新的空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/

在以下位置初始化您的github存储库 src/Company/DemoBundle

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

app / AppKernel:

new Company\DemoBundle\CompanyDemoBundle(),

在...上下功夫

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

结论

您可以在第一个项目中开发和测试捆绑软件,并在第二个项目中将其与github和composer结合使用。


这是一个很好的一步一步的,但是我建议托管在自己的存储库,以及使用赛帝服务私人依赖关系:getcomposer.org/doc/articles/...
鲍里斯·伽利湖

可以,但是也许他在github中有一个私有存储库。
VBee 2014年

好答案@VBee!几天前,我对同一主题进行了一些研究,但我对使用私有Git存储库或本地存储库(首选)更感兴趣。
Jovan Perovic

@VBee很棒的教程,谢谢!私人仓库不是问题-我们有自己的git服务器。问题是我真的不知道如何使用您的解决方案在团队中开发通用模块。每个开发人员都必须创建一个新sf2项目并将clone其存储src/吗?怎么样composer.lock为主要项目,并用它来保证整个团队的每个库的相同版本?如果您知道执行此操作的有效方法,请将其添加到答案中。谢谢!:)
ex3v 2014年

3
只是一个错字composer.phat应该是composer.phar
斯蒂芬·香槟

16

要知道的重要一点是,您可以从/ vendor提交回购。确实,作曲家为引用该软件包存储库的每个捆绑包(或软件包)创建了一个称为“ composer”的第二个远程对象,以便您可以在工作环境中对其进行操作。因此,好的做法是在所有项目中的composer.json中注册您的包,并/vendor/MyCompany/MyBundle从任何项目中的提交。

作为证明,可以git remote -v从供应商的任何捆绑软件中运行。

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


我正在创建自己的供应商捆绑包。我想将此捆绑包放在GitHub上,并在其他项目中使用它。我应该在启动时/src/vendor目录中还是目录中生成新的Bundle ?当我将此捆绑包包含到其他项目中时,它将存在,/vendor但是在开始时应该在哪里生成它们?
出口196

5
在GitHub中创建一个新的空项目,该项目将存储您的软件包。在其中提交composer.json。您甚至可以提交一个非常简单的composer.json,其中仅包含包的名称和描述。回到您的项目中,向新捆绑包中添加需求,然后执行composer update。现在,您应该在供应商文件夹中看到您的空捆绑包,您可以在其中工作。如果您想让捆绑包公开,请将其添加到Packagist。
flouflou2000

4

在Symfony4中,generate:bundle命令不再可用。相反,您可以按照本教程进行操作

首先使用以下项目创建一个项目:

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.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: ~

就这样。遵循最佳做法并继续编码。

PS:我已经发表了一篇文章,其中包含一些开发Symfony可重用捆绑软件的技巧


顺便说一句,我还创建了一个用于开发可重用捆绑包的项目:github.com/msalsas/symfony-bundle-skeleton
Manolo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.