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 策略的主要内容,如果未能解决你的问题,请参考以下文章
是否可以共享 Symfony2 安装(一台服务器上的多个网站 [域])
Symfony2,AWS Beanstalk:如何将供应商作为文件而不是 git-submodules 推送到 repo