如何开发和包含一个Composer软件包?
我正在寻找在PHP中开发一个包,但我不希望它立即可用在GitHub或某处。 在我的composer.json
包含一个Packagist文件是很容易的,但是如何将一个本地包添加到我的composer.json
? 另外,我应该在/vendor/foo/bar
(相对于根composer.json
)中构build软件包,还是应该把它放在别的地方?
编辑 :我想我的问题是关于其他人如何写他们的软件包。 是否每个新软件包都被添加到Packagist中,然后当你想testing你的修改时,你提交给GitHub(或者任何地方),然后通过Composer把它们拉回来? 这看起来效率很低。
由于这个问题有很多不同的组件/标准需要解释,所以我会尽可能地在这里解释一下,你可以PM或者只是在Google上面提出更具体的问题。
要回答您的第一个问题,“如何将本地包添加到我的composer.json
?”:
如果通过“添加本地包”来自动加载你的类/包,可以使用PSR-4或PSR-0或composer php的Classmap选项来实现。
阅读更多
- PSR [petermoulding.com] (通过archive.org )
- PSR-4自动加载支持Composer [seld.be]
- 自动加载机之战:PSR-0与PSR-4 [Sitepoint]
- 为什么使用PSR-0或PSR-4自动加载composer php如果classmap实际上更快? [所以]
如果您需要关于PSR-0,PSR-4和Classmap的更多信息,您可以Google。
例
"autoload": { "psr-4": { "Core\\": "src/Core" } ## "standard": { "namespace" : "path/to/dir"} }
或(编辑)
如果你真的想添加一个本地包:
-
为本地包创build一个
composer.json
,如:{ "name": "localPackage/core", "version": "dev-master" }
您也可以根据需要指定其他属性和/或依赖项。
-
压缩包,将
composer.json
文件作为archive.zip
的根文件,并将其放在需要的位置。 -
在你想包括本地包的其他项目/包中,将本地包名称添加到所需的参数中,例如
"localPackage/core": "dev-master"
在
repositories
参数下添加以下内容:"repositories" : [ { "type": "artifact", "url": "path/to/localPackage.zip" } ]
现在,如果你有git上的本地包,那么就不需要归档包(基本上省略步骤2),只需要将上面例子中的URLreplacepath/to/localPackage/.git
。
(编辑结束)
现在回答一个更大的问题:“我如何开发和包含一个Composer软件包?”:
-
决定目录结构。 通常情况如下:
/PackageRoot /src/PackageCore composer.json ## this is your library's composer.json LICENSE
并build立你的
composer.json
。我的
composer.json
文件的一个例子可以在http://pastebin.com/tyHT01Xgfind。; -
上传到Github并标记版本 。 使用语义版本控制 (确保在上传到Github时排除/忽略
vendor
目录)。 -
用Packagist注册包(login后)。
如果您已将提交标记为
v1.0.0
(或类似),那么将显示在您的Packagist控制面板中。
现在,如果一切正常,您应该可以将其作为其他项目的依赖项,方法是将其添加到该项目的composer.json
中。
不要创build一个新的存储库,你可以告诉composer php使用任何本地path:
https://getcomposer.org/doc/05-repositories.md#path
例如,假设你有~/devel/projects
下的PHP ~/devel/projects
你可能在~/devel/projects/main_project
有你的主项目,在~/devel/projects/local_package
你的“本地包”
为本地包定义你的composer phpconfiguration。 在~/devel/projects/local_package/composer.json
。
{ "name": "your_vendor_id/your_local_package", ... }
然后,您可以编辑~/devel/projects/main_project/composer.json
并通过path回购链接到您的本地包:
"repositories": [ { "type": "path", "url": "../local_package", "options": { "symlink": true } } ], "require": { "your_vendor_id/your_local_package": "dev-master", ... }
有关此链接的更多信息(不是由我写的,但对此主题有一个很好的解释):
似乎这个线程上的大多数答案是不是“知道”。 我自己对composer php是新手,但这些答案是误导性的。 这个问题可以简单地表述为:“我如何开发一个composer php包”。
是的,您可以使用自定义存储库或上传未完成的软件包,并在每次更改后进行更新。 这既不是正确的解决scheme,也不是问题的答案。
Composer的官方文档没有说明这一点,但是您可以在“ 库”文档页面上看到标题:
每个项目都是一个包
这是非常重要的理解
composer.json:
前面提到的页面继续指出:
为了使这个软件包可以安装,你需要给它一个名字。 您可以通过在
composer.json
添加名称属性来完成此操作{ "name": "acme/hello-world", "require": { "monolog/monolog": "1.0.*" } }
在这个例子中,我们有一个必需的包,现在是一个名字。 请注意vendor/name
格式。
所以现在自动加载我们自己的文件,这是在基本用法页面上logging。
{ "autoload": { "psr-4": {"Acme\\": "src/"} } }
这将自动加载src/Acme
目录下的命名空间类文件。
在乐趣上。
安装更新
使用以下命令安装或更新软件包:
composer update
要么
php composer.phar update
这将下载所需的软件包并创buildautoload.php文件
我们的项目结构应该与以下类似:
src Acme Foo.php vendor monolog ... composer.json
包含
现在来testing。
包括autoload.php
require_once 'path/to/project/vendor/autoload.php';
假设Foo.php如下所示:
<?php namespace Acme; class Foo { public static function bar(){ return 'baz'; } } ?>
我们可以从我们的脚本中调用它:
echo Acme\Foo::bar(); // baz
请更正我可能已经陈述的任何误导性信息。 这似乎是一个stream行的问题的解决scheme。
这里是解决scheme加上我自己的一个回顾
- 在packagist上发布
既然你不想发布,你正在开发,这是一个糟糕的select。
- 上传github
您可能不希望在github上发布您的图书馆资源,不想为私人回购付费,或者不能使用云外部服务(由于政策或networking政策)。
- 压缩你的图书馆
您可以在您的示例实现中使用composer存储库path来指向本地zip文件作为发行版。 每次更改库时,都必须重新压缩,即使使用batch file,也是如此。
- 上传到您的机器上的本地git / svn回购
这是越来越近了,但是每次你改变你的库并且想要testing你的示例实现时,你都需要做一个作曲者更新。 这模仿制作,但是很麻烦。 我个人build议这个解决scheme,即使它不是没有脑子的。
- 直接自动加载库(sortof做你想要的)
这是一个黑客,但你可以添加:
{ "require": { }, "autoload": { "psr-4": { "yourlibnamespace": "D:\\Code\\yourlib\\src\\" } }
}
请注意,您需要将lib中的'require'部分复制并粘贴到示例实现中。 将“yourlibnamespace”更改为您的库名称空间,将“D:\ Code \ yourlib \ src \”更改为您的库源的本地path。
这样,任何更改都会立即反映出来。 但是,您将不会使用或testing您的库的composer.json文件。 如果您在库.json中更改了需求,它将根本不会stream通。 所以它有一些很大的缺点,但是做了你想做的事情,那就是尽可能用最less的命令来testing你的库实现。
- 直接在你的库树中添加你的示例实现(推荐)
通常你只需要src \和tests \,但是很多都有例子\,你可以在其中find样例实现。 在开发应用程序时,您可以参与这些示例实现。 你可以在本地的git / svn仓库中做这件事,而且你可以自动获得lib的'require'和名字空间。 这是世界上最好的。 我推荐这种方法。
也许添加一个自定义的存储库将帮助你?
https://github.com/composer/composer/blob/master/doc/05-repositories.md
你可以很容易地设置一个本地的git仓库。
当然,如果你使用composer php来pipe理依赖关系,你应该把你的图书馆build在其他地方,然后把它下载到供应商/通过composer php因为这是我猜的整个点。
这就是我在本地创build和开发一个新的Composer包的stream程:
- 在GitHub上为包创build一个新的存储库(只是一个例子)
- 将它添加到Composer的数据库(packagist.org)
- 把它添加到你的主要项目通过composer php的要求。 这是你开始想知道如何快速应用修补程序
- 将其克隆到本地计算机上,这是您开发它的地方
- 现在要testing你的本地版本,在你加载有问题的类文件的地方添加一个php require()语句。 自动加载器将不会加载通过作曲者下载的,而是您本地的。
- 完成修补程序后,删除/注释掉require语句以恢复使用该软件包的作曲者版本。
- 提交所有更改,标记提交并推送到GitHub; 挂钩触发更新composer php。 在您的主项目上运行composer php更新,包更新到您的本地版本。
这仍然不是理想的,但它为中小型包装完成了工作。
为了使开发更有效率,我简单地将开发库链接到一个已经安装它的目录中。
例如,如果/Code/project-1
需要包含在/Code/package-1
,则I:
- 将
package-1
提交到GitHub(甚至可以是私有的)。 - 然后我告诉
project-1
使用自定义存储库来安装它(请参阅其他关于存储库configuration链接的答案)。 - 一旦它被安装,我符号链接
/Code/project-1/vendor/developer/package-1
到/Code/package-1
。
这样,当我在/Code/package-1
进行更改时,它立即反映在/Code/project-1
。
- Composer安装错误 – 实际启用时需要ext_curl
- 为什么使用PSR-0或PSR-4自动加载composer php如果classmap实际上更快?
- 在我的composer.json文件中代字号(〜)是什么意思?
- 在浏览器中使用PHP脚本运行composer php
- 为什么更新composer php的依赖关系是如此之慢?
- 如何在Composer中正确地要求一个特定的提交,以便它可以用于依赖包?
- 在通过Composer安装Symfony 2.3.x时lib-icu依赖性问题
- 尽pipe–prefer-dist标志,更新composer php依赖关系缓慢
- 如何强制composer php重新安装库?