如何开发和包含Composer包?

时间:2013-01-12 16:53:42

标签: php composer-php

我正在寻找用PHP开发一个包,但我不希望它立即在GitHub或某个地方提供。在我的composer.json中包含Packagist文件很容易,但如何在我的composer.json中添加本地包?另外,我应该在/vendor/foo/bar(相对于根composer.json)构建包,还是应该将其放在其他地方?

编辑:我想我的问题是关于其他人如何编写他们的软件包。是否每个新包都添加到Packagist中,然后当您想要测试更改时,您提交GitHub(或任何地方),然后通过Composer将其拉回来?这似乎效率很低。

8 个答案:

答案 0 :(得分:24)

由于这个问题有许多不同的组成部分/标准需要解释,我会尽量在这里解释一下,你可以告诉我或者谷歌它可以提出更具体的问题。

要回答您的第一个问题,“如何在我的composer.json中添加本地包?”:

如果通过“添加本地包”意味着自动加载您的类/包,则可以通过在composer中使用PSR-4或PSR-0或Classmap选项来实现。

了解更多

如果您需要有关PSR-0,PSR-4和Classmap的更多信息,可以谷歌。

实施例

"autoload": {
   "psr-4": { "Core\\": "src/Core" }  ## "standard": { "namespace" : "path/to/dir"}
}

或(编辑)

如果您确实想要添加本地包:

  1. 为本地包创建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"
        }
    ]
    
  4. 现在如果你在git上有本地包,那么就不需要存档包(基本上省略了第2步),你只需要将上面例子中的URL替换为path/to/localPackage/.git。 / p>

    (编辑结束)


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

    1. 确定目录结构。通常如下:

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

      并设置composer.json

      我可以在http://pastebin.com/tyHT01Xg找到我的一个composer.json文件示例。

    2. 将其上传到Githubtag the version。使用Semantic versioning(确保在上传到Github时排除/忽略vendor目录。

    3. 使用Packagist注册包(登录后)。

      如果您已将提交标记为v1.0.0(或类似),则此信息将显示在您的Packagist信息中心中。

    4. 现在,如果一切正常,您应该能够将您的库作为其他项目的依赖项,将其添加到该项目的composer.json

答案 1 :(得分:18)

您可以告诉编写者使用任何本地路径,而不是创建新的存储库:

https://getcomposer.org/doc/05-repositories.md#path

例如,假设您在~/devel/projects

下有PHP项目

您可以将您的主项目放在~/devel/projects/main_project,以及您的"本地包"在~/devel/projects/local_package

定义本地包的composer配置。在~/devel/projects/local_package/composer.json

{
    "name": "your_vendor_id/your_local_package",
    ...
}

然后,您可以修改~/devel/projects/main_project/composer.json并通过路径仓库链接到您的本地包:

"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/

答案 2 :(得分:9)

似乎这个帖子上的大多数答案都不是“知情”。我自己是Composer的新手,但这些答案都是误导性的。问题可以简单地说:“我如何开发作曲家包”。

是的,您可以使用自定义存储库或上传未完成的包,并在每次更改后更新它。这既不是正确的解决方案,也不是问题的答案。

Composer's official documentation未提前说明这一点没有帮助,但您可以在Libraries documentation page上看到标题:

  

每个项目都是一个包

理解这一点非常重要

composer.json:

前面提到的页面继续说明:

  

为了使该软件包可安装,您需要为其命名。您可以通过在composer.json

中添加name属性来执行此操作
{
    "name": "acme/hello-world",
    "require": {
        "monolog/monolog": "1.0.*"
    }
}

到目前为止,在这个例子中,我们有一个必需的包,现在是一个名字。请注意 vendor/name 格式。

现在要自动加载我们自己的文件,这些文件记录在Basic usage页面上。

{
    "autoload": {
        "psr-4": {"Acme\\": "src/"}
    }
}

这将自动加载src/Acme目录下的命名空间类文件。

开心了。

安装/更新

使用以下命令安装或更新软件包:

composer update

php composer.phar update

这将下载所需的包并创建autoload.php文件

我们的项目结构应与以下内容类似:

src
    Acme
        Foo.php
vendor
    monolog
        ...
composer.json

包括

现在进行测试。

包括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

请更正我可能声明的任何误导性信息。这似乎是一个流行问题的解决方案。

答案 3 :(得分:7)

这里是解决方案和我自己的

的概述
  1. 发布于packagist
  2. 由于您还没有想要发布,您还处于开发阶段,这是一个不好的选择。

    1. 上传github
    2. 您可能不希望在github上发布您的图书馆资源,不想支付私人资源,或者能够使用云外部服务(由于政治或网络政策)。

      1. 压缩您的图书馆
      2. 您可以使用示例实现中的composer存储库路径指向本地zip文件作为发行版。每次对lib进行更改时都必须重新压缩,即使使用批处理文件也是如此,这很icky。

        1. 上传到您计算机上的本地git / svn repo
        2. 这已经接近了,但是每次更改库并且想要测试示例实现时,您都需要更新作曲家。这模仿制作,但很麻烦。我个人推荐这个解决方案,即使它没有脑子。

          1. 直接自动加载库(sortof做你想要的)
          2. 这是一个黑客,但你可以添加:

            {    
              "require": {
              },
              "autoload": {
                "psr-4": { 
                  "yourlibnamespace": "D:\\Code\\yourlib\\src\\" 
                }
              }
            

            }

            请注意,您需要复制+粘贴&#39;要求&#39;从lib到示例实现的部分。更改&#39; yourlibnamespace&#39;到您的库名称空间和&#34; D:\ Code \ yourlib \ src \&#34;到您的图书馆来源的本地路径。

            这样可以立即反映任何变化。但是,您根本不会使用或测试库的composer.json文件。如果您更改了库中的要求.json它根本不会流过。所以它有一些很大的缺点,但它确实做你想要的,即用最少的命令立即测试你的库实现。

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

              通常你只有src \和tests \,但是很多都有例子\你可以在哪里找到样例实现。在开发应用程序时,您可以为这些示例实现做出贡献。您可以在本地git / svn repo中执行此操作,并且您可以自动获取lib&#39; require&#39;以及命名空间。这是世界上最好的。我推荐这种方法。

答案 4 :(得分:5)

也许添加自定义存储库会对您有所帮助吗?

https://github.com/composer/composer/blob/master/doc/05-repositories.md

您可以非常轻松地在您的库中设置本地git存储库。

当然,如果您使用composer来管理依赖项,您应该在其他地方构建您的库并将其下载到vendor / via composer coz这是我猜的全部观点。

答案 5 :(得分:5)

为了提高开发效率,我只需将开发存储库符号链接到已经安装它的目录中。

例如,如果/Code/project-1需要/Code/package-1中的包,我:

  1. package-1提交给GitHub(甚至可以是私有的)。
  2. 然后我告诉project-1使用自定义存储库安装它(请参阅存储库配置链接的其他答案)。
  3. 安装完成后,我将/Code/project-1/vendor/developer/package-1符号链接到/Code/package-1
  4. 这样,当我在/Code/package-1中进行更改时,它会立即反映在/Code/project-1中。

答案 6 :(得分:5)

这是我在本地创建和开发新的Composer包的过程:

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

答案 7 :(得分:0)

我的工作流程并未完全回答OP的问题,但可能对其他人有所帮助。

  1. 我喜欢在现实世界的项目中开发可重用的包/ lib,我不想在本地通过git / composer。
  2. 与制作相比,我也不喜欢本地加载包(例如通过本地需要声明或本地作曲家设置)。
  3. 所以我的工作很简单:我直接在供应商目录下添加软件包,或直接或使用符号链接。

    缺点

    1. 使用composer update / install时,您的包可能会被覆盖。 (所以我倾向于在此期间逐个更新或添加依赖项。)
    2. 如果不小心,在生产环境中安装composer可能会安装不同的版本。所以继续推送你的包和版本标签!!
    3. 更改软件包的依赖项并通过composer update将其加载到父项目中,覆盖软件包的文件夹