如何开发和包含一个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"} } 

或(编辑)

如果你真的想添加一个本地包:

  1. 为本地包创build一个composer.json ,如:

     { "name": "localPackage/core", "version": "dev-master" } 

    您也可以根据需要指定其他属性和/或依赖项。

  2. 压缩包,将composer.json文件作为archive.zip的根文件,并将其放在需要的位置。

  3. 在你想包括本地包的其他项目/包中,将本地包名称添加到所需的参数中,例如

     "localPackage/core": "dev-master" 

    repositories参数下添加以下内容:

     "repositories" : [ { "type": "artifact", "url": "path/to/localPackage.zip" } ] 

现在,如果你有git上的本地包,那么就不需要归档包(基本上省略步骤2),只需要将上面例子中的URLreplacepath/to/localPackage/.git

(编辑结束)


现在回答一个更大的问题:“我如何开发和包含一个Composer软件包?”:

  1. 决定目录结构。 通常情况如下:

     /PackageRoot /src/PackageCore composer.json ## this is your library's composer.json LICENSE 

    并build立你的composer.json

    我的composer.json文件的一个例子可以在http://pastebin.com/tyHT01Xgfind。;

  2. 上传到Github并标记版本 。 使用语义版本控制 (确保在上传到Github时排除/忽略vendor目录)。

  3. 用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", ... } 

有关此链接的更多信息(不是由我写的,但对此主题有一个很好的解释):

https://carlosbuenosvinos.com/working-at-the-same-time-in-a-project-and-its-dependencies-composer-and-path-type-repository/

似乎这个线程上的大多数答案是不是“知道”。 我自己对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加上我自己的一个回顾

  1. 在packagist上发布

既然你不想发布,你正在开发,这是一个糟糕的select。

  1. 上传github

您可能不希望在github上发布您的图书馆资源,不想为私人回购付费,或者不能使用云外部服务(由于政策或networking政策)。

  1. 压缩你的图书馆

您可以在您的示例实现中使用composer存储库path来指向本地zip文件作为发行版。 每次更改库时,都必须重新压缩,即使使用batch file,也是如此。

  1. 上传到您的机器上的本地git / svn回购

这是越来越近了,但是每次你改变你的库并且想要testing你的示例实现时,你都需要做一个作曲者更新。 这模仿制作,但是很麻烦。 我个人build议这个解决scheme,即使它不是没有脑子的。

  1. 直接自动加载库(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你的库实现。

  1. 直接在你的库树中添加你的示例实现(推荐)

通常你只需要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程:

  1. 在GitHub上为包创build一个新的存储库(只是一个例子)
  2. 将它添加到Composer的数据库(packagist.org)
  3. 把它添加到你的主要项目通过composer php的要求。 这是你开始想知道如何快速应用修补程序
  4. 将其克隆到本地计算机上,这是您开发它的地方
  5. 现在要testing你的本地版本,在你加载有问题的类文件的地方添加一个php require()语句。 自动加载器将不会加载通过作曲者下载的,而是您本地的。
  6. 完成修补程序后,删除/注释掉require语句以恢复使用该软件包的作曲者版本。
  7. 提交所有更改,标记提交并推送到GitHub; 挂钩触发更新composer php。 在您的主项目上运行composer php更新,包更新到您的本地版本。

这仍然不是理想的,但它为中小型包装完成了工作。

为了使开发更有效率,我简单地将开发库链接到一个已经安装它的目录中。

例如,如果/Code/project-1需要包含在/Code/package-1 ,则I:

  1. package-1提交到GitHub(甚至可以是私有的)。
  2. 然后我告诉project-1使用自定义存储库来安装它(请参阅其他关于存储库configuration链接的答案)。
  3. 一旦它被安装,我符号链接/Code/project-1/vendor/developer/package-1/Code/package-1

这样,当我在/Code/package-1进行更改时,它立即反映在/Code/project-1